mirror of
https://github.com/hashcat/hashcat.git
synced 2024-11-21 23:58:07 +00:00
Merge branch 'master' into update_deps_lzma
This commit is contained in:
commit
6bf5959b23
6
BUILD.md
6
BUILD.md
@ -3,7 +3,7 @@ hashcat build documentation
|
||||
|
||||
### Revision ###
|
||||
|
||||
* 1.5
|
||||
* 1.6
|
||||
|
||||
### Author ###
|
||||
|
||||
@ -61,6 +61,10 @@ Otherwise:
|
||||
- Cached kernels go to: $HOME/.cache/hashcat
|
||||
- Potfiles go to: $HOME/.local/share/hashcat/
|
||||
|
||||
### Building hashcat for Windows (using macOS) ###
|
||||
|
||||
Refer to [BUILD_macOS.md](BUILD_macOS.md)
|
||||
|
||||
### Building hashcat for Windows (using Windows Subsystem for Linux) ###
|
||||
|
||||
Refer to [BUILD_WSL.md](BUILD_WSL.md)
|
||||
|
27
BUILD_macOS.md
Normal file
27
BUILD_macOS.md
Normal file
@ -0,0 +1,27 @@
|
||||
# Compiling hashcat for Windows with macOS.
|
||||
|
||||
Tested on macOS 12.6.6 M1.
|
||||
|
||||
Make sure to have the HomeBrew upgraded.
|
||||
|
||||
### Installation ###
|
||||
|
||||
```
|
||||
brew install mingw-w64
|
||||
git clone https://github.com/hashcat/hashcat
|
||||
git clone https://github.com/win-iconv/win-iconv
|
||||
cd win-iconv/
|
||||
patch < ../hashcat/tools/win-iconv-64.diff
|
||||
sudo make install
|
||||
cd ../
|
||||
```
|
||||
|
||||
### Building ###
|
||||
|
||||
You've already cloned the latest master revision of hashcat repository above, so switch to the folder and type "make win" to start compiling hashcat
|
||||
```
|
||||
cd hashcat/
|
||||
make win
|
||||
```
|
||||
|
||||
The process may take a while, please be patient.
|
@ -1317,6 +1317,16 @@ DECLSPEC u64x hc_swap64 (const u64x v)
|
||||
asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.sf) : "r"(tr.sf), "r"(tl.sf));
|
||||
#endif
|
||||
|
||||
#elif defined IS_METAL
|
||||
|
||||
const u32x a0 = h32_from_64 (v);
|
||||
const u32x a1 = l32_from_64 (v);
|
||||
|
||||
u32x t0 = hc_swap32 (a0);
|
||||
u32x t1 = hc_swap32 (a1);
|
||||
|
||||
r = hl32_to_64 (t1, t0);
|
||||
|
||||
#else
|
||||
|
||||
#if defined USE_BITSELECT && defined USE_ROTATE
|
||||
@ -1380,7 +1390,19 @@ DECLSPEC u64 hc_swap64_S (const u64 v)
|
||||
asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr) : "r"(ir));
|
||||
|
||||
asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(tr), "r"(tl));
|
||||
|
||||
#elif defined IS_METAL
|
||||
|
||||
const u32 v0 = h32_from_64_S (v);
|
||||
const u32 v1 = l32_from_64_S (v);
|
||||
|
||||
u32 t0 = hc_swap32_S (v0);
|
||||
u32 t1 = hc_swap32_S (v1);
|
||||
|
||||
r = hl32_to_64_S (t1, t0);
|
||||
|
||||
#else
|
||||
|
||||
#ifdef USE_SWIZZLE
|
||||
r = as_ulong (as_uchar8 (v).s76543210);
|
||||
#else
|
||||
|
@ -112,6 +112,15 @@ typedef u64 u64x;
|
||||
|
||||
#if defined IS_CUDA || defined IS_HIP
|
||||
|
||||
#ifndef __device_builtin__
|
||||
#define __device_builtin__
|
||||
#endif
|
||||
|
||||
#ifndef __builtin_align__
|
||||
#define __builtin_align__(x)
|
||||
#endif
|
||||
|
||||
|
||||
#if VECT_SIZE == 2
|
||||
|
||||
struct __device_builtin__ __builtin_align__(2) u8x
|
||||
|
@ -217,7 +217,7 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_RULES ())
|
||||
| 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;
|
||||
@ -226,7 +226,7 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_RULES ())
|
||||
w3[1] = 0;
|
||||
w3[2] = 32 * 8;
|
||||
w3[3] = 0;
|
||||
|
||||
|
||||
a = MD5M_A;
|
||||
b = MD5M_B;
|
||||
c = MD5M_C;
|
||||
@ -617,7 +617,7 @@ KERNEL_FQ void m03610_s04 (KERN_ATTR_RULES ())
|
||||
| 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;
|
||||
@ -631,7 +631,7 @@ KERNEL_FQ void m03610_s04 (KERN_ATTR_RULES ())
|
||||
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);
|
||||
|
@ -282,7 +282,7 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_BASIC ())
|
||||
w3[1] = 0;
|
||||
w3[2] = 32 * 8;
|
||||
w3[3] = 0;
|
||||
|
||||
|
||||
a = MD5M_A;
|
||||
b = MD5M_B;
|
||||
c = MD5M_C;
|
||||
|
@ -202,7 +202,7 @@ DECLSPEC void m03610m (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w
|
||||
w3_t[1] = 0;
|
||||
w3_t[2] = 32 * 8;
|
||||
w3_t[3] = 0;
|
||||
|
||||
|
||||
a = MD5M_A;
|
||||
b = MD5M_B;
|
||||
c = MD5M_C;
|
||||
|
@ -327,6 +327,9 @@ KERNEL_FQ void m08900_init (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
#if defined IS_CUDA || defined IS_HIP
|
||||
const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#elif defined IS_METAL
|
||||
const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#else
|
||||
const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]);
|
||||
@ -357,6 +360,11 @@ KERNEL_FQ void m08900_init (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#elif defined IS_METAL
|
||||
X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#else
|
||||
X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
@ -467,6 +475,11 @@ KERNEL_FQ void m08900_comp (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#elif defined IS_METAL
|
||||
T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#else
|
||||
T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
|
@ -357,54 +357,98 @@ KERNEL_FQ void m13772_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t))
|
||||
|
||||
streebog512_hmac_update_global_swap (&streebog512_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, 64);
|
||||
|
||||
for (u32 i = 0, j = 1; i < 16; i += 8, j += 1)
|
||||
{
|
||||
streebog512_hmac_ctx_t streebog512_hmac_ctx2 = streebog512_hmac_ctx;
|
||||
u32 i = 0;
|
||||
u32 j = 1;
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
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;
|
||||
streebog512_hmac_ctx_t streebog512_hmac_ctx_v1 = streebog512_hmac_ctx;
|
||||
|
||||
streebog512_hmac_update_64 (&streebog512_hmac_ctx2, w0, w1, w2, 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;
|
||||
|
||||
streebog512_hmac_final (&streebog512_hmac_ctx2);
|
||||
streebog512_hmac_update_64 (&streebog512_hmac_ctx_v1, w0, w1, w2, w3, 4);
|
||||
|
||||
tmps[gid].dgst[i + 0] = streebog512_hmac_ctx2.opad.h[0];
|
||||
tmps[gid].dgst[i + 1] = streebog512_hmac_ctx2.opad.h[1];
|
||||
tmps[gid].dgst[i + 2] = streebog512_hmac_ctx2.opad.h[2];
|
||||
tmps[gid].dgst[i + 3] = streebog512_hmac_ctx2.opad.h[3];
|
||||
tmps[gid].dgst[i + 4] = streebog512_hmac_ctx2.opad.h[4];
|
||||
tmps[gid].dgst[i + 5] = streebog512_hmac_ctx2.opad.h[5];
|
||||
tmps[gid].dgst[i + 6] = streebog512_hmac_ctx2.opad.h[6];
|
||||
tmps[gid].dgst[i + 7] = streebog512_hmac_ctx2.opad.h[7];
|
||||
streebog512_hmac_final (&streebog512_hmac_ctx_v1);
|
||||
|
||||
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].dgst[i + 0] = streebog512_hmac_ctx_v1.opad.h[0];
|
||||
tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v1.opad.h[1];
|
||||
tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v1.opad.h[2];
|
||||
tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v1.opad.h[3];
|
||||
tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v1.opad.h[4];
|
||||
tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v1.opad.h[5];
|
||||
tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v1.opad.h[6];
|
||||
tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v1.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];
|
||||
|
||||
i=8;
|
||||
j=2;
|
||||
|
||||
streebog512_hmac_ctx_t streebog512_hmac_ctx_v2 = streebog512_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;
|
||||
|
||||
streebog512_hmac_update_64 (&streebog512_hmac_ctx_v2, w0, w1, w2, w3, 4);
|
||||
|
||||
streebog512_hmac_final (&streebog512_hmac_ctx_v2);
|
||||
|
||||
tmps[gid].dgst[i + 0] = streebog512_hmac_ctx_v2.opad.h[0];
|
||||
tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v2.opad.h[1];
|
||||
tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v2.opad.h[2];
|
||||
tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v2.opad.h[3];
|
||||
tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v2.opad.h[4];
|
||||
tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v2.opad.h[5];
|
||||
tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v2.opad.h[6];
|
||||
tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v2.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_FQ void m13772_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t))
|
||||
|
@ -422,54 +422,142 @@ KERNEL_FQ void m13773_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t))
|
||||
|
||||
streebog512_hmac_update_global_swap (&streebog512_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, 64);
|
||||
|
||||
for (u32 i = 0, j = 1; i < 24; i += 8, j += 1)
|
||||
{
|
||||
streebog512_hmac_ctx_t streebog512_hmac_ctx2 = streebog512_hmac_ctx;
|
||||
u32 i = 0;
|
||||
u32 j = 1;
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
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;
|
||||
streebog512_hmac_ctx_t streebog512_hmac_ctx_v1 = streebog512_hmac_ctx;
|
||||
|
||||
streebog512_hmac_update_64 (&streebog512_hmac_ctx2, w0, w1, w2, 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;
|
||||
|
||||
streebog512_hmac_final (&streebog512_hmac_ctx2);
|
||||
streebog512_hmac_update_64 (&streebog512_hmac_ctx_v1, w0, w1, w2, w3, 4);
|
||||
|
||||
tmps[gid].dgst[i + 0] = streebog512_hmac_ctx2.opad.h[0];
|
||||
tmps[gid].dgst[i + 1] = streebog512_hmac_ctx2.opad.h[1];
|
||||
tmps[gid].dgst[i + 2] = streebog512_hmac_ctx2.opad.h[2];
|
||||
tmps[gid].dgst[i + 3] = streebog512_hmac_ctx2.opad.h[3];
|
||||
tmps[gid].dgst[i + 4] = streebog512_hmac_ctx2.opad.h[4];
|
||||
tmps[gid].dgst[i + 5] = streebog512_hmac_ctx2.opad.h[5];
|
||||
tmps[gid].dgst[i + 6] = streebog512_hmac_ctx2.opad.h[6];
|
||||
tmps[gid].dgst[i + 7] = streebog512_hmac_ctx2.opad.h[7];
|
||||
streebog512_hmac_final (&streebog512_hmac_ctx_v1);
|
||||
|
||||
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].dgst[i + 0] = streebog512_hmac_ctx_v1.opad.h[0];
|
||||
tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v1.opad.h[1];
|
||||
tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v1.opad.h[2];
|
||||
tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v1.opad.h[3];
|
||||
tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v1.opad.h[4];
|
||||
tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v1.opad.h[5];
|
||||
tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v1.opad.h[6];
|
||||
tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v1.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];
|
||||
|
||||
i = 8;
|
||||
j = 2;
|
||||
|
||||
streebog512_hmac_ctx_t streebog512_hmac_ctx_v2 = streebog512_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;
|
||||
|
||||
streebog512_hmac_update_64 (&streebog512_hmac_ctx_v2, w0, w1, w2, w3, 4);
|
||||
|
||||
streebog512_hmac_final (&streebog512_hmac_ctx_v2);
|
||||
|
||||
tmps[gid].dgst[i + 0] = streebog512_hmac_ctx_v2.opad.h[0];
|
||||
tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v2.opad.h[1];
|
||||
tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v2.opad.h[2];
|
||||
tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v2.opad.h[3];
|
||||
tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v2.opad.h[4];
|
||||
tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v2.opad.h[5];
|
||||
tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v2.opad.h[6];
|
||||
tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v2.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];
|
||||
|
||||
i = 16;
|
||||
j = 3;
|
||||
|
||||
streebog512_hmac_ctx_t streebog512_hmac_ctx_v3 = streebog512_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;
|
||||
|
||||
streebog512_hmac_update_64 (&streebog512_hmac_ctx_v3, w0, w1, w2, w3, 4);
|
||||
|
||||
streebog512_hmac_final (&streebog512_hmac_ctx_v3);
|
||||
|
||||
tmps[gid].dgst[i + 0] = streebog512_hmac_ctx_v3.opad.h[0];
|
||||
tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v3.opad.h[1];
|
||||
tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v3.opad.h[2];
|
||||
tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v3.opad.h[3];
|
||||
tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v3.opad.h[4];
|
||||
tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v3.opad.h[5];
|
||||
tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v3.opad.h[6];
|
||||
tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v3.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_FQ void m13773_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t))
|
||||
|
@ -463,6 +463,9 @@ KERNEL_FQ void m15700_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_
|
||||
#if defined IS_CUDA || defined IS_HIP
|
||||
const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#elif defined IS_METAL
|
||||
const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#else
|
||||
const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]);
|
||||
@ -493,6 +496,11 @@ KERNEL_FQ void m15700_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_
|
||||
X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#elif defined IS_METAL
|
||||
X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#else
|
||||
X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
@ -603,6 +611,11 @@ KERNEL_FQ void m15700_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_
|
||||
T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#elif defined IS_METAL
|
||||
T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#else
|
||||
T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
|
1233
OpenCL/m20712_a0-optimized.cl
Normal file
1233
OpenCL/m20712_a0-optimized.cl
Normal file
File diff suppressed because it is too large
Load Diff
265
OpenCL/m20712_a0-pure.cl
Normal file
265
OpenCL/m20712_a0-pure.cl
Normal file
@ -0,0 +1,265 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_rp.h)
|
||||
#include M2S(INCLUDE_PATH/inc_rp.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_scalar.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha256.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8_le(i) make_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) make_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) make_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_FQ void m20712_mxx (KERN_ATTR_RULES ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len;
|
||||
|
||||
u32 s[64] = { 0 };
|
||||
|
||||
for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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 ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_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];
|
||||
const u32 f = ctx0.h[5];
|
||||
const u32 g = ctx0.h[6];
|
||||
const u32 h = ctx0.h[7];
|
||||
|
||||
sha256_ctx_t ctx;
|
||||
|
||||
sha256_init (&ctx);
|
||||
|
||||
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] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16;
|
||||
w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16;
|
||||
w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16;
|
||||
w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16;
|
||||
w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16;
|
||||
w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16;
|
||||
|
||||
sha256_update_64 (&ctx, w0, w1, w2, w3, 64);
|
||||
|
||||
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_FQ void m20712_sxx (KERN_ATTR_RULES ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len;
|
||||
|
||||
u32 s[64] = { 0 };
|
||||
|
||||
for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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 ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_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];
|
||||
const u32 f = ctx0.h[5];
|
||||
const u32 g = ctx0.h[6];
|
||||
const u32 h = ctx0.h[7];
|
||||
|
||||
sha256_ctx_t ctx;
|
||||
|
||||
sha256_init (&ctx);
|
||||
|
||||
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] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16;
|
||||
w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16;
|
||||
w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16;
|
||||
w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16;
|
||||
w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16;
|
||||
w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16;
|
||||
|
||||
sha256_update_64 (&ctx, w0, w1, w2, w3, 64);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
1347
OpenCL/m20712_a1-optimized.cl
Normal file
1347
OpenCL/m20712_a1-optimized.cl
Normal file
File diff suppressed because it is too large
Load Diff
259
OpenCL/m20712_a1-pure.cl
Normal file
259
OpenCL/m20712_a1-pure.cl
Normal file
@ -0,0 +1,259 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_scalar.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha256.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8_le(i) make_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) make_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) make_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_FQ void m20712_mxx (KERN_ATTR_BASIC ())
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
/**
|
||||
* bin2asc table
|
||||
*/
|
||||
|
||||
LOCAL_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
u32 s[64] = { 0 };
|
||||
|
||||
const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len;
|
||||
|
||||
for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]);
|
||||
}
|
||||
|
||||
sha256_ctx_t ctx1;
|
||||
|
||||
sha256_init (&ctx1);
|
||||
|
||||
sha256_update_global_swap (&ctx1, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++)
|
||||
{
|
||||
sha256_ctx_t ctx0 = ctx1;
|
||||
|
||||
sha256_update_global_swap (&ctx0, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha256_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];
|
||||
const u32 f = ctx0.h[5];
|
||||
const u32 g = ctx0.h[6];
|
||||
const u32 h = ctx0.h[7];
|
||||
|
||||
sha256_ctx_t ctx;
|
||||
|
||||
sha256_init (&ctx);
|
||||
|
||||
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] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16;
|
||||
w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16;
|
||||
w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16;
|
||||
w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16;
|
||||
w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16;
|
||||
w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16;
|
||||
|
||||
sha256_update_64 (&ctx, w0, w1, w2, w3, 64);
|
||||
|
||||
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_FQ void m20712_sxx (KERN_ATTR_BASIC ())
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
/**
|
||||
* bin2asc table
|
||||
*/
|
||||
|
||||
LOCAL_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len;
|
||||
|
||||
u32 s[64] = { 0 };
|
||||
|
||||
for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]);
|
||||
}
|
||||
|
||||
sha256_ctx_t ctx1;
|
||||
|
||||
sha256_init (&ctx1);
|
||||
|
||||
sha256_update_global_swap (&ctx1, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++)
|
||||
{
|
||||
sha256_ctx_t ctx0 = ctx1;
|
||||
|
||||
sha256_update_global_swap (&ctx0, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha256_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];
|
||||
const u32 f = ctx0.h[5];
|
||||
const u32 g = ctx0.h[6];
|
||||
const u32 h = ctx0.h[7];
|
||||
|
||||
sha256_ctx_t ctx;
|
||||
|
||||
sha256_init (&ctx);
|
||||
|
||||
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] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16;
|
||||
w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16;
|
||||
w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16;
|
||||
w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16;
|
||||
w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16;
|
||||
w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16;
|
||||
|
||||
sha256_update_64 (&ctx, w0, w1, w2, w3, 64);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
1490
OpenCL/m20712_a3-optimized.cl
Normal file
1490
OpenCL/m20712_a3-optimized.cl
Normal file
File diff suppressed because it is too large
Load Diff
285
OpenCL/m20712_a3-pure.cl
Normal file
285
OpenCL/m20712_a3-pure.cl
Normal file
@ -0,0 +1,285 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha256.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8_le(i) make_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) make_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) make_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_FQ void m20712_mxx (KERN_ATTR_VECTOR ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32x _w0[4];
|
||||
u32x _w1[4];
|
||||
u32x _w2[4];
|
||||
u32x _w3[4];
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32x w[64] = { 0 };
|
||||
|
||||
for (u32 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_HOST].salt_len;
|
||||
|
||||
u32x s[64] = { 0 };
|
||||
|
||||
for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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 ctx0;
|
||||
|
||||
sha256_init_vector (&ctx0);
|
||||
|
||||
sha256_update_vector (&ctx0, w, pw_len);
|
||||
|
||||
sha256_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];
|
||||
const u32x f = ctx0.h[5];
|
||||
const u32x g = ctx0.h[6];
|
||||
const u32x h = ctx0.h[7];
|
||||
|
||||
sha256_ctx_vector_t ctx;
|
||||
|
||||
sha256_init_vector (&ctx);
|
||||
|
||||
_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] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16;
|
||||
_w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16;
|
||||
_w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16;
|
||||
_w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16;
|
||||
_w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16;
|
||||
_w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16;
|
||||
|
||||
sha256_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 64);
|
||||
|
||||
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_FQ void m20712_sxx (KERN_ATTR_VECTOR ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32x _w0[4];
|
||||
u32x _w1[4];
|
||||
u32x _w2[4];
|
||||
u32x _w3[4];
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32x w[64] = { 0 };
|
||||
|
||||
for (u32 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_HOST].salt_len;
|
||||
|
||||
u32x s[64] = { 0 };
|
||||
|
||||
for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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 ctx0;
|
||||
|
||||
sha256_init_vector (&ctx0);
|
||||
|
||||
sha256_update_vector (&ctx0, w, pw_len);
|
||||
|
||||
sha256_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];
|
||||
const u32x f = ctx0.h[5];
|
||||
const u32x g = ctx0.h[6];
|
||||
const u32x h = ctx0.h[7];
|
||||
|
||||
sha256_ctx_vector_t ctx;
|
||||
|
||||
sha256_init_vector (&ctx);
|
||||
|
||||
_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] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16;
|
||||
_w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16;
|
||||
_w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16;
|
||||
_w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16;
|
||||
_w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16;
|
||||
_w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16;
|
||||
|
||||
sha256_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 64);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
282
OpenCL/m21310_a0-pure.cl
Normal file
282
OpenCL/m21310_a0-pure.cl
Normal file
@ -0,0 +1,282 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_rp.h)
|
||||
#include M2S(INCLUDE_PATH/inc_rp.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_scalar.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha1.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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
|
||||
|
||||
typedef struct md5_double_salt
|
||||
{
|
||||
u32 salt1_buf[64];
|
||||
int salt1_len;
|
||||
|
||||
u32 salt2_buf[64];
|
||||
int salt2_len;
|
||||
|
||||
} md5_double_salt_t;
|
||||
|
||||
KERNEL_FQ void m21310_mxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
sha1_ctx_t ctx00;
|
||||
|
||||
sha1_init(&ctx00);
|
||||
|
||||
sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len);
|
||||
|
||||
md5_ctx_t ctx11;
|
||||
|
||||
md5_init (&ctx11);
|
||||
|
||||
md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
sha1_ctx_t ctx0 = ctx00;
|
||||
|
||||
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 = ctx11;
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 16;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 16;
|
||||
w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 16;
|
||||
w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 16;
|
||||
w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 16;
|
||||
w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 16;
|
||||
w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 16;
|
||||
w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 16;
|
||||
w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 16;
|
||||
w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 16;
|
||||
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, 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_FQ void m21310_sxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
sha1_ctx_t ctx00;
|
||||
|
||||
sha1_init(&ctx00);
|
||||
|
||||
sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len);
|
||||
|
||||
md5_ctx_t ctx11;
|
||||
|
||||
md5_init (&ctx11);
|
||||
|
||||
md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
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 = ctx00;
|
||||
|
||||
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 = ctx11;
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 16;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 16;
|
||||
w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 16;
|
||||
w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 16;
|
||||
w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 16;
|
||||
w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 16;
|
||||
w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 16;
|
||||
w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 16;
|
||||
w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 16;
|
||||
w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 16;
|
||||
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, 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);
|
||||
}
|
||||
}
|
275
OpenCL/m21310_a1-pure.cl
Normal file
275
OpenCL/m21310_a1-pure.cl
Normal file
@ -0,0 +1,275 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_scalar.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha1.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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
|
||||
|
||||
typedef struct md5_double_salt
|
||||
{
|
||||
u32 salt1_buf[64];
|
||||
int salt1_len;
|
||||
|
||||
u32 salt2_buf[64];
|
||||
int salt2_len;
|
||||
|
||||
} md5_double_salt_t;
|
||||
|
||||
KERNEL_FQ void m21310_mxx (KERN_ATTR_ESALT (md5_double_salt))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
sha1_ctx_t ctx00;
|
||||
|
||||
sha1_init (&ctx00);
|
||||
|
||||
sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len);
|
||||
|
||||
sha1_update_global_swap (&ctx00, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
md5_ctx_t ctx11;
|
||||
|
||||
md5_init (&ctx11);
|
||||
|
||||
md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++)
|
||||
{
|
||||
sha1_ctx_t ctx0 = ctx00;
|
||||
|
||||
sha1_update_global_swap (&ctx0, combs_buf[il_pos].i, combs_buf[il_pos].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 = ctx11;
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 16;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 16;
|
||||
w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 16;
|
||||
w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 16;
|
||||
w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 16;
|
||||
w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 16;
|
||||
w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 16;
|
||||
w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 16;
|
||||
w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 16;
|
||||
w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 16;
|
||||
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, 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_FQ void m21310_sxx (KERN_ATTR_ESALT (md5_double_salt))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
sha1_ctx_t ctx00;
|
||||
|
||||
sha1_init (&ctx00);
|
||||
|
||||
sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len);
|
||||
|
||||
sha1_update_global_swap (&ctx00, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
md5_ctx_t ctx11;
|
||||
|
||||
md5_init (&ctx11);
|
||||
|
||||
md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++)
|
||||
{
|
||||
sha1_ctx_t ctx0 = ctx00;
|
||||
|
||||
sha1_update_global_swap (&ctx0, combs_buf[il_pos].i, combs_buf[il_pos].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 = ctx11;
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 16;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 16;
|
||||
w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 16;
|
||||
w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 16;
|
||||
w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 16;
|
||||
w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 16;
|
||||
w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 16;
|
||||
w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 16;
|
||||
w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 16;
|
||||
w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 16;
|
||||
|
||||
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, 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);
|
||||
}
|
||||
}
|
312
OpenCL/m21310_a3-pure.cl
Normal file
312
OpenCL/m21310_a3-pure.cl
Normal file
@ -0,0 +1,312 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha1.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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
|
||||
|
||||
typedef struct md5_double_salt
|
||||
{
|
||||
u32 salt1_buf[64];
|
||||
int salt1_len;
|
||||
|
||||
u32 salt2_buf[64];
|
||||
int salt2_len;
|
||||
|
||||
} md5_double_salt_t;
|
||||
|
||||
KERNEL_FQ void m21310_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32x w[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1)
|
||||
{
|
||||
w[idx] = pws[gid].i[idx];
|
||||
}
|
||||
|
||||
sha1_ctx_t ctx00;
|
||||
|
||||
sha1_init (&ctx00);
|
||||
|
||||
sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len);
|
||||
|
||||
md5_ctx_t ctx11;
|
||||
|
||||
md5_init (&ctx11);
|
||||
|
||||
md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x _w0[4];
|
||||
u32x _w1[4];
|
||||
u32x _w2[4];
|
||||
u32x _w3[4];
|
||||
|
||||
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_from_scalar (&ctx0, &ctx00);
|
||||
|
||||
sha1_update_vector_swap (&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_from_scalar (&ctx, &ctx11);
|
||||
|
||||
_w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 16;
|
||||
_w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 16;
|
||||
_w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 16;
|
||||
_w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 16;
|
||||
_w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 16;
|
||||
_w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 16;
|
||||
_w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 16;
|
||||
_w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 16;
|
||||
_w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 16;
|
||||
_w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 16;
|
||||
_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, 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_FQ void m21310_sxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32x w[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1)
|
||||
{
|
||||
w[idx] = pws[gid].i[idx];
|
||||
}
|
||||
|
||||
sha1_ctx_t ctx00;
|
||||
|
||||
sha1_init (&ctx00);
|
||||
|
||||
sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len);
|
||||
|
||||
md5_ctx_t ctx11;
|
||||
|
||||
md5_init (&ctx11);
|
||||
|
||||
md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x _w0[4];
|
||||
u32x _w1[4];
|
||||
u32x _w2[4];
|
||||
u32x _w3[4];
|
||||
|
||||
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_from_scalar (&ctx0, &ctx00);
|
||||
|
||||
sha1_update_vector_swap (&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_from_scalar (&ctx, &ctx11);
|
||||
|
||||
_w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 16;
|
||||
_w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 16;
|
||||
_w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 16;
|
||||
_w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 16;
|
||||
_w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 16;
|
||||
_w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 16;
|
||||
_w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 16;
|
||||
_w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 16;
|
||||
_w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 16;
|
||||
_w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 16;
|
||||
_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, 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);
|
||||
}
|
||||
}
|
@ -400,6 +400,9 @@ KERNEL_FQ void m22700_init (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
#if defined IS_CUDA || defined IS_HIP
|
||||
const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#elif defined IS_METAL
|
||||
const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#else
|
||||
const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]);
|
||||
@ -430,6 +433,11 @@ KERNEL_FQ void m22700_init (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#elif defined IS_METAL
|
||||
X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#else
|
||||
X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
@ -605,6 +613,11 @@ KERNEL_FQ void m22700_comp (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#elif defined IS_METAL
|
||||
T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#else
|
||||
T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
|
@ -351,6 +351,9 @@ KERNEL_FQ void m27700_init (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
#if defined IS_CUDA || defined IS_HIP
|
||||
const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#elif defined IS_METAL
|
||||
const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#else
|
||||
const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]);
|
||||
@ -381,6 +384,11 @@ KERNEL_FQ void m27700_init (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#elif defined IS_METAL
|
||||
X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#else
|
||||
X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
@ -557,6 +565,11 @@ KERNEL_FQ void m27700_comp (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#elif defined IS_METAL
|
||||
T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#else
|
||||
T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
|
@ -337,6 +337,9 @@ KERNEL_FQ void m28200_init (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t))
|
||||
#if defined IS_CUDA || defined IS_HIP
|
||||
const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#elif defined IS_METAL
|
||||
const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#else
|
||||
const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]);
|
||||
@ -367,6 +370,11 @@ KERNEL_FQ void m28200_init (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t))
|
||||
X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#elif defined IS_METAL
|
||||
X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#else
|
||||
X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
@ -525,6 +533,11 @@ KERNEL_FQ void m28200_comp (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t))
|
||||
T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#elif defined IS_METAL
|
||||
T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#else
|
||||
T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
|
@ -351,6 +351,9 @@ KERNEL_FQ void m29800_init (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
#if defined IS_CUDA || defined IS_HIP
|
||||
const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#elif defined IS_METAL
|
||||
const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]);
|
||||
#else
|
||||
const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]);
|
||||
const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]);
|
||||
@ -381,6 +384,11 @@ KERNEL_FQ void m29800_init (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#elif defined IS_METAL
|
||||
X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w);
|
||||
X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w);
|
||||
#else
|
||||
X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w);
|
||||
X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w);
|
||||
@ -557,6 +565,11 @@ KERNEL_FQ void m29800_comp (KERN_ATTR_TMPS (scrypt_tmp_t))
|
||||
T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#elif defined IS_METAL
|
||||
T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w);
|
||||
T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w);
|
||||
#else
|
||||
T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w);
|
||||
T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w);
|
||||
|
@ -496,7 +496,7 @@ KERNEL_FQ void m31400_m04 (KERN_ATTR_RULES_ESALT (scrtv2_t))
|
||||
we_t = SHA256_EXPAND (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);
|
||||
|
||||
u32x digest[8];
|
||||
u32x digest[8];
|
||||
|
||||
digest[0] = a + make_u32x (SHA256M_A);
|
||||
digest[1] = b + make_u32x (SHA256M_B);
|
||||
@ -725,7 +725,7 @@ KERNEL_FQ void m31400_s04 (KERN_ATTR_RULES_ESALT (scrtv2_t))
|
||||
we_t = SHA256_EXPAND (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);
|
||||
|
||||
u32x digest[8];
|
||||
u32x digest[8];
|
||||
|
||||
digest[0] = a + make_u32x (SHA256M_A);
|
||||
digest[1] = b + make_u32x (SHA256M_B);
|
||||
|
@ -562,7 +562,7 @@ KERNEL_FQ void m31400_m04 (KERN_ATTR_ESALT (scrtv2_t))
|
||||
we_t = SHA256_EXPAND (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);
|
||||
|
||||
u32x digest[8];
|
||||
u32x digest[8];
|
||||
|
||||
digest[0] = a + make_u32x (SHA256M_A);
|
||||
digest[1] = b + make_u32x (SHA256M_B);
|
||||
@ -868,7 +868,7 @@ KERNEL_FQ void m31400_s04 (KERN_ATTR_BASIC ())
|
||||
we_t = SHA256_EXPAND (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);
|
||||
|
||||
u32x digest[8];
|
||||
u32x digest[8];
|
||||
|
||||
digest[0] = a + make_u32x (SHA256M_A);
|
||||
digest[1] = b + make_u32x (SHA256M_B);
|
||||
|
127
OpenCL/m32000-pure.cl
Normal file
127
OpenCL/m32000-pure.cl
Normal file
@ -0,0 +1,127 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#endif
|
||||
|
||||
#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl)
|
||||
#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl)
|
||||
|
||||
typedef struct netiq_sspr_md5_tmp
|
||||
{
|
||||
u32 dgst[4];
|
||||
|
||||
} netiq_sspr_md5_tmp_t;
|
||||
|
||||
KERNEL_FQ void m32000_init (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t))
|
||||
{
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
md5_ctx_t ctx;
|
||||
|
||||
md5_init (&ctx);
|
||||
|
||||
md5_update_global (&ctx, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
md5_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];
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32000_loop (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if ((gid * VECT_SIZE) >= GID_CNT) return;
|
||||
|
||||
for (u32 i = 0; i < 4; i += 4)
|
||||
{
|
||||
u32x dgst[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);
|
||||
|
||||
for (u32 j = 0; j < LOOP_CNT; j++)
|
||||
{
|
||||
u32x h[4];
|
||||
|
||||
h[0] = MD5M_A;
|
||||
h[1] = MD5M_B;
|
||||
h[2] = MD5M_C;
|
||||
h[3] = MD5M_D;
|
||||
|
||||
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] = 0x00000080;
|
||||
w1[1] = 0;
|
||||
w1[2] = 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;
|
||||
|
||||
md5_transform_vector (w0, w1, w2, w3, h);
|
||||
|
||||
dgst[0] = h[0];
|
||||
dgst[1] = h[1];
|
||||
dgst[2] = h[2];
|
||||
dgst[3] = h[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]);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32000_comp (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
const u32 r0 = tmps[gid].dgst[0];
|
||||
const u32 r1 = tmps[gid].dgst[1];
|
||||
const u32 r2 = tmps[gid].dgst[2];
|
||||
const u32 r3 = tmps[gid].dgst[3];
|
||||
|
||||
#define il_pos 0
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include COMPARE_M
|
||||
#endif
|
||||
}
|
132
OpenCL/m32010-pure.cl
Normal file
132
OpenCL/m32010-pure.cl
Normal file
@ -0,0 +1,132 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha1.cl)
|
||||
#endif
|
||||
|
||||
#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl)
|
||||
#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl)
|
||||
|
||||
typedef struct netiq_sspr_sha1_tmp
|
||||
{
|
||||
u32 dgst[5];
|
||||
|
||||
} netiq_sspr_sha1_tmp_t;
|
||||
|
||||
KERNEL_FQ void m32010_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t))
|
||||
{
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
sha1_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];
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32010_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if ((gid * VECT_SIZE) >= GID_CNT) return;
|
||||
|
||||
for (u32 i = 0; i < 5; i += 5)
|
||||
{
|
||||
u32x dgst[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);
|
||||
|
||||
for (u32 j = 0; j < LOOP_CNT; j++)
|
||||
{
|
||||
u32x h[5];
|
||||
|
||||
h[0] = SHA1M_A;
|
||||
h[1] = SHA1M_B;
|
||||
h[2] = SHA1M_C;
|
||||
h[3] = SHA1M_D;
|
||||
h[4] = SHA1M_E;
|
||||
|
||||
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] = 20 * 8;
|
||||
|
||||
sha1_transform_vector (w0, w1, w2, w3, h);
|
||||
|
||||
dgst[0] = h[0];
|
||||
dgst[1] = h[1];
|
||||
dgst[2] = h[2];
|
||||
dgst[3] = h[3];
|
||||
dgst[4] = h[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]);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32010_comp (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
const u32 r0 = tmps[gid].dgst[DGST_R0];
|
||||
const u32 r1 = tmps[gid].dgst[DGST_R1];
|
||||
const u32 r2 = tmps[gid].dgst[DGST_R2];
|
||||
const u32 r3 = tmps[gid].dgst[DGST_R3];
|
||||
|
||||
#define il_pos 0
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include COMPARE_M
|
||||
#endif
|
||||
}
|
134
OpenCL/m32020-pure.cl
Normal file
134
OpenCL/m32020-pure.cl
Normal file
@ -0,0 +1,134 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha1.cl)
|
||||
#endif
|
||||
|
||||
#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl)
|
||||
#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl)
|
||||
|
||||
typedef struct netiq_sspr_sha1_tmp
|
||||
{
|
||||
u32 dgst[5];
|
||||
|
||||
} netiq_sspr_sha1_tmp_t;
|
||||
|
||||
KERNEL_FQ void m32020_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t))
|
||||
{
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
sha1_update_global_swap (&ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len);
|
||||
|
||||
sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
sha1_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];
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32020_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if ((gid * VECT_SIZE) >= GID_CNT) return;
|
||||
|
||||
for (u32 i = 0; i < 5; i += 5)
|
||||
{
|
||||
u32x dgst[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);
|
||||
|
||||
for (u32 j = 0; j < LOOP_CNT; j++)
|
||||
{
|
||||
u32x h[5];
|
||||
|
||||
h[0] = SHA1M_A;
|
||||
h[1] = SHA1M_B;
|
||||
h[2] = SHA1M_C;
|
||||
h[3] = SHA1M_D;
|
||||
h[4] = SHA1M_E;
|
||||
|
||||
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] = 20 * 8;
|
||||
|
||||
sha1_transform_vector (w0, w1, w2, w3, h);
|
||||
|
||||
dgst[0] = h[0];
|
||||
dgst[1] = h[1];
|
||||
dgst[2] = h[2];
|
||||
dgst[3] = h[3];
|
||||
dgst[4] = h[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]);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32020_comp (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
const u32 r0 = tmps[gid].dgst[DGST_R0];
|
||||
const u32 r1 = tmps[gid].dgst[DGST_R1];
|
||||
const u32 r2 = tmps[gid].dgst[DGST_R2];
|
||||
const u32 r3 = tmps[gid].dgst[DGST_R3];
|
||||
|
||||
#define il_pos 0
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include COMPARE_M
|
||||
#endif
|
||||
}
|
149
OpenCL/m32030-pure.cl
Normal file
149
OpenCL/m32030-pure.cl
Normal file
@ -0,0 +1,149 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha256.cl)
|
||||
#endif
|
||||
|
||||
#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl)
|
||||
#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl)
|
||||
|
||||
typedef struct netiq_sspr_sha256_tmp
|
||||
{
|
||||
u32 dgst[8];
|
||||
|
||||
} netiq_sspr_sha256_tmp_t;
|
||||
|
||||
KERNEL_FQ void m32030_init (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t))
|
||||
{
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
sha256_ctx_t ctx;
|
||||
|
||||
sha256_init (&ctx);
|
||||
|
||||
sha256_update_global_swap (&ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len);
|
||||
|
||||
sha256_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
sha256_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_FQ void m32030_loop (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if ((gid * VECT_SIZE) >= GID_CNT) return;
|
||||
|
||||
for (u32 i = 0; i < 8; i += 8)
|
||||
{
|
||||
u32x dgst[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);
|
||||
|
||||
for (u32 j = 0; j < LOOP_CNT; j++)
|
||||
{
|
||||
u32x h[8];
|
||||
|
||||
h[0] = SHA256M_A;
|
||||
h[1] = SHA256M_B;
|
||||
h[2] = SHA256M_C;
|
||||
h[3] = SHA256M_D;
|
||||
h[4] = SHA256M_E;
|
||||
h[5] = SHA256M_F;
|
||||
h[6] = SHA256M_G;
|
||||
h[7] = SHA256M_H;
|
||||
|
||||
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] = 32 * 8;
|
||||
|
||||
sha256_transform_vector (w0, w1, w2, w3, h);
|
||||
|
||||
dgst[0] = h[0];
|
||||
dgst[1] = h[1];
|
||||
dgst[2] = h[2];
|
||||
dgst[3] = h[3];
|
||||
dgst[4] = h[4];
|
||||
dgst[5] = h[5];
|
||||
dgst[6] = h[6];
|
||||
dgst[7] = h[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]);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32030_comp (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
const u32 r0 = tmps[gid].dgst[DGST_R0];
|
||||
const u32 r1 = tmps[gid].dgst[DGST_R1];
|
||||
const u32 r2 = tmps[gid].dgst[DGST_R2];
|
||||
const u32 r3 = tmps[gid].dgst[DGST_R3];
|
||||
|
||||
#define il_pos 0
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include COMPARE_M
|
||||
#endif
|
||||
}
|
173
OpenCL/m32040-pure.cl
Normal file
173
OpenCL/m32040-pure.cl
Normal file
@ -0,0 +1,173 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha512.cl)
|
||||
#endif
|
||||
|
||||
#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl)
|
||||
#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl)
|
||||
|
||||
typedef struct netiq_sspr_sha512_tmp
|
||||
{
|
||||
u64 dgst[8];
|
||||
|
||||
} netiq_sspr_sha512_tmp_t;
|
||||
|
||||
KERNEL_FQ void m32040_init (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t))
|
||||
{
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
sha512_ctx_t ctx;
|
||||
|
||||
sha512_init (&ctx);
|
||||
|
||||
sha512_update_global_swap (&ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len);
|
||||
|
||||
sha512_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_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_FQ void m32040_loop (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if ((gid * VECT_SIZE) >= GID_CNT) return;
|
||||
|
||||
for (u32 i = 0; i < 8; i += 8)
|
||||
{
|
||||
u64x dgst[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);
|
||||
|
||||
for (u32 j = 0; j < LOOP_CNT; j++)
|
||||
{
|
||||
u64x h[8];
|
||||
|
||||
h[0] = SHA512M_A;
|
||||
h[1] = SHA512M_B;
|
||||
h[2] = SHA512M_C;
|
||||
h[3] = SHA512M_D;
|
||||
h[4] = SHA512M_E;
|
||||
h[5] = SHA512M_F;
|
||||
h[6] = SHA512M_G;
|
||||
h[7] = SHA512M_H;
|
||||
|
||||
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] = 64 * 8;
|
||||
|
||||
sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, h);
|
||||
|
||||
dgst[0] = h[0];
|
||||
dgst[1] = h[1];
|
||||
dgst[2] = h[2];
|
||||
dgst[3] = h[3];
|
||||
dgst[4] = h[4];
|
||||
dgst[5] = h[5];
|
||||
dgst[6] = h[6];
|
||||
dgst[7] = h[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]);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32040_comp (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t))
|
||||
{
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lid = get_local_id (0);
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
const u64 a = tmps[gid].dgst[7];
|
||||
const u64 b = tmps[gid].dgst[3];
|
||||
|
||||
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
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include COMPARE_M
|
||||
#endif
|
||||
}
|
1038
OpenCL/m32100-pure.cl
Normal file
1038
OpenCL/m32100-pure.cl
Normal file
File diff suppressed because it is too large
Load Diff
1101
OpenCL/m32200-pure.cl
Normal file
1101
OpenCL/m32200-pure.cl
Normal file
File diff suppressed because it is too large
Load Diff
813
OpenCL/m32300_a0-optimized.cl
Normal file
813
OpenCL/m32300_a0-optimized.cl
Normal file
@ -0,0 +1,813 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_rp_optimized.h)
|
||||
#include M2S(INCLUDE_PATH/inc_rp_optimized.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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
|
||||
|
||||
typedef struct md5_triple_salt
|
||||
{
|
||||
u32 salt1_buf[64];
|
||||
int salt1_len;
|
||||
|
||||
u32 salt2_buf[64];
|
||||
int salt2_len;
|
||||
|
||||
u32 salt3_buf[64];
|
||||
int salt3_len;
|
||||
|
||||
} md5_triple_salt_t;
|
||||
|
||||
KERNEL_FQ void m32300_m04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) 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 & 63;
|
||||
|
||||
/**
|
||||
* salt1
|
||||
*/
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32x salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* salt2
|
||||
*/
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32x salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* salt3
|
||||
*/
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32x salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 };
|
||||
|
||||
// md5($password)
|
||||
|
||||
const u32x out_len = apply_rules_vect_optimized (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 += make_u32x (MD5M_A);
|
||||
b += make_u32x (MD5M_B);
|
||||
c += make_u32x (MD5M_C);
|
||||
d += make_u32x (MD5M_D);
|
||||
|
||||
// md5(md5($password).$salt)
|
||||
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final_vector (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init_vector (&ctx);
|
||||
|
||||
md5_update_vector (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32x ww0[4];
|
||||
u32x ww1[4];
|
||||
u32x ww2[4];
|
||||
u32x ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update_vector (&ctx, salt3_buf, salt3_len);
|
||||
|
||||
// md5_final_vector
|
||||
|
||||
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;
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03);
|
||||
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13);
|
||||
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23);
|
||||
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33);
|
||||
|
||||
a += ctx.h[0] - make_u32x (MD5M_A);
|
||||
b += ctx.h[1] - make_u32x (MD5M_B);
|
||||
c += ctx.h[2] - make_u32x (MD5M_C);
|
||||
d += ctx.h[3] - make_u32x (MD5M_D);
|
||||
|
||||
COMPARE_M_SIMD (a, d, c, b);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_m08 (KERN_ATTR_RULES ())
|
||||
{
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_m16 (KERN_ATTR_RULES ())
|
||||
{
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_s04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) 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 & 63;
|
||||
|
||||
/**
|
||||
* salt1
|
||||
*/
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32x salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* salt2
|
||||
*/
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32x salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* salt3
|
||||
*/
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32x salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].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_optimized (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 += make_u32x (MD5M_A);
|
||||
b += make_u32x (MD5M_B);
|
||||
c += make_u32x (MD5M_C);
|
||||
d += make_u32x (MD5M_D);
|
||||
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final_vector (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init_vector (&ctx);
|
||||
|
||||
md5_update_vector (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32x ww0[4];
|
||||
u32x ww1[4];
|
||||
u32x ww2[4];
|
||||
u32x ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update_vector (&ctx, salt3_buf, salt3_len);
|
||||
|
||||
// md5_final_vector
|
||||
|
||||
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;
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03);
|
||||
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13);
|
||||
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23);
|
||||
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30);
|
||||
|
||||
if (MATCHES_NONE_VS ((a + ctx.h[0] - make_u32x (MD5M_A)), search[0])) continue;
|
||||
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33);
|
||||
|
||||
a += ctx.h[0] - make_u32x (MD5M_A);
|
||||
b += ctx.h[1] - make_u32x (MD5M_B);
|
||||
c += ctx.h[2] - make_u32x (MD5M_C);
|
||||
d += ctx.h[3] - make_u32x (MD5M_D);
|
||||
|
||||
COMPARE_S_SIMD (a, d, c, b);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_s08 (KERN_ATTR_RULES ())
|
||||
{
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_s16 (KERN_ATTR_RULES ())
|
||||
{
|
||||
}
|
388
OpenCL/m32300_a0-pure.cl
Normal file
388
OpenCL/m32300_a0-pure.cl
Normal file
@ -0,0 +1,388 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_rp.h)
|
||||
#include M2S(INCLUDE_PATH/inc_rp.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_scalar.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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
|
||||
|
||||
typedef struct md5_triple_salt
|
||||
{
|
||||
u32 salt1_buf[64];
|
||||
int salt1_len;
|
||||
|
||||
u32 salt2_buf[64];
|
||||
int salt2_len;
|
||||
|
||||
u32 salt3_buf[64];
|
||||
int salt3_len;
|
||||
|
||||
} md5_triple_salt_t;
|
||||
|
||||
KERNEL_FQ void m32300_mxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
/**
|
||||
* bin2asc uppercase table
|
||||
*/
|
||||
|
||||
LOCAL_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32 salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32 salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32 salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_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);
|
||||
|
||||
u32 a = ctx0.h[0];
|
||||
u32 b = ctx0.h[1];
|
||||
u32 c = ctx0.h[2];
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init (&ctx);
|
||||
|
||||
md5_update (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32 ww0[4];
|
||||
u32 ww1[4];
|
||||
u32 ww2[4];
|
||||
u32 ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update (&ctx, salt3_buf, salt3_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_FQ void m32300_sxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
/**
|
||||
* bin2asc uppercase table
|
||||
*/
|
||||
|
||||
LOCAL_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32 salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32 salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32 salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_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);
|
||||
|
||||
u32 a = ctx0.h[0];
|
||||
u32 b = ctx0.h[1];
|
||||
u32 c = ctx0.h[2];
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init (&ctx);
|
||||
|
||||
md5_update (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32 ww0[4];
|
||||
u32 ww1[4];
|
||||
u32 ww2[4];
|
||||
u32 ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update (&ctx, salt3_buf, salt3_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);
|
||||
}
|
||||
}
|
925
OpenCL/m32300_a1-optimized.cl
Normal file
925
OpenCL/m32300_a1-optimized.cl
Normal file
@ -0,0 +1,925 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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
|
||||
|
||||
typedef struct md5_triple_salt
|
||||
{
|
||||
u32 salt1_buf[64];
|
||||
int salt1_len;
|
||||
|
||||
u32 salt2_buf[64];
|
||||
int salt2_len;
|
||||
|
||||
u32 salt3_buf[64];
|
||||
int salt3_len;
|
||||
|
||||
} md5_triple_salt_t;
|
||||
|
||||
KERNEL_FQ void m32300_m04 (KERN_ATTR_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) 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 & 63;
|
||||
|
||||
/**
|
||||
* salt1
|
||||
*/
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32x salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* salt2
|
||||
*/
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32x salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* salt3
|
||||
*/
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32x salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) & 63;
|
||||
|
||||
const u32x pw_len = (pw_l_len + pw_r_len) & 63;
|
||||
|
||||
/**
|
||||
* 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 += make_u32x (MD5M_A);
|
||||
b += make_u32x (MD5M_B);
|
||||
c += make_u32x (MD5M_C);
|
||||
d += make_u32x (MD5M_D);
|
||||
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final_vector (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init_vector (&ctx);
|
||||
|
||||
md5_update_vector (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32x ww0[4];
|
||||
u32x ww1[4];
|
||||
u32x ww2[4];
|
||||
u32x ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update_vector (&ctx, salt3_buf, salt3_len);
|
||||
|
||||
// md5_final_vector
|
||||
|
||||
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;
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03);
|
||||
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13);
|
||||
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23);
|
||||
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33);
|
||||
|
||||
a += ctx.h[0] - make_u32x (MD5M_A);
|
||||
b += ctx.h[1] - make_u32x (MD5M_B);
|
||||
c += ctx.h[2] - make_u32x (MD5M_C);
|
||||
d += ctx.h[3] - make_u32x (MD5M_D);
|
||||
|
||||
COMPARE_M_SIMD (a, d, c, b);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_m08 (KERN_ATTR_BASIC ())
|
||||
{
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_m16 (KERN_ATTR_BASIC ())
|
||||
{
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_s04 (KERN_ATTR_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) 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 & 63;
|
||||
|
||||
/**
|
||||
* salt1
|
||||
*/
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32x salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* salt2
|
||||
*/
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32x salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* salt3
|
||||
*/
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32x salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].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) & 63;
|
||||
|
||||
const u32x pw_len = (pw_l_len + pw_r_len) & 63;
|
||||
|
||||
/**
|
||||
* 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 += make_u32x (MD5M_A);
|
||||
b += make_u32x (MD5M_B);
|
||||
c += make_u32x (MD5M_C);
|
||||
d += make_u32x (MD5M_D);
|
||||
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final_vector (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init_vector (&ctx);
|
||||
|
||||
md5_update_vector (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32x ww0[4];
|
||||
u32x ww1[4];
|
||||
u32x ww2[4];
|
||||
u32x ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update_vector (&ctx, salt3_buf, salt3_len);
|
||||
|
||||
// md5_final_vector
|
||||
|
||||
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;
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03);
|
||||
MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00);
|
||||
MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01);
|
||||
MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02);
|
||||
MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03);
|
||||
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13);
|
||||
MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10);
|
||||
MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11);
|
||||
MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12);
|
||||
MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13);
|
||||
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23);
|
||||
MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20);
|
||||
MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21);
|
||||
MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22);
|
||||
MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23);
|
||||
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30);
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33);
|
||||
MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30);
|
||||
|
||||
if (MATCHES_NONE_VS ((a + ctx.h[0] - make_u32x (MD5M_A)), search[0])) continue;
|
||||
|
||||
MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31);
|
||||
MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32);
|
||||
MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33);
|
||||
|
||||
a += ctx.h[0] - make_u32x (MD5M_A);
|
||||
b += ctx.h[1] - make_u32x (MD5M_B);
|
||||
c += ctx.h[2] - make_u32x (MD5M_C);
|
||||
d += ctx.h[3] - make_u32x (MD5M_D);
|
||||
|
||||
COMPARE_S_SIMD (a, d, c, b);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_s08 (KERN_ATTR_BASIC ())
|
||||
{
|
||||
}
|
||||
|
||||
KERNEL_FQ void m32300_s16 (KERN_ATTR_BASIC ())
|
||||
{
|
||||
}
|
382
OpenCL/m32300_a1-pure.cl
Normal file
382
OpenCL/m32300_a1-pure.cl
Normal file
@ -0,0 +1,382 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_scalar.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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
|
||||
|
||||
typedef struct md5_triple_salt
|
||||
{
|
||||
u32 salt1_buf[64];
|
||||
int salt1_len;
|
||||
|
||||
u32 salt2_buf[64];
|
||||
int salt2_len;
|
||||
|
||||
u32 salt3_buf[64];
|
||||
int salt3_len;
|
||||
|
||||
} md5_triple_salt_t;
|
||||
|
||||
KERNEL_FQ void m32300_mxx (KERN_ATTR_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
/**
|
||||
* bin2asc uppercase array
|
||||
*/
|
||||
|
||||
LOCAL_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32 salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32 salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32 salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
u32 a = ctx1.h[0];
|
||||
u32 b = ctx1.h[1];
|
||||
u32 c = ctx1.h[2];
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init (&ctx);
|
||||
|
||||
md5_update (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32 ww0[4];
|
||||
u32 ww1[4];
|
||||
u32 ww2[4];
|
||||
u32 ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update (&ctx, salt3_buf, salt3_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_FQ void m32300_sxx (KERN_ATTR_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
/**
|
||||
* bin2asc uppercase array
|
||||
*/
|
||||
|
||||
LOCAL_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32 salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32 salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32 salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
u32 a = ctx1.h[0];
|
||||
u32 b = ctx1.h[1];
|
||||
u32 c = ctx1.h[2];
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init (&ctx);
|
||||
|
||||
md5_update (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32 ww0[4];
|
||||
u32 ww1[4];
|
||||
u32 ww2[4];
|
||||
u32 ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update (&ctx, salt3_buf, salt3_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);
|
||||
}
|
||||
}
|
1169
OpenCL/m32300_a3-optimized.cl
Normal file
1169
OpenCL/m32300_a3-optimized.cl
Normal file
File diff suppressed because it is too large
Load Diff
408
OpenCL/m32300_a3-pure.cl
Normal file
408
OpenCL/m32300_a3-pure.cl
Normal file
@ -0,0 +1,408 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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
|
||||
|
||||
typedef struct md5_triple_salt
|
||||
{
|
||||
u32 salt1_buf[64];
|
||||
int salt1_len;
|
||||
|
||||
u32 salt2_buf[64];
|
||||
int salt2_len;
|
||||
|
||||
u32 salt3_buf[64];
|
||||
int salt3_len;
|
||||
|
||||
} md5_triple_salt_t;
|
||||
|
||||
KERNEL_FQ void m32300_mxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
/*
|
||||
* bin2asc uppercase table
|
||||
*/
|
||||
|
||||
LOCAL_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32x w[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1)
|
||||
{
|
||||
w[idx] = pws[gid].i[idx];
|
||||
}
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32x salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32x salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32x salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_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);
|
||||
|
||||
u32x a = ctx0.h[0];
|
||||
u32x b = ctx0.h[1];
|
||||
u32x c = ctx0.h[2];
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final_vector (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init_vector (&ctx);
|
||||
|
||||
md5_update_vector (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32x ww0[4];
|
||||
u32x ww1[4];
|
||||
u32x ww2[4];
|
||||
u32x ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update_vector (&ctx, salt3_buf, salt3_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_FQ void m32300_sxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
/*
|
||||
* bin2asc uppercase table
|
||||
*/
|
||||
|
||||
LOCAL_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32x w[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1)
|
||||
{
|
||||
w[idx] = pws[gid].i[idx];
|
||||
}
|
||||
|
||||
const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len;
|
||||
|
||||
u32x salt1_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1)
|
||||
{
|
||||
salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len;
|
||||
|
||||
u32x salt2_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1)
|
||||
{
|
||||
salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx];
|
||||
}
|
||||
|
||||
const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len;
|
||||
|
||||
u32x salt3_buf[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1)
|
||||
{
|
||||
salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_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);
|
||||
|
||||
u32x a = ctx0.h[0];
|
||||
u32x b = ctx0.h[1];
|
||||
u32x c = ctx0.h[2];
|
||||
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, salt1_buf, salt1_len);
|
||||
|
||||
md5_final_vector (&ctx);
|
||||
|
||||
a = ctx.h[0];
|
||||
b = ctx.h[1];
|
||||
c = ctx.h[2];
|
||||
d = ctx.h[3];
|
||||
|
||||
md5_init_vector (&ctx);
|
||||
|
||||
md5_update_vector (&ctx, salt2_buf, salt2_len);
|
||||
|
||||
u32x ww0[4];
|
||||
u32x ww1[4];
|
||||
u32x ww2[4];
|
||||
u32x ww3[4];
|
||||
|
||||
ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 8) & 255) << 16;
|
||||
ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((a >> 24) & 255) << 16;
|
||||
ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 8) & 255) << 16;
|
||||
ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((b >> 24) & 255) << 16;
|
||||
ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 8) & 255) << 16;
|
||||
ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((c >> 24) & 255) << 16;
|
||||
ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 8) & 255) << 16;
|
||||
ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
|
||||
| uint_to_hex_lower8 ((d >> 24) & 255) << 16;
|
||||
|
||||
ww2[0] = 0;
|
||||
ww2[1] = 0;
|
||||
ww2[2] = 0;
|
||||
ww2[3] = 0;
|
||||
ww3[0] = 0;
|
||||
ww3[1] = 0;
|
||||
ww3[2] = 0;
|
||||
ww3[3] = 0;
|
||||
|
||||
md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32);
|
||||
|
||||
md5_update_vector (&ctx, salt3_buf, salt3_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);
|
||||
}
|
||||
}
|
369
OpenCL/m32410_a0-pure.cl
Normal file
369
OpenCL/m32410_a0-pure.cl
Normal file
@ -0,0 +1,369 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_rp.h)
|
||||
#include M2S(INCLUDE_PATH/inc_rp.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_scalar.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha512.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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_FQ void m32410_mxx (KERN_ATTR_RULES ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
u32 w4[4];
|
||||
u32 w5[4];
|
||||
u32 w6[4];
|
||||
u32 w7[4];
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len;
|
||||
|
||||
u32 s[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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 ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u64 a = ctx0.h[0];
|
||||
const u64 b = ctx0.h[1];
|
||||
const u64 c = ctx0.h[2];
|
||||
const u64 d = ctx0.h[3];
|
||||
const u64 e = ctx0.h[4];
|
||||
const u64 f = ctx0.h[5];
|
||||
const u64 g = ctx0.h[6];
|
||||
const u64 h = ctx0.h[7];
|
||||
|
||||
sha512_ctx_t ctx;
|
||||
|
||||
sha512_init (&ctx);
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 48) & 255) << 0;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 32) & 255) << 0;
|
||||
w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 0;
|
||||
w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 0;
|
||||
w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 48) & 255) << 0;
|
||||
w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 32) & 255) << 0;
|
||||
w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 0;
|
||||
w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 0;
|
||||
w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 48) & 255) << 0;
|
||||
w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 32) & 255) << 0;
|
||||
w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 0;
|
||||
w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 0;
|
||||
w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 48) & 255) << 0;
|
||||
w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 32) & 255) << 0;
|
||||
w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 0;
|
||||
w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 0;
|
||||
w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 48) & 255) << 0;
|
||||
w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 32) & 255) << 0;
|
||||
w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 0;
|
||||
w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 0;
|
||||
w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 48) & 255) << 0;
|
||||
w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 32) & 255) << 0;
|
||||
w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 16) & 255) << 0;
|
||||
w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 0) & 255) << 0;
|
||||
w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 48) & 255) << 0;
|
||||
w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 32) & 255) << 0;
|
||||
w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 16) & 255) << 0;
|
||||
w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 0) & 255) << 0;
|
||||
w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 48) & 255) << 0;
|
||||
w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 32) & 255) << 0;
|
||||
w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 16) & 255) << 0;
|
||||
w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 0) & 255) << 0;
|
||||
|
||||
sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128);
|
||||
|
||||
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_FQ void m32410_sxx (KERN_ATTR_RULES ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
u32 w4[4];
|
||||
u32 w5[4];
|
||||
u32 w6[4];
|
||||
u32 w7[4];
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len;
|
||||
|
||||
u32 s[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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 ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u64 a = ctx0.h[0];
|
||||
const u64 b = ctx0.h[1];
|
||||
const u64 c = ctx0.h[2];
|
||||
const u64 d = ctx0.h[3];
|
||||
const u64 e = ctx0.h[4];
|
||||
const u64 f = ctx0.h[5];
|
||||
const u64 g = ctx0.h[6];
|
||||
const u64 h = ctx0.h[7];
|
||||
|
||||
sha512_ctx_t ctx;
|
||||
|
||||
sha512_init (&ctx);
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 48) & 255) << 0;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 32) & 255) << 0;
|
||||
w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 0;
|
||||
w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 0;
|
||||
w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 48) & 255) << 0;
|
||||
w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 32) & 255) << 0;
|
||||
w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 0;
|
||||
w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 0;
|
||||
w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 48) & 255) << 0;
|
||||
w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 32) & 255) << 0;
|
||||
w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 0;
|
||||
w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 0;
|
||||
w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 48) & 255) << 0;
|
||||
w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 32) & 255) << 0;
|
||||
w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 0;
|
||||
w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 0;
|
||||
w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 48) & 255) << 0;
|
||||
w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 32) & 255) << 0;
|
||||
w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 0;
|
||||
w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 0;
|
||||
w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 48) & 255) << 0;
|
||||
w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 32) & 255) << 0;
|
||||
w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 16) & 255) << 0;
|
||||
w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 0) & 255) << 0;
|
||||
w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 48) & 255) << 0;
|
||||
w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 32) & 255) << 0;
|
||||
w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 16) & 255) << 0;
|
||||
w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 0) & 255) << 0;
|
||||
w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 48) & 255) << 0;
|
||||
w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 32) & 255) << 0;
|
||||
w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 16) & 255) << 0;
|
||||
w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 0) & 255) << 0;
|
||||
|
||||
sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
363
OpenCL/m32410_a1-pure.cl
Normal file
363
OpenCL/m32410_a1-pure.cl
Normal file
@ -0,0 +1,363 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_scalar.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha512.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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_FQ void m32410_mxx (KERN_ATTR_BASIC ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
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 salt_len = salt_bufs[SALT_POS_HOST].salt_len;
|
||||
|
||||
u32 s[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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 ctx1 = ctx0;
|
||||
|
||||
sha512_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha512_final (&ctx1);
|
||||
|
||||
const u64 a = ctx1.h[0];
|
||||
const u64 b = ctx1.h[1];
|
||||
const u64 c = ctx1.h[2];
|
||||
const u64 d = ctx1.h[3];
|
||||
const u64 e = ctx1.h[4];
|
||||
const u64 f = ctx1.h[5];
|
||||
const u64 g = ctx1.h[6];
|
||||
const u64 h = ctx1.h[7];
|
||||
|
||||
sha512_ctx_t ctx;
|
||||
|
||||
sha512_init (&ctx);
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 48) & 255) << 0;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 32) & 255) << 0;
|
||||
w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 0;
|
||||
w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 0;
|
||||
w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 48) & 255) << 0;
|
||||
w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 32) & 255) << 0;
|
||||
w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 0;
|
||||
w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 0;
|
||||
w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 48) & 255) << 0;
|
||||
w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 32) & 255) << 0;
|
||||
w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 0;
|
||||
w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 0;
|
||||
w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 48) & 255) << 0;
|
||||
w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 32) & 255) << 0;
|
||||
w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 0;
|
||||
w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 0;
|
||||
w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 48) & 255) << 0;
|
||||
w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 32) & 255) << 0;
|
||||
w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 0;
|
||||
w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 0;
|
||||
w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 48) & 255) << 0;
|
||||
w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 32) & 255) << 0;
|
||||
w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 16) & 255) << 0;
|
||||
w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 0) & 255) << 0;
|
||||
w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 48) & 255) << 0;
|
||||
w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 32) & 255) << 0;
|
||||
w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 16) & 255) << 0;
|
||||
w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 0) & 255) << 0;
|
||||
w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 48) & 255) << 0;
|
||||
w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 32) & 255) << 0;
|
||||
w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 16) & 255) << 0;
|
||||
w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 0) & 255) << 0;
|
||||
|
||||
sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128);
|
||||
|
||||
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_FQ void m32410_sxx (KERN_ATTR_BASIC ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
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 salt_len = salt_bufs[SALT_POS_HOST].salt_len;
|
||||
|
||||
u32 s[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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 ctx1 = ctx0;
|
||||
|
||||
sha512_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha512_final (&ctx1);
|
||||
|
||||
const u64 a = ctx1.h[0];
|
||||
const u64 b = ctx1.h[1];
|
||||
const u64 c = ctx1.h[2];
|
||||
const u64 d = ctx1.h[3];
|
||||
const u64 e = ctx1.h[4];
|
||||
const u64 f = ctx1.h[5];
|
||||
const u64 g = ctx1.h[6];
|
||||
const u64 h = ctx1.h[7];
|
||||
|
||||
sha512_ctx_t ctx;
|
||||
|
||||
sha512_init (&ctx);
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 48) & 255) << 0;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 32) & 255) << 0;
|
||||
w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 0;
|
||||
w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 0;
|
||||
w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 48) & 255) << 0;
|
||||
w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 32) & 255) << 0;
|
||||
w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 0;
|
||||
w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 0;
|
||||
w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 48) & 255) << 0;
|
||||
w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 32) & 255) << 0;
|
||||
w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 0;
|
||||
w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 0;
|
||||
w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 48) & 255) << 0;
|
||||
w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 32) & 255) << 0;
|
||||
w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 0;
|
||||
w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 0;
|
||||
w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 48) & 255) << 0;
|
||||
w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 32) & 255) << 0;
|
||||
w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 0;
|
||||
w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 0;
|
||||
w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 48) & 255) << 0;
|
||||
w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 32) & 255) << 0;
|
||||
w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 16) & 255) << 0;
|
||||
w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 0) & 255) << 0;
|
||||
w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 48) & 255) << 0;
|
||||
w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 32) & 255) << 0;
|
||||
w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 16) & 255) << 0;
|
||||
w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 0) & 255) << 0;
|
||||
w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 48) & 255) << 0;
|
||||
w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 32) & 255) << 0;
|
||||
w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 16) & 255) << 0;
|
||||
w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 0) & 255) << 0;
|
||||
|
||||
sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
389
OpenCL/m32410_a3-pure.cl
Normal file
389
OpenCL/m32410_a3-pure.cl
Normal file
@ -0,0 +1,389 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
||||
#include M2S(INCLUDE_PATH/inc_types.h)
|
||||
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_common.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
||||
#include M2S(INCLUDE_PATH/inc_hash_sha512.cl)
|
||||
#endif
|
||||
|
||||
#if VECT_SIZE == 1
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)])
|
||||
#elif VECT_SIZE == 2
|
||||
#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
|
||||
#elif VECT_SIZE == 4
|
||||
#define uint_to_hex_lower8(i) make_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) make_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) make_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_FQ void m32410_mxx (KERN_ATTR_VECTOR ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
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 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32x w[64] = { 0 };
|
||||
|
||||
for (u32 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_HOST].salt_len;
|
||||
|
||||
u32x s[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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_final = w0l | w0r;
|
||||
|
||||
w[0] = w0_final;
|
||||
|
||||
sha512_ctx_vector_t ctx0;
|
||||
|
||||
sha512_init_vector (&ctx0);
|
||||
|
||||
sha512_update_vector (&ctx0, w, pw_len);
|
||||
|
||||
sha512_final_vector (&ctx0);
|
||||
|
||||
const u64x a = ctx0.h[0];
|
||||
const u64x b = ctx0.h[1];
|
||||
const u64x c = ctx0.h[2];
|
||||
const u64x d = ctx0.h[3];
|
||||
const u64x e = ctx0.h[4];
|
||||
const u64x f = ctx0.h[5];
|
||||
const u64x g = ctx0.h[6];
|
||||
const u64x h = ctx0.h[7];
|
||||
|
||||
sha512_ctx_vector_t ctx;
|
||||
|
||||
sha512_init_vector (&ctx);
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 48) & 255) << 0;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 32) & 255) << 0;
|
||||
w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 0;
|
||||
w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 0;
|
||||
w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 48) & 255) << 0;
|
||||
w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 32) & 255) << 0;
|
||||
w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 0;
|
||||
w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 0;
|
||||
w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 48) & 255) << 0;
|
||||
w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 32) & 255) << 0;
|
||||
w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 0;
|
||||
w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 0;
|
||||
w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 48) & 255) << 0;
|
||||
w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 32) & 255) << 0;
|
||||
w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 0;
|
||||
w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 0;
|
||||
w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 48) & 255) << 0;
|
||||
w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 32) & 255) << 0;
|
||||
w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 0;
|
||||
w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 0;
|
||||
w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 48) & 255) << 0;
|
||||
w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 32) & 255) << 0;
|
||||
w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 16) & 255) << 0;
|
||||
w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 0) & 255) << 0;
|
||||
w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 48) & 255) << 0;
|
||||
w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 32) & 255) << 0;
|
||||
w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 16) & 255) << 0;
|
||||
w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 0) & 255) << 0;
|
||||
w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 48) & 255) << 0;
|
||||
w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 32) & 255) << 0;
|
||||
w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 16) & 255) << 0;
|
||||
w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 0) & 255) << 0;
|
||||
|
||||
sha512_update_vector_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128);
|
||||
|
||||
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_FQ void m32410_sxx (KERN_ATTR_VECTOR ())
|
||||
{
|
||||
/**
|
||||
* 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_VK u32 l_bin2asc[256];
|
||||
|
||||
for (u32 i = lid; i < 256; 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;
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
if (gid >= GID_CNT) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
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 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32x w[64] = { 0 };
|
||||
|
||||
for (u32 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_HOST].salt_len;
|
||||
|
||||
u32x s[64] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1)
|
||||
{
|
||||
s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].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_final = w0l | w0r;
|
||||
|
||||
w[0] = w0_final;
|
||||
|
||||
sha512_ctx_vector_t ctx0;
|
||||
|
||||
sha512_init_vector (&ctx0);
|
||||
|
||||
sha512_update_vector (&ctx0, w, pw_len);
|
||||
|
||||
sha512_final_vector (&ctx0);
|
||||
|
||||
const u64x a = ctx0.h[0];
|
||||
const u64x b = ctx0.h[1];
|
||||
const u64x c = ctx0.h[2];
|
||||
const u64x d = ctx0.h[3];
|
||||
const u64x e = ctx0.h[4];
|
||||
const u64x f = ctx0.h[5];
|
||||
const u64x g = ctx0.h[6];
|
||||
const u64x h = ctx0.h[7];
|
||||
|
||||
sha512_ctx_vector_t ctx;
|
||||
|
||||
sha512_init_vector (&ctx);
|
||||
|
||||
w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 48) & 255) << 0;
|
||||
w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 32) & 255) << 0;
|
||||
w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 16) & 255) << 0;
|
||||
w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((a >> 0) & 255) << 0;
|
||||
w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 48) & 255) << 0;
|
||||
w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 32) & 255) << 0;
|
||||
w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 16) & 255) << 0;
|
||||
w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((b >> 0) & 255) << 0;
|
||||
w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 48) & 255) << 0;
|
||||
w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 32) & 255) << 0;
|
||||
w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 16) & 255) << 0;
|
||||
w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((c >> 0) & 255) << 0;
|
||||
w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 48) & 255) << 0;
|
||||
w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 32) & 255) << 0;
|
||||
w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 16) & 255) << 0;
|
||||
w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((d >> 0) & 255) << 0;
|
||||
w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 48) & 255) << 0;
|
||||
w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 32) & 255) << 0;
|
||||
w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 16) & 255) << 0;
|
||||
w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((e >> 0) & 255) << 0;
|
||||
w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 48) & 255) << 0;
|
||||
w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 32) & 255) << 0;
|
||||
w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 16) & 255) << 0;
|
||||
w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((f >> 0) & 255) << 0;
|
||||
w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 48) & 255) << 0;
|
||||
w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 32) & 255) << 0;
|
||||
w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 16) & 255) << 0;
|
||||
w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((g >> 0) & 255) << 0;
|
||||
w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 48) & 255) << 0;
|
||||
w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 32) & 255) << 0;
|
||||
w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 16) & 255) << 0;
|
||||
w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16
|
||||
| uint_to_hex_lower8 ((h >> 0) & 255) << 0;
|
||||
|
||||
sha512_update_vector_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
556
deps/unrar/UnRAR.vcxproj
vendored
556
deps/unrar/UnRAR.vcxproj
vendored
@ -1,279 +1,279 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{95CC809B-03FC-4EDB-BB20-FD07A698C05F}</ProjectGuid>
|
||||
<RootNamespace>UnRAR</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>14.0.24720.0</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>build\unrar32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrar32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>build\unrar64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrar64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>build\unrar32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrar32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>build\unrar64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrar64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<FloatingPointModel>Precise</FloatingPointModel>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="archive.cpp" />
|
||||
<ClCompile Include="arcread.cpp" />
|
||||
<ClCompile Include="blake2s.cpp" />
|
||||
<ClCompile Include="cmddata.cpp" />
|
||||
<ClCompile Include="consio.cpp" />
|
||||
<ClCompile Include="crc.cpp" />
|
||||
<ClCompile Include="crypt.cpp" />
|
||||
<ClCompile Include="encname.cpp" />
|
||||
<ClCompile Include="errhnd.cpp" />
|
||||
<ClCompile Include="extinfo.cpp" />
|
||||
<ClCompile Include="extract.cpp" />
|
||||
<ClCompile Include="filcreat.cpp" />
|
||||
<ClCompile Include="file.cpp" />
|
||||
<ClCompile Include="filefn.cpp" />
|
||||
<ClCompile Include="filestr.cpp" />
|
||||
<ClCompile Include="find.cpp" />
|
||||
<ClCompile Include="getbits.cpp" />
|
||||
<ClCompile Include="global.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="hash.cpp" />
|
||||
<ClCompile Include="headers.cpp" />
|
||||
<ClCompile Include="isnt.cpp" />
|
||||
<ClCompile Include="list.cpp" />
|
||||
<ClCompile Include="match.cpp" />
|
||||
<ClCompile Include="options.cpp" />
|
||||
<ClCompile Include="pathfn.cpp" />
|
||||
<ClCompile Include="qopen.cpp" />
|
||||
<ClCompile Include="rar.cpp" />
|
||||
<ClCompile Include="rarpch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="rarvm.cpp" />
|
||||
<ClCompile Include="rawread.cpp" />
|
||||
<ClCompile Include="rdwrfn.cpp" />
|
||||
<ClCompile Include="recvol.cpp" />
|
||||
<ClCompile Include="resource.cpp" />
|
||||
<ClCompile Include="rijndael.cpp" />
|
||||
<ClCompile Include="rs.cpp" />
|
||||
<ClCompile Include="rs16.cpp" />
|
||||
<ClCompile Include="scantree.cpp" />
|
||||
<ClCompile Include="secpassword.cpp" />
|
||||
<ClCompile Include="sha1.cpp" />
|
||||
<ClCompile Include="sha256.cpp" />
|
||||
<ClCompile Include="smallfn.cpp" />
|
||||
<ClCompile Include="strfn.cpp" />
|
||||
<ClCompile Include="strlist.cpp" />
|
||||
<ClCompile Include="system.cpp" />
|
||||
<ClCompile Include="threadpool.cpp" />
|
||||
<ClCompile Include="timefn.cpp" />
|
||||
<ClCompile Include="ui.cpp" />
|
||||
<ClCompile Include="unicode.cpp" />
|
||||
<ClCompile Include="unpack.cpp" />
|
||||
<ClCompile Include="volume.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{95CC809B-03FC-4EDB-BB20-FD07A698C05F}</ProjectGuid>
|
||||
<RootNamespace>UnRAR</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>14.0.24720.0</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>build\unrar32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrar32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>build\unrar64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrar64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>build\unrar32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrar32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>build\unrar64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrar64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<FloatingPointModel>Precise</FloatingPointModel>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>UNRAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="archive.cpp" />
|
||||
<ClCompile Include="arcread.cpp" />
|
||||
<ClCompile Include="blake2s.cpp" />
|
||||
<ClCompile Include="cmddata.cpp" />
|
||||
<ClCompile Include="consio.cpp" />
|
||||
<ClCompile Include="crc.cpp" />
|
||||
<ClCompile Include="crypt.cpp" />
|
||||
<ClCompile Include="encname.cpp" />
|
||||
<ClCompile Include="errhnd.cpp" />
|
||||
<ClCompile Include="extinfo.cpp" />
|
||||
<ClCompile Include="extract.cpp" />
|
||||
<ClCompile Include="filcreat.cpp" />
|
||||
<ClCompile Include="file.cpp" />
|
||||
<ClCompile Include="filefn.cpp" />
|
||||
<ClCompile Include="filestr.cpp" />
|
||||
<ClCompile Include="find.cpp" />
|
||||
<ClCompile Include="getbits.cpp" />
|
||||
<ClCompile Include="global.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="hash.cpp" />
|
||||
<ClCompile Include="headers.cpp" />
|
||||
<ClCompile Include="isnt.cpp" />
|
||||
<ClCompile Include="list.cpp" />
|
||||
<ClCompile Include="match.cpp" />
|
||||
<ClCompile Include="options.cpp" />
|
||||
<ClCompile Include="pathfn.cpp" />
|
||||
<ClCompile Include="qopen.cpp" />
|
||||
<ClCompile Include="rar.cpp" />
|
||||
<ClCompile Include="rarpch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="rarvm.cpp" />
|
||||
<ClCompile Include="rawread.cpp" />
|
||||
<ClCompile Include="rdwrfn.cpp" />
|
||||
<ClCompile Include="recvol.cpp" />
|
||||
<ClCompile Include="resource.cpp" />
|
||||
<ClCompile Include="rijndael.cpp" />
|
||||
<ClCompile Include="rs.cpp" />
|
||||
<ClCompile Include="rs16.cpp" />
|
||||
<ClCompile Include="scantree.cpp" />
|
||||
<ClCompile Include="secpassword.cpp" />
|
||||
<ClCompile Include="sha1.cpp" />
|
||||
<ClCompile Include="sha256.cpp" />
|
||||
<ClCompile Include="smallfn.cpp" />
|
||||
<ClCompile Include="strfn.cpp" />
|
||||
<ClCompile Include="strlist.cpp" />
|
||||
<ClCompile Include="system.cpp" />
|
||||
<ClCompile Include="threadpool.cpp" />
|
||||
<ClCompile Include="timefn.cpp" />
|
||||
<ClCompile Include="ui.cpp" />
|
||||
<ClCompile Include="unicode.cpp" />
|
||||
<ClCompile Include="unpack.cpp" />
|
||||
<ClCompile Include="volume.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
838
deps/unrar/UnRARDll.vcxproj
vendored
838
deps/unrar/UnRARDll.vcxproj
vendored
@ -1,420 +1,420 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="release_nocrypt|Win32">
|
||||
<Configuration>release_nocrypt</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="release_nocrypt|x64">
|
||||
<Configuration>release_nocrypt</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>UnRAR</ProjectName>
|
||||
<ProjectGuid>{E815C46C-36C4-499F-BBC2-E772C6B17971}</ProjectGuid>
|
||||
<RootNamespace>UnRAR</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>14.0.24720.0</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>build\unrardll32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>build\unrardll64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>build\unrardll32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>build\unrardll64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
|
||||
<OutDir>build\unrardll32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
|
||||
<OutDir>build\unrardll64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<StructMemberAlignment>4Bytes</StructMemberAlignment>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<StructMemberAlignment>4Bytes</StructMemberAlignment>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>4Bytes</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<FloatingPointModel>Precise</FloatingPointModel>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>4Bytes</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>4Bytes</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<FloatingPointModel>Precise</FloatingPointModel>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll_nocrypt.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>4Bytes</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll_nocrypt.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="archive.cpp" />
|
||||
<ClCompile Include="arcread.cpp" />
|
||||
<ClCompile Include="blake2s.cpp" />
|
||||
<ClCompile Include="cmddata.cpp" />
|
||||
<ClCompile Include="consio.cpp" />
|
||||
<ClCompile Include="crc.cpp" />
|
||||
<ClCompile Include="crypt.cpp" />
|
||||
<ClCompile Include="dll.cpp" />
|
||||
<ClCompile Include="encname.cpp" />
|
||||
<ClCompile Include="errhnd.cpp" />
|
||||
<ClCompile Include="extinfo.cpp" />
|
||||
<ClCompile Include="extract.cpp" />
|
||||
<ClCompile Include="filcreat.cpp" />
|
||||
<ClCompile Include="file.cpp" />
|
||||
<ClCompile Include="filefn.cpp" />
|
||||
<ClCompile Include="filestr.cpp" />
|
||||
<ClCompile Include="find.cpp" />
|
||||
<ClCompile Include="getbits.cpp" />
|
||||
<ClCompile Include="global.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="hash.cpp" />
|
||||
<ClCompile Include="headers.cpp" />
|
||||
<ClCompile Include="isnt.cpp" />
|
||||
<ClCompile Include="match.cpp" />
|
||||
<ClCompile Include="options.cpp" />
|
||||
<ClCompile Include="pathfn.cpp" />
|
||||
<ClCompile Include="qopen.cpp" />
|
||||
<ClCompile Include="rar.cpp" />
|
||||
<ClCompile Include="rarpch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="rarvm.cpp" />
|
||||
<ClCompile Include="rawread.cpp" />
|
||||
<ClCompile Include="rdwrfn.cpp" />
|
||||
<ClCompile Include="rijndael.cpp" />
|
||||
<ClCompile Include="rs.cpp" />
|
||||
<ClCompile Include="rs16.cpp" />
|
||||
<ClCompile Include="scantree.cpp" />
|
||||
<ClCompile Include="secpassword.cpp" />
|
||||
<ClCompile Include="sha1.cpp" />
|
||||
<ClCompile Include="sha256.cpp" />
|
||||
<ClCompile Include="smallfn.cpp" />
|
||||
<ClCompile Include="strfn.cpp" />
|
||||
<ClCompile Include="strlist.cpp" />
|
||||
<ClCompile Include="system.cpp" />
|
||||
<ClCompile Include="threadpool.cpp" />
|
||||
<ClCompile Include="timefn.cpp" />
|
||||
<ClCompile Include="ui.cpp" />
|
||||
<ClCompile Include="unicode.cpp" />
|
||||
<ClCompile Include="unpack.cpp" />
|
||||
<ClCompile Include="volume.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="rar.hpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="dll.rc" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="release_nocrypt|Win32">
|
||||
<Configuration>release_nocrypt</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="release_nocrypt|x64">
|
||||
<Configuration>release_nocrypt</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>UnRAR</ProjectName>
|
||||
<ProjectGuid>{E815C46C-36C4-499F-BBC2-E772C6B17971}</ProjectGuid>
|
||||
<RootNamespace>UnRAR</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v140_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>14.0.24720.0</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>build\unrardll32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>build\unrardll64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>build\unrardll32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>build\unrardll64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
|
||||
<OutDir>build\unrardll32\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll32\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
|
||||
<OutDir>build\unrardll64\$(Configuration)\</OutDir>
|
||||
<IntDir>build\unrardll64\$(Configuration)\obj\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<FloatingPointModel>Precise</FloatingPointModel>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<FloatingPointModel>Precise</FloatingPointModel>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>Cdecl</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll_nocrypt.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<PreprocessorDefinitions>RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>rar.hpp</PrecompiledHeaderFile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<DisableSpecificWarnings>4007;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(OutDir)unrar.dll</OutputFile>
|
||||
<ModuleDefinitionFile>dll_nocrypt.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<LinkTimeCodeGeneration />
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="archive.cpp" />
|
||||
<ClCompile Include="arcread.cpp" />
|
||||
<ClCompile Include="blake2s.cpp" />
|
||||
<ClCompile Include="cmddata.cpp" />
|
||||
<ClCompile Include="consio.cpp" />
|
||||
<ClCompile Include="crc.cpp" />
|
||||
<ClCompile Include="crypt.cpp" />
|
||||
<ClCompile Include="dll.cpp" />
|
||||
<ClCompile Include="encname.cpp" />
|
||||
<ClCompile Include="errhnd.cpp" />
|
||||
<ClCompile Include="extinfo.cpp" />
|
||||
<ClCompile Include="extract.cpp" />
|
||||
<ClCompile Include="filcreat.cpp" />
|
||||
<ClCompile Include="file.cpp" />
|
||||
<ClCompile Include="filefn.cpp" />
|
||||
<ClCompile Include="filestr.cpp" />
|
||||
<ClCompile Include="find.cpp" />
|
||||
<ClCompile Include="getbits.cpp" />
|
||||
<ClCompile Include="global.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="hash.cpp" />
|
||||
<ClCompile Include="headers.cpp" />
|
||||
<ClCompile Include="isnt.cpp" />
|
||||
<ClCompile Include="match.cpp" />
|
||||
<ClCompile Include="options.cpp" />
|
||||
<ClCompile Include="pathfn.cpp" />
|
||||
<ClCompile Include="qopen.cpp" />
|
||||
<ClCompile Include="rar.cpp" />
|
||||
<ClCompile Include="rarpch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='release_nocrypt|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="rarvm.cpp" />
|
||||
<ClCompile Include="rawread.cpp" />
|
||||
<ClCompile Include="rdwrfn.cpp" />
|
||||
<ClCompile Include="rijndael.cpp" />
|
||||
<ClCompile Include="rs.cpp" />
|
||||
<ClCompile Include="rs16.cpp" />
|
||||
<ClCompile Include="scantree.cpp" />
|
||||
<ClCompile Include="secpassword.cpp" />
|
||||
<ClCompile Include="sha1.cpp" />
|
||||
<ClCompile Include="sha256.cpp" />
|
||||
<ClCompile Include="smallfn.cpp" />
|
||||
<ClCompile Include="strfn.cpp" />
|
||||
<ClCompile Include="strlist.cpp" />
|
||||
<ClCompile Include="system.cpp" />
|
||||
<ClCompile Include="threadpool.cpp" />
|
||||
<ClCompile Include="timefn.cpp" />
|
||||
<ClCompile Include="ui.cpp" />
|
||||
<ClCompile Include="unicode.cpp" />
|
||||
<ClCompile Include="unpack.cpp" />
|
||||
<ClCompile Include="volume.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="rar.hpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="dll.rc" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
151
deps/unrar/acknow.txt
vendored
151
deps/unrar/acknow.txt
vendored
@ -1,92 +1,59 @@
|
||||
ACKNOWLEDGMENTS
|
||||
|
||||
* We used "Screaming Fast Galois Field Arithmetic Using Intel
|
||||
SIMD Instructions" paper by James S. Plank, Kevin M. Greenan
|
||||
and Ethan L. Miller to improve Reed-Solomon coding performance.
|
||||
Also we are grateful to Artem Drobanov and Bulat Ziganshin
|
||||
for samples and ideas allowed to make Reed-Solomon coding
|
||||
more efficient.
|
||||
|
||||
* RAR text compression algorithm is based on Dmitry Shkarin PPMII
|
||||
and Dmitry Subbotin carryless rangecoder public domain source code.
|
||||
You may find it in ftp.elf.stuba.sk/pub/pc/pack.
|
||||
|
||||
* RAR encryption includes parts of code from Szymon Stefanek
|
||||
and Brian Gladman AES implementations also as Steve Reid SHA-1 source.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK.
|
||||
All rights reserved.
|
||||
|
||||
LICENSE TERMS
|
||||
|
||||
The free distribution and use of this software in both source and binary
|
||||
form is allowed (with or without changes) provided that:
|
||||
|
||||
1. distributions of this source code include the above copyright
|
||||
notice, this list of conditions and the following disclaimer;
|
||||
|
||||
2. distributions in binary form include the above copyright
|
||||
notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other associated materials;
|
||||
|
||||
3. the copyright holder's name is not used to endorse products
|
||||
built using this software without specific written permission.
|
||||
|
||||
ALTERNATIVELY, provided that this notice is retained in full, this product
|
||||
may be distributed under the terms of the GNU General Public License (GPL),
|
||||
in which case the provisions of the GPL apply INSTEAD OF those given above.
|
||||
|
||||
DISCLAIMER
|
||||
|
||||
This software is provided 'as is' with no explicit or implied warranties
|
||||
in respect of its properties, including, but not limited to, correctness
|
||||
and/or fitness for purpose.
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Source code of this package also as other cryptographic technology
|
||||
and computing project related links are available on Brian Gladman's
|
||||
web site: http://www.gladman.me.uk
|
||||
|
||||
* RAR uses CRC32 function based on Intel Slicing-by-8 algorithm.
|
||||
Original Intel Slicing-by-8 code is available here:
|
||||
|
||||
https://sourceforge.net/projects/slicing-by-8/
|
||||
|
||||
Original Intel Slicing-by-8 code is licensed under BSD License
|
||||
available at http://www.opensource.org/licenses/bsd-license.html
|
||||
|
||||
Copyright (c) 2004-2006 Intel Corporation.
|
||||
All Rights Reserved
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with
|
||||
the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
* RAR archives may optionally include BLAKE2sp hash ( https://blake2.net ),
|
||||
designed by Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn
|
||||
and Christian Winnerlein.
|
||||
|
||||
* Useful hints provided by Alexander Khoroshev and Bulat Ziganshin allowed
|
||||
to significantly improve RAR compression and speed.
|
||||
ACKNOWLEDGMENTS
|
||||
|
||||
* We used "Screaming Fast Galois Field Arithmetic Using Intel
|
||||
SIMD Instructions" paper by James S. Plank, Kevin M. Greenan
|
||||
and Ethan L. Miller to improve Reed-Solomon coding performance.
|
||||
Also we are grateful to Artem Drobanov and Bulat Ziganshin
|
||||
for samples and ideas allowed to make Reed-Solomon coding
|
||||
more efficient.
|
||||
|
||||
* RAR4 text compression algorithm is based on Dmitry Shkarin PPMII
|
||||
and Dmitry Subbotin carryless rangecoder public domain source code.
|
||||
You can find it in ftp.elf.stuba.sk/pub/pc/pack.
|
||||
|
||||
* RAR encryption includes parts of public domain code
|
||||
from Szymon Stefanek AES and Steve Reid SHA-1 implementations.
|
||||
|
||||
* With exception of SFX modules, RAR uses CRC32 function based
|
||||
on Intel Slicing-by-8 algorithm. Original Intel Slicing-by-8 code
|
||||
is available here:
|
||||
|
||||
https://sourceforge.net/projects/slicing-by-8/
|
||||
|
||||
Original Intel Slicing-by-8 code is licensed under BSD License
|
||||
available at http://www.opensource.org/licenses/bsd-license.html
|
||||
|
||||
Copyright (c) 2004-2006 Intel Corporation.
|
||||
All Rights Reserved
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with
|
||||
the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
* RAR archives may optionally include BLAKE2sp hash ( https://blake2.net ),
|
||||
designed by Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn
|
||||
and Christian Winnerlein.
|
||||
|
||||
* Useful hints provided by Alexander Khoroshev and Bulat Ziganshin allowed
|
||||
to significantly improve RAR compression and speed.
|
||||
|
14
deps/unrar/archive.cpp
vendored
14
deps/unrar/archive.cpp
vendored
@ -3,15 +3,15 @@
|
||||
#include "arccmt.cpp"
|
||||
|
||||
|
||||
Archive::Archive(RAROptions *InitCmd)
|
||||
Archive::Archive(CommandData *InitCmd)
|
||||
{
|
||||
Cmd=NULL; // Just in case we'll have an exception in 'new' below.
|
||||
|
||||
DummyCmd=(InitCmd==NULL);
|
||||
Cmd=DummyCmd ? (new RAROptions):InitCmd;
|
||||
Cmd=DummyCmd ? (new CommandData):InitCmd;
|
||||
|
||||
OpenShared=Cmd->OpenShared;
|
||||
Format=RARFMT15;
|
||||
Format=RARFMT_NONE;
|
||||
Solid=false;
|
||||
Volume=false;
|
||||
MainComment=false;
|
||||
@ -31,9 +31,9 @@ Archive::Archive(RAROptions *InitCmd)
|
||||
NextBlockPos=0;
|
||||
|
||||
|
||||
memset(&MainHead,0,sizeof(MainHead));
|
||||
memset(&CryptHead,0,sizeof(CryptHead));
|
||||
memset(&EndArcHead,0,sizeof(EndArcHead));
|
||||
MainHead.Reset();
|
||||
CryptHead={};
|
||||
EndArcHead.Reset();
|
||||
|
||||
VolNumber=0;
|
||||
VolWrite=0;
|
||||
@ -231,7 +231,7 @@ bool Archive::IsArchive(bool EnableBroken)
|
||||
// first file header to set "comment" flag when reading service header.
|
||||
// Unless we are in silent mode, we need to know about presence of comment
|
||||
// immediately after IsArchive call.
|
||||
if (HeadersLeft && (!SilentOpen || !Encrypted))
|
||||
if (HeadersLeft && (!SilentOpen || !Encrypted) && IsSeekable())
|
||||
{
|
||||
int64 SavePos=Tell();
|
||||
int64 SaveCurBlockPos=CurBlockPos,SaveNextBlockPos=NextBlockPos;
|
||||
|
10
deps/unrar/archive.hpp
vendored
10
deps/unrar/archive.hpp
vendored
@ -32,8 +32,8 @@ class Archive:public File
|
||||
size_t ReadHeader14();
|
||||
size_t ReadHeader15();
|
||||
size_t ReadHeader50();
|
||||
void ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb);
|
||||
void RequestArcPassword();
|
||||
void ProcessExtra50(RawRead *Raw,size_t ExtraSize,const BaseBlock *bb);
|
||||
void RequestArcPassword(RarCheckPassword *SelPwd);
|
||||
void UnexpEndArcMsg();
|
||||
void BrokenHeaderMsg();
|
||||
void UnkEncVerMsg(const wchar *Name,const wchar *Info);
|
||||
@ -45,7 +45,7 @@ class Archive:public File
|
||||
#endif
|
||||
ComprDataIO SubDataIO;
|
||||
bool DummyCmd;
|
||||
RAROptions *Cmd;
|
||||
CommandData *Cmd;
|
||||
|
||||
|
||||
RarTime LatestTime;
|
||||
@ -58,7 +58,7 @@ class Archive:public File
|
||||
bool ProhibitQOpen;
|
||||
#endif
|
||||
public:
|
||||
Archive(RAROptions *InitCmd=NULL);
|
||||
Archive(CommandData *InitCmd=NULL);
|
||||
~Archive();
|
||||
static RARFORMAT IsSignature(const byte *D,size_t Size);
|
||||
bool IsArchive(bool EnableBroken);
|
||||
@ -83,7 +83,7 @@ class Archive:public File
|
||||
const wchar *Name,uint Flags);
|
||||
bool ReadSubData(Array<byte> *UnpData,File *DestFile,bool TestMode);
|
||||
HEADER_TYPE GetHeaderType() {return CurHeaderType;}
|
||||
RAROptions* GetRAROptions() {return Cmd;}
|
||||
CommandData* GetCommandData() {return Cmd;}
|
||||
void SetSilentOpen(bool Mode) {SilentOpen=Mode;}
|
||||
#if 0
|
||||
void GetRecoveryInfo(bool Required,int64 *Size,int *Percent);
|
||||
|
119
deps/unrar/arcread.cpp
vendored
119
deps/unrar/arcread.cpp
vendored
@ -100,6 +100,9 @@ void Archive::UnexpEndArcMsg()
|
||||
// If block positions are equal to file size, this is not an error.
|
||||
// It can happen when we reached the end of older RAR 1.5 archive,
|
||||
// which did not have the end of archive block.
|
||||
// We can't replace this check by checking that read size is exactly 0
|
||||
// in the beginning of file header, because in this case the read position
|
||||
// still can be beyond the end of archive.
|
||||
if (CurBlockPos!=ArcSize || NextBlockPos!=ArcSize)
|
||||
{
|
||||
uiMsg(UIERROR_UNEXPEOF,FileName);
|
||||
@ -145,7 +148,7 @@ size_t Archive::ReadHeader15()
|
||||
#ifdef RAR_NOCRYPT // For rarext.dll and unrar_nocrypt.dll.
|
||||
return 0;
|
||||
#else
|
||||
RequestArcPassword();
|
||||
RequestArcPassword(NULL);
|
||||
|
||||
byte Salt[SIZE_SALT30];
|
||||
if (Read(Salt,SIZE_SALT30)!=SIZE_SALT30)
|
||||
@ -251,7 +254,11 @@ size_t Archive::ReadHeader15()
|
||||
hd->SplitAfter=(hd->Flags & LHD_SPLIT_AFTER)!=0;
|
||||
hd->Encrypted=(hd->Flags & LHD_PASSWORD)!=0;
|
||||
hd->SaltSet=(hd->Flags & LHD_SALT)!=0;
|
||||
|
||||
// RAR versions earlier than 2.0 do not set the solid flag
|
||||
// in file header. They use only a global solid archive flag.
|
||||
hd->Solid=FileBlock && (hd->Flags & LHD_SOLID)!=0;
|
||||
|
||||
hd->SubBlock=!FileBlock && (hd->Flags & LHD_SOLID)!=0;
|
||||
hd->Dir=(hd->Flags & LHD_WINDOWMASK)==LHD_DIRECTORY;
|
||||
hd->WinSize=hd->Dir ? 0:0x10000<<((hd->Flags & LHD_WINDOWMASK)>>5);
|
||||
@ -558,6 +565,13 @@ size_t Archive::ReadHeader50()
|
||||
return 0;
|
||||
#else
|
||||
|
||||
if (Cmd->SkipEncrypted)
|
||||
{
|
||||
uiMsg(UIMSG_SKIPENCARC,FileName);
|
||||
FailedHeaderDecryption=true; // Suppress error messages and quit quietly.
|
||||
return 0;
|
||||
}
|
||||
|
||||
byte HeadersInitV[SIZE_INITV];
|
||||
if (Read(HeadersInitV,SIZE_INITV)!=SIZE_INITV)
|
||||
{
|
||||
@ -570,14 +584,20 @@ size_t Archive::ReadHeader50()
|
||||
// in -p<pwd> to not stop batch processing for encrypted archives.
|
||||
bool GlobalPassword=Cmd->Password.IsSet() || uiIsGlobalPasswordSet();
|
||||
|
||||
RarCheckPassword CheckPwd;
|
||||
if (CryptHead.UsePswCheck && !BrokenHeader)
|
||||
CheckPwd.Set(CryptHead.Salt,HeadersInitV,CryptHead.Lg2Count,CryptHead.PswCheck);
|
||||
|
||||
while (true) // Repeat the password prompt for wrong passwords.
|
||||
{
|
||||
RequestArcPassword();
|
||||
RequestArcPassword(CheckPwd.IsSet() ? &CheckPwd:NULL);
|
||||
|
||||
byte PswCheck[SIZE_PSWCHECK];
|
||||
HeadersCrypt.SetCryptKeys(false,CRYPT_RAR50,&Cmd->Password,CryptHead.Salt,HeadersInitV,CryptHead.Lg2Count,NULL,PswCheck);
|
||||
// Verify password validity.
|
||||
if (CryptHead.UsePswCheck && memcmp(PswCheck,CryptHead.PswCheck,SIZE_PSWCHECK)!=0)
|
||||
// Verify password validity. If header is damaged, we cannot rely on
|
||||
// password check value, because it can be damaged too.
|
||||
if (CryptHead.UsePswCheck && !BrokenHeader &&
|
||||
memcmp(PswCheck,CryptHead.PswCheck,SIZE_PSWCHECK)!=0)
|
||||
{
|
||||
if (GlobalPassword) // For -p<pwd> or Ctrl+P.
|
||||
{
|
||||
@ -843,8 +863,6 @@ size_t Archive::ReadHeader50()
|
||||
hd->Dir=(hd->FileFlags & FHFL_DIRECTORY)!=0;
|
||||
hd->WinSize=hd->Dir ? 0:size_t(0x20000)<<((CompInfo>>10)&0xf);
|
||||
|
||||
hd->CryptMethod=hd->Encrypted ? CRYPT_RAR50:CRYPT_NONE;
|
||||
|
||||
char FileName[NM*4];
|
||||
size_t ReadNameSize=Min(NameSize,ASIZE(FileName)-1);
|
||||
Raw.GetB((byte *)FileName,ReadNameSize);
|
||||
@ -868,20 +886,6 @@ size_t Archive::ReadHeader50()
|
||||
if (!FileBlock && hd->CmpName(SUBHEAD_TYPE_CMT))
|
||||
MainComment=true;
|
||||
|
||||
#if 0
|
||||
// For RAR5 format we read the user specified recovery percent here.
|
||||
// It would be useful to do it for shell extension too, so we display
|
||||
// the correct recovery record size in archive properties. But then
|
||||
// we would need to include the entire recovery record processing
|
||||
// code to shell extension, which is not done now.
|
||||
if (!FileBlock && hd->CmpName(SUBHEAD_TYPE_RR) && hd->SubData.Size()>0)
|
||||
{
|
||||
RecoveryPercent=hd->SubData[0];
|
||||
RSBlockHeader Header;
|
||||
GetRRInfo(this,&Header);
|
||||
RecoverySize=Header.RecSectionSize*Header.RecCount;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (BadCRC) // Add the file name to broken header message displayed above.
|
||||
uiMsg(UIERROR_FHEADERBROKEN,Archive::FileName,hd->FileName);
|
||||
@ -904,7 +908,7 @@ size_t Archive::ReadHeader50()
|
||||
|
||||
|
||||
#if !defined(RAR_NOCRYPT)
|
||||
void Archive::RequestArcPassword()
|
||||
void Archive::RequestArcPassword(RarCheckPassword *CheckPwd)
|
||||
{
|
||||
if (!Cmd->Password.IsSet())
|
||||
{
|
||||
@ -934,7 +938,7 @@ void Archive::RequestArcPassword()
|
||||
ErrHandler.Exit(RARX_USERBREAK);
|
||||
}
|
||||
#else
|
||||
if (!uiGetPassword(UIPASSWORD_ARCHIVE,FileName,&Cmd->Password))
|
||||
if (!uiGetPassword(UIPASSWORD_ARCHIVE,FileName,&Cmd->Password,CheckPwd))
|
||||
{
|
||||
Close();
|
||||
uiMsg(UIERROR_INCERRCOUNT); // Prevent archive deleting if delete after extraction is on.
|
||||
@ -947,7 +951,7 @@ void Archive::RequestArcPassword()
|
||||
#endif
|
||||
|
||||
|
||||
void Archive::ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb)
|
||||
void Archive::ProcessExtra50(RawRead *Raw,size_t ExtraSize,const BaseBlock *bb)
|
||||
{
|
||||
// Read extra data from the end of block skipping any fields before it.
|
||||
size_t ExtraStart=Raw->Size()-ExtraSize;
|
||||
@ -970,22 +974,57 @@ void Archive::ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb)
|
||||
if (bb->HeaderType==HEAD_MAIN)
|
||||
{
|
||||
MainHeader *hd=(MainHeader *)bb;
|
||||
if (FieldType==MHEXTRA_LOCATOR)
|
||||
switch(FieldType)
|
||||
{
|
||||
hd->Locator=true;
|
||||
uint Flags=(uint)Raw->GetV();
|
||||
if ((Flags & MHEXTRA_LOCATOR_QLIST)!=0)
|
||||
{
|
||||
uint64 Offset=Raw->GetV();
|
||||
if (Offset!=0) // 0 means that reserved space was not enough to write the offset.
|
||||
hd->QOpenOffset=Offset+CurBlockPos;
|
||||
}
|
||||
if ((Flags & MHEXTRA_LOCATOR_RR)!=0)
|
||||
{
|
||||
uint64 Offset=Raw->GetV();
|
||||
if (Offset!=0) // 0 means that reserved space was not enough to write the offset.
|
||||
hd->RROffset=Offset+CurBlockPos;
|
||||
}
|
||||
case MHEXTRA_LOCATOR:
|
||||
{
|
||||
hd->Locator=true;
|
||||
uint Flags=(uint)Raw->GetV();
|
||||
if ((Flags & MHEXTRA_LOCATOR_QLIST)!=0)
|
||||
{
|
||||
uint64 Offset=Raw->GetV();
|
||||
if (Offset!=0) // 0 means that reserved space was not enough to write the offset.
|
||||
hd->QOpenOffset=Offset+CurBlockPos;
|
||||
}
|
||||
if ((Flags & MHEXTRA_LOCATOR_RR)!=0)
|
||||
{
|
||||
uint64 Offset=Raw->GetV();
|
||||
if (Offset!=0) // 0 means that reserved space was not enough to write the offset.
|
||||
hd->RROffset=Offset+CurBlockPos;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MHEXTRA_METADATA:
|
||||
{
|
||||
uint Flags=(uint)Raw->GetV();
|
||||
if ((Flags & MHEXTRA_METADATA_NAME)!=0)
|
||||
{
|
||||
uint64 NameSize=Raw->GetV();
|
||||
if (NameSize<0x10000) // Prevent excessive allocation.
|
||||
{
|
||||
std::vector<char> NameU((size_t)NameSize); // UTF-8 name.
|
||||
Raw->GetB(&NameU[0],(size_t)NameSize);
|
||||
// If starts from 0, the name was longer than reserved space
|
||||
// when saving this extra field.
|
||||
if (NameU[0]!=0)
|
||||
{
|
||||
NameU.push_back(0);
|
||||
std::vector<wchar> NameW(NameU.size()*4);
|
||||
UtfToWide(&NameU[0],&NameW[0],NameW.size());
|
||||
hd->OrigName.assign(&NameW[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((Flags & MHEXTRA_METADATA_CTIME)!=0)
|
||||
if ((Flags & MHEXTRA_METADATA_UNIXTIME)!=0)
|
||||
if ((Flags & MHEXTRA_METADATA_UNIX_NS)!=0)
|
||||
hd->OrigTime.SetUnixNS(Raw->Get8());
|
||||
else
|
||||
hd->OrigTime.SetUnix((time_t)Raw->Get4());
|
||||
else
|
||||
hd->OrigTime.SetWin(Raw->Get8());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1441,7 +1480,9 @@ bool Archive::ReadSubData(Array<byte> *UnpData,File *DestFile,bool TestMode)
|
||||
{
|
||||
if (SubHead.UnpSize>0x1000000)
|
||||
{
|
||||
// So huge allocation must never happen in valid archives.
|
||||
// Prevent the excessive allocation. When reading to memory, normally
|
||||
// this function operates with reasonably small blocks, such as
|
||||
// the archive comment, NTFS ACL or "Zone.Identifier" NTFS stream.
|
||||
uiMsg(UIERROR_SUBHEADERUNKNOWN,FileName);
|
||||
return false;
|
||||
}
|
||||
|
34
deps/unrar/array.hpp
vendored
34
deps/unrar/array.hpp
vendored
@ -10,7 +10,6 @@ template <class T> class Array
|
||||
size_t BufSize;
|
||||
size_t AllocSize;
|
||||
size_t MaxSize;
|
||||
bool Secure; // Clean memory if true.
|
||||
public:
|
||||
Array();
|
||||
Array(size_t Size);
|
||||
@ -24,14 +23,13 @@ template <class T> class Array
|
||||
void Alloc(size_t Items);
|
||||
void Reset();
|
||||
void SoftReset();
|
||||
void operator = (Array<T> &Src);
|
||||
Array<T>& operator = (const Array<T> &Src);
|
||||
void Push(T Item);
|
||||
void Append(T *Item,size_t Count);
|
||||
T* Addr(size_t Item) {return Buffer+Item;}
|
||||
void SetMaxSize(size_t Size) {MaxSize=Size;}
|
||||
T* Begin() {return Buffer;}
|
||||
T* End() {return Buffer==NULL ? NULL:Buffer+BufSize;}
|
||||
void SetSecure() {Secure=true;}
|
||||
};
|
||||
|
||||
|
||||
@ -41,7 +39,6 @@ template <class T> void Array<T>::CleanData()
|
||||
BufSize=0;
|
||||
AllocSize=0;
|
||||
MaxSize=0;
|
||||
Secure=false;
|
||||
}
|
||||
|
||||
|
||||
@ -71,11 +68,7 @@ template <class T> Array<T>::Array(const Array &Src)
|
||||
template <class T> Array<T>::~Array()
|
||||
{
|
||||
if (Buffer!=NULL)
|
||||
{
|
||||
if (Secure)
|
||||
cleandata(Buffer,AllocSize*sizeof(T));
|
||||
free(Buffer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -111,25 +104,9 @@ template <class T> void Array<T>::Add(size_t Items)
|
||||
size_t Suggested=AllocSize+AllocSize/4+32;
|
||||
size_t NewSize=Max(BufSize,Suggested);
|
||||
|
||||
T *NewBuffer;
|
||||
if (Secure)
|
||||
{
|
||||
NewBuffer=(T *)malloc(NewSize*sizeof(T));
|
||||
if (NewBuffer==NULL)
|
||||
ErrHandler.MemoryError();
|
||||
if (Buffer!=NULL)
|
||||
{
|
||||
memcpy(NewBuffer,Buffer,AllocSize*sizeof(T));
|
||||
cleandata(Buffer,AllocSize*sizeof(T));
|
||||
free(Buffer);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NewBuffer=(T *)realloc(Buffer,NewSize*sizeof(T));
|
||||
if (NewBuffer==NULL)
|
||||
ErrHandler.MemoryError();
|
||||
}
|
||||
T *NewBuffer=(T *)realloc(Buffer,NewSize*sizeof(T));
|
||||
if (NewBuffer==NULL)
|
||||
ErrHandler.MemoryError();
|
||||
Buffer=NewBuffer;
|
||||
AllocSize=NewSize;
|
||||
}
|
||||
@ -165,12 +142,13 @@ template <class T> void Array<T>::SoftReset()
|
||||
}
|
||||
|
||||
|
||||
template <class T> void Array<T>::operator =(Array<T> &Src)
|
||||
template <class T> Array<T>& Array<T>::operator =(const Array<T> &Src)
|
||||
{
|
||||
Reset();
|
||||
Alloc(Src.BufSize);
|
||||
if (Src.BufSize!=0)
|
||||
memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T));
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
|
9
deps/unrar/blake2s.hpp
vendored
9
deps/unrar/blake2s.hpp
vendored
@ -20,10 +20,15 @@ enum blake2s_constant
|
||||
// 'new' operator.
|
||||
struct blake2s_state
|
||||
{
|
||||
enum { BLAKE_ALIGNMENT = 64 };
|
||||
// Use constexpr instead of enums, because otherwise clang -std=c++20
|
||||
// issues a warning about "arithmetic between different enumeration types"
|
||||
// in ubuf[BLAKE_DATA_SIZE + BLAKE_ALIGNMENT] declaration.
|
||||
static constexpr size_t BLAKE_ALIGNMENT = 64;
|
||||
|
||||
// buffer and uint32 h[8], t[2], f[2];
|
||||
enum { BLAKE_DATA_SIZE = 48 + 2 * BLAKE2S_BLOCKBYTES };
|
||||
// 2 * BLAKE2S_BLOCKBYTES is the buf size in blake2_code_20140114.zip.
|
||||
// It might differ in later versions.
|
||||
static constexpr size_t BLAKE_DATA_SIZE = 48 + 2 * BLAKE2S_BLOCKBYTES;
|
||||
|
||||
byte ubuf[BLAKE_DATA_SIZE + BLAKE_ALIGNMENT];
|
||||
|
||||
|
50
deps/unrar/cmddata.cpp
vendored
50
deps/unrar/cmddata.cpp
vendored
@ -26,9 +26,10 @@ void CommandData::Init()
|
||||
FileArgs.Reset();
|
||||
ExclArgs.Reset();
|
||||
InclArgs.Reset();
|
||||
StoreArgs.Reset();
|
||||
ArcNames.Reset();
|
||||
NextVolSizes.Reset();
|
||||
StoreArgs.Reset();
|
||||
Password.Clean();
|
||||
NextVolSizes.clear();
|
||||
}
|
||||
|
||||
|
||||
@ -108,6 +109,11 @@ void CommandData::ParseArg(wchar *Arg)
|
||||
// 'S' can contain SFX name, which case is important in Unix.
|
||||
if (*Command!='I' && *Command!='S')
|
||||
wcsupper(Command);
|
||||
if (*Command=='P') // Enforce -idq for print command.
|
||||
{
|
||||
MsgStream=MSG_ERRONLY;
|
||||
SetConsoleMsgStream(MSG_ERRONLY);
|
||||
}
|
||||
}
|
||||
else
|
||||
if (*ArcName==0)
|
||||
@ -309,6 +315,21 @@ void CommandData::ProcessSwitch(const wchar *Switch)
|
||||
case 'I':
|
||||
IgnoreGeneralAttr=true;
|
||||
break;
|
||||
case 'M':
|
||||
switch(toupperw(Switch[2]))
|
||||
{
|
||||
case 0:
|
||||
case 'S':
|
||||
ArcMetadata=ARCMETA_SAVE;
|
||||
break;
|
||||
case 'R':
|
||||
ArcMetadata=ARCMETA_RESTORE;
|
||||
break;
|
||||
default:
|
||||
BadSwitch(Switch);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'N': // Reserved for archive name.
|
||||
break;
|
||||
case 'O':
|
||||
@ -373,6 +394,9 @@ void CommandData::ProcessSwitch(const wchar *Switch)
|
||||
case '3':
|
||||
ExclPath=EXCL_ABSPATH;
|
||||
break;
|
||||
case '4':
|
||||
wcsncpyz(ExclArcPath,Switch+3,ASIZE(ExclArcPath));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -399,13 +423,15 @@ void CommandData::ProcessSwitch(const wchar *Switch)
|
||||
EncryptHeaders=true;
|
||||
if (Switch[2]!=0)
|
||||
{
|
||||
if (wcslen(Switch+2)>=MAXPASSWORD)
|
||||
uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1);
|
||||
Password.Set(Switch+2);
|
||||
cleandata((void *)Switch,wcslen(Switch)*sizeof(Switch[0]));
|
||||
}
|
||||
else
|
||||
if (!Password.IsSet())
|
||||
{
|
||||
uiGetPassword(UIPASSWORD_GLOBAL,NULL,&Password);
|
||||
uiGetPassword(UIPASSWORD_GLOBAL,NULL,&Password,NULL);
|
||||
eprintf(L"\n");
|
||||
}
|
||||
break;
|
||||
@ -561,6 +587,10 @@ void CommandData::ProcessSwitch(const wchar *Switch)
|
||||
break;
|
||||
case 'D':
|
||||
break;
|
||||
case 'E':
|
||||
if (toupperw(Switch[2])=='S' && Switch[3]==0)
|
||||
SkipEncrypted=true;
|
||||
break;
|
||||
case 'S':
|
||||
{
|
||||
wchar StoreNames[1024];
|
||||
@ -648,6 +678,10 @@ void CommandData::ProcessSwitch(const wchar *Switch)
|
||||
AllowIncompatNames=true;
|
||||
break;
|
||||
#endif
|
||||
case 'P':
|
||||
wcsncpyz(ExtrPath,Switch+2,ASIZE(ExtrPath));
|
||||
AddEndSlash(ExtrPath,ASIZE(ExtrPath));
|
||||
break;
|
||||
case 'R':
|
||||
Overwrite=OVERWRITE_AUTORENAME;
|
||||
break;
|
||||
@ -667,11 +701,13 @@ void CommandData::ProcessSwitch(const wchar *Switch)
|
||||
case 'P':
|
||||
if (Switch[1]==0)
|
||||
{
|
||||
uiGetPassword(UIPASSWORD_GLOBAL,NULL,&Password);
|
||||
uiGetPassword(UIPASSWORD_GLOBAL,NULL,&Password,NULL);
|
||||
eprintf(L"\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wcslen(Switch+1)>=MAXPASSWORD)
|
||||
uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1);
|
||||
Password.Set(Switch+1);
|
||||
cleandata((void *)Switch,wcslen(Switch)*sizeof(Switch[0]));
|
||||
}
|
||||
@ -752,6 +788,10 @@ void CommandData::ProcessSwitch(const wchar *Switch)
|
||||
case 'D':
|
||||
Solid|=SOLID_VOLUME_DEPENDENT;
|
||||
break;
|
||||
case 'I':
|
||||
ProhibitConsoleInput();
|
||||
wcsncpyz(UseStdin,Switch[2] ? Switch+2:L"stdin",ASIZE(UseStdin));
|
||||
break;
|
||||
case 'L':
|
||||
if (IsDigit(Switch[2]))
|
||||
FileSizeLess=atoilw(Switch+2);
|
||||
@ -935,7 +975,7 @@ void CommandData::ProcessCommand()
|
||||
wcsncpyz(ArcName,Name,ASIZE(ArcName));
|
||||
}
|
||||
|
||||
if (wcschr(L"AFUMD",*Command)==NULL)
|
||||
if (wcschr(L"AFUMD",*Command)==NULL && *UseStdin==0)
|
||||
{
|
||||
if (GenerateArcName)
|
||||
{
|
||||
|
8
deps/unrar/cmddata.hpp
vendored
8
deps/unrar/cmddata.hpp
vendored
@ -2,7 +2,7 @@
|
||||
#define _RAR_CMDDATA_
|
||||
|
||||
|
||||
#define DefaultStoreList L"7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lz;lzh;mp3;rar;taz;tgz;xz;z;zip;zipx"
|
||||
#define DefaultStoreList L"7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lz;lzh;mp3;rar;taz;tbz;tbz2;tgz;txz;xz;z;zip;zipx;zst;tzst"
|
||||
|
||||
enum RAR_CMD_LIST_MODE {RCLM_AUTO,RCLM_REJECT_LISTS,RCLM_ACCEPT_LISTS};
|
||||
|
||||
@ -50,7 +50,7 @@ class CommandData:public RAROptions
|
||||
bool GetArcName(wchar *Name,int MaxSize);
|
||||
bool CheckWinSize();
|
||||
|
||||
int GetRecoverySize(const wchar *Str,int DefSize);
|
||||
int GetRecoverySize(const wchar *CmdStr,const wchar *Value,int DefSize);
|
||||
|
||||
#ifndef SFX_MODULE
|
||||
void ReportWrongSwitches(RARFORMAT Format);
|
||||
@ -65,6 +65,10 @@ class CommandData:public RAROptions
|
||||
StringList InclArgs;
|
||||
StringList ArcNames;
|
||||
StringList StoreArgs;
|
||||
|
||||
SecPassword Password;
|
||||
|
||||
std::vector<int64> NextVolSizes;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
6
deps/unrar/cmdfilter.cpp
vendored
6
deps/unrar/cmdfilter.cpp
vendored
@ -262,6 +262,8 @@ bool CommandData::TimeCheck(RarTime &ftm,RarTime &ftc,RarTime &fta)
|
||||
// Return 'true' if we need to exclude the file from processing.
|
||||
bool CommandData::SizeCheck(int64 Size)
|
||||
{
|
||||
if (Size==INT64NDF) // If called from archive formats like bzip2, not storing the file size.
|
||||
return false;
|
||||
if (FileSizeLess!=INT64NDF && Size>=FileSizeLess)
|
||||
return true;
|
||||
if (FileSizeMore!=INT64NDF && Size<=FileSizeMore)
|
||||
@ -287,8 +289,8 @@ int CommandData::IsProcessFile(FileHeader &FileHead,bool *ExactMatch,int MatchTy
|
||||
return 0;
|
||||
if ((FileHead.FileAttr & ExclFileAttr)!=0 || FileHead.Dir && ExclDir)
|
||||
return 0;
|
||||
if (InclAttrSet && (!FileHead.Dir && (FileHead.FileAttr & InclFileAttr)==0 ||
|
||||
FileHead.Dir && !InclDir))
|
||||
if (InclAttrSet && (FileHead.FileAttr & InclFileAttr)==0 &&
|
||||
(!FileHead.Dir || !InclDir))
|
||||
return 0;
|
||||
if (!Dir && SizeCheck(FileHead.UnpSize))
|
||||
return 0;
|
||||
|
23
deps/unrar/cmdmix.cpp
vendored
23
deps/unrar/cmdmix.cpp
vendored
@ -61,14 +61,14 @@ void CommandData::OutHelp(RAR_EXIT ExitCode)
|
||||
MUNRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdE,MCHelpCmdL,
|
||||
MCHelpCmdP,MCHelpCmdT,MCHelpCmdV,MCHelpCmdX,MCHelpSw,MCHelpSwm,
|
||||
MCHelpSwAT,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG,MCHelpSwAI,MCHelpSwAP,
|
||||
MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,
|
||||
MCHelpSwDH,MCHelpSwEP,MCHelpSwEP3,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR,
|
||||
MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwN,MCHelpSwNa,MCHelpSwNal,
|
||||
MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOR,MCHelpSwOW,MCHelpSwP,
|
||||
MCHelpSwPm,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSL,MCHelpSwSM,
|
||||
MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU,
|
||||
MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX,MCHelpSwXa,MCHelpSwXal,
|
||||
MCHelpSwY
|
||||
MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,MCHelpSwDH,MCHelpSwEP,
|
||||
MCHelpSwEP3,MCHelpSwEP4,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR,
|
||||
MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwME,MCHelpSwN,MCHelpSwNa,
|
||||
MCHelpSwNal,MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOP,MCHelpSwOR,
|
||||
MCHelpSwOW,MCHelpSwP,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSI,
|
||||
MCHelpSwSL,MCHelpSwSM,MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,
|
||||
MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX,
|
||||
MCHelpSwXa,MCHelpSwXal,MCHelpSwY
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -92,6 +92,13 @@ void CommandData::OutHelp(RAR_EXIT ExitCode)
|
||||
if (Found)
|
||||
continue;
|
||||
#endif
|
||||
#ifdef _UNIX
|
||||
if (CmpMSGID(Help[I],MRARTitle2))
|
||||
{
|
||||
mprintf(St(MFwrSlTitle2));
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
#if !defined(_UNIX) && !defined(_WIN_ALL)
|
||||
if (CmpMSGID(Help[I],MCHelpSwOW))
|
||||
continue;
|
||||
|
1
deps/unrar/compress.hpp
vendored
1
deps/unrar/compress.hpp
vendored
@ -17,6 +17,7 @@ class PackDef
|
||||
static const uint MAX_INC_LZ_MATCH = MAX_LZ_MATCH + 3;
|
||||
|
||||
static const uint MAX3_LZ_MATCH = 0x101; // Maximum match length for RAR v3.
|
||||
static const uint MAX3_INC_LZ_MATCH = MAX3_LZ_MATCH + 3;
|
||||
static const uint LOW_DIST_REP_COUNT = 16;
|
||||
|
||||
static const uint NC = 306; /* alphabet = {0, 1, 2, ..., NC - 1} */
|
||||
|
61
deps/unrar/consio.cpp
vendored
61
deps/unrar/consio.cpp
vendored
@ -3,6 +3,7 @@
|
||||
|
||||
static MESSAGE_TYPE MsgStream=MSG_STDOUT;
|
||||
static RAR_CHARSET RedirectCharset=RCH_DEFAULT;
|
||||
static bool ProhibitInput=false;
|
||||
|
||||
const int MaxMsgSize=2*NM+2048;
|
||||
|
||||
@ -61,6 +62,12 @@ void SetConsoleRedirectCharset(RAR_CHARSET RedirectCharset)
|
||||
}
|
||||
|
||||
|
||||
void ProhibitConsoleInput()
|
||||
{
|
||||
ProhibitInput=true;
|
||||
}
|
||||
|
||||
|
||||
#ifndef SILENT
|
||||
static void cvt_wprintf(FILE *dest,const wchar *fmt,va_list arglist)
|
||||
{
|
||||
@ -141,28 +148,56 @@ void eprintf(const wchar *fmt,...)
|
||||
|
||||
|
||||
#ifndef SILENT
|
||||
static void QuitIfInputProhibited()
|
||||
{
|
||||
// We cannot handle user prompts if -si is used to read file or archive data
|
||||
// from stdin.
|
||||
if (ProhibitInput)
|
||||
{
|
||||
mprintf(St(MStdinNoInput));
|
||||
ErrHandler.Exit(RARX_FATAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void GetPasswordText(wchar *Str,uint MaxLength)
|
||||
{
|
||||
if (MaxLength==0)
|
||||
return;
|
||||
QuitIfInputProhibited();
|
||||
if (StdinRedirected)
|
||||
getwstr(Str,MaxLength); // Read from pipe or redirected file.
|
||||
else
|
||||
{
|
||||
#ifdef _WIN_ALL
|
||||
HANDLE hConIn=GetStdHandle(STD_INPUT_HANDLE);
|
||||
HANDLE hConOut=GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
DWORD ConInMode,ConOutMode;
|
||||
DWORD Read=0;
|
||||
DWORD ConInMode;
|
||||
GetConsoleMode(hConIn,&ConInMode);
|
||||
GetConsoleMode(hConOut,&ConOutMode);
|
||||
SetConsoleMode(hConIn,ENABLE_LINE_INPUT);
|
||||
SetConsoleMode(hConOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT);
|
||||
SetConsoleMode(hConIn,ENABLE_LINE_INPUT); // Remove ENABLE_ECHO_INPUT.
|
||||
|
||||
// We prefer ReadConsole to ReadFile, so we can read Unicode input.
|
||||
DWORD Read=0;
|
||||
ReadConsole(hConIn,Str,MaxLength-1,&Read,NULL);
|
||||
Str[Read]=0;
|
||||
SetConsoleMode(hConIn,ConInMode);
|
||||
SetConsoleMode(hConOut,ConOutMode);
|
||||
|
||||
// If entered password is longer than MAXPASSWORD and truncated,
|
||||
// read its unread part anyway, so it isn't read later as the second
|
||||
// password for -p switch. Low level FlushConsoleInputBuffer doesn't help
|
||||
// for high level ReadConsole, which in line input mode seems to store
|
||||
// the rest of string in its own internal buffer.
|
||||
if (wcschr(Str,'\r')==NULL) // If '\r' is missing, the password was truncated.
|
||||
while (true)
|
||||
{
|
||||
wchar Trail[64];
|
||||
DWORD TrailRead=0;
|
||||
// Use ASIZE(Trail)-1 to reserve the space for trailing 0.
|
||||
ReadConsole(hConIn,Trail,ASIZE(Trail)-1,&TrailRead,NULL);
|
||||
Trail[TrailRead]=0;
|
||||
if (TrailRead==0 || wcschr(Trail,'\r')!=NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
#else
|
||||
char StrA[MAXPASSWORD*4]; // "*4" for multibyte UTF-8 characters.
|
||||
#if defined(_EMX) || defined (__VMS)
|
||||
@ -190,16 +225,21 @@ bool GetConsolePassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword *
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (!StdinRedirected)
|
||||
// if (!StdinRedirected)
|
||||
if (Type==UIPASSWORD_GLOBAL)
|
||||
eprintf(L"\n%s: ",St(MAskPsw));
|
||||
else
|
||||
eprintf(St(MAskPswFor),FileName);
|
||||
|
||||
wchar PlainPsw[MAXPASSWORD];
|
||||
wchar PlainPsw[MAXPASSWORD+1];
|
||||
GetPasswordText(PlainPsw,ASIZE(PlainPsw));
|
||||
if (*PlainPsw==0 && Type==UIPASSWORD_GLOBAL)
|
||||
return false;
|
||||
if (wcslen(PlainPsw)>=MAXPASSWORD)
|
||||
{
|
||||
PlainPsw[MAXPASSWORD-1]=0;
|
||||
uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1);
|
||||
}
|
||||
if (!StdinRedirected && Type==UIPASSWORD_GLOBAL)
|
||||
{
|
||||
eprintf(St(MReAskPsw));
|
||||
@ -229,6 +269,8 @@ bool getwstr(wchar *str,size_t n)
|
||||
// Print buffered prompt title function before waiting for input.
|
||||
fflush(stderr);
|
||||
|
||||
QuitIfInputProhibited();
|
||||
|
||||
*str=0;
|
||||
#if defined(_WIN_ALL)
|
||||
// fgetws does not work well with non-English text in Windows,
|
||||
@ -240,6 +282,7 @@ bool getwstr(wchar *str,size_t n)
|
||||
Array<char> StrA(n*4); // Up to 4 UTF-8 characters per wchar_t.
|
||||
File SrcFile;
|
||||
SrcFile.SetHandleType(FILE_HANDLESTD);
|
||||
SrcFile.SetLineInputMode(true);
|
||||
int ReadSize=SrcFile.Read(&StrA[0],StrA.Size()-1);
|
||||
if (ReadSize<=0)
|
||||
{
|
||||
|
1
deps/unrar/consio.hpp
vendored
1
deps/unrar/consio.hpp
vendored
@ -4,6 +4,7 @@
|
||||
void InitConsole();
|
||||
void SetConsoleMsgStream(MESSAGE_TYPE MsgStream);
|
||||
void SetConsoleRedirectCharset(RAR_CHARSET RedirectCharset);
|
||||
void ProhibitConsoleInput();
|
||||
void OutComment(const wchar *Comment,size_t Size);
|
||||
|
||||
#ifndef SILENT
|
||||
|
171
deps/unrar/crc.cpp
vendored
171
deps/unrar/crc.cpp
vendored
@ -14,6 +14,12 @@
|
||||
|
||||
#include "rar.hpp"
|
||||
|
||||
#ifndef SFX_MODULE
|
||||
// User suggested to avoid BSD license in SFX module, so they do not need
|
||||
// to include the license to SFX archive.
|
||||
#define USE_SLICING
|
||||
#endif
|
||||
|
||||
static uint crc_tables[8][256]; // Tables for Slicing-by-8.
|
||||
|
||||
|
||||
@ -37,6 +43,7 @@ static void InitTables()
|
||||
{
|
||||
InitCRC32(crc_tables[0]);
|
||||
|
||||
#ifdef USE_SLICING
|
||||
for (uint I=0;I<256;I++) // Build additional lookup tables.
|
||||
{
|
||||
uint C=crc_tables[0][I];
|
||||
@ -46,6 +53,7 @@ static void InitTables()
|
||||
crc_tables[J][I]=C;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -55,6 +63,7 @@ uint CRC32(uint StartCRC,const void *Addr,size_t Size)
|
||||
{
|
||||
byte *Data=(byte *)Addr;
|
||||
|
||||
#ifdef USE_SLICING
|
||||
// Align Data to 8 for better performance.
|
||||
for (;Size>0 && ((size_t)Data & 7);Size--,Data++)
|
||||
StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8);
|
||||
@ -77,6 +86,7 @@ uint CRC32(uint StartCRC,const void *Addr,size_t Size)
|
||||
crc_tables[1][(byte)(NextData >> 16)] ^
|
||||
crc_tables[0][(byte)(NextData >> 24)];
|
||||
}
|
||||
#endif
|
||||
|
||||
for (;Size>0;Size--,Data++) // Process left data.
|
||||
StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8);
|
||||
@ -100,3 +110,164 @@ ushort Checksum14(ushort StartCRC,const void *Addr,size_t Size)
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
static uint64 crc64_tables[8][256]; // Tables for Slicing-by-8 for CRC64.
|
||||
|
||||
void InitCRC64(uint64 *CRCTab)
|
||||
{
|
||||
const uint64 poly=INT32TO64(0xC96C5795, 0xD7870F42); // 0xC96C5795D7870F42;
|
||||
for (uint I=0;I<256;I++)
|
||||
{
|
||||
uint64 C=I;
|
||||
for (uint J=0;J<8;J++)
|
||||
C=(C & 1) ? (C>>1)^poly: (C>>1);
|
||||
CRCTab[I]=C;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void InitTables64()
|
||||
{
|
||||
InitCRC64(crc64_tables[0]);
|
||||
|
||||
for (uint I=0;I<256;I++) // Build additional lookup tables.
|
||||
{
|
||||
uint64 C=crc64_tables[0][I];
|
||||
for (uint J=1;J<8;J++)
|
||||
{
|
||||
C=crc64_tables[0][(byte)C]^(C>>8);
|
||||
crc64_tables[J][I]=C;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// We cannot place the intialization to CRC64(), because we use this function
|
||||
// in multithreaded mode and it conflicts with multithreading.
|
||||
struct CallInitCRC64 {CallInitCRC64() {InitTables64();}} static CallInit64;
|
||||
|
||||
uint64 CRC64(uint64 StartCRC,const void *Addr,size_t Size)
|
||||
{
|
||||
byte *Data=(byte *)Addr;
|
||||
|
||||
// Align Data to 8 for better performance.
|
||||
for (;Size>0 && ((size_t)Data & 7)!=0;Size--,Data++)
|
||||
StartCRC=crc64_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8);
|
||||
|
||||
for (byte *DataEnd=Data+Size/8*8; Data<DataEnd; Data+=8 )
|
||||
{
|
||||
uint64 Index=StartCRC;
|
||||
#ifdef BIG_ENDIAN
|
||||
Index ^= (uint64(Data[0])|(uint64(Data[1])<<8)|(uint64(Data[2])<<16)|(uint64(Data[3])<<24))|
|
||||
(uint64(Data[4])<<32)|(uint64(Data[5])<<40)|(uint64(Data[6])<<48)|(uint64(Data[7])<<56);
|
||||
#else
|
||||
Index ^= *(uint64 *)Data;
|
||||
#endif
|
||||
StartCRC = crc64_tables[ 7 ] [ ( byte ) (Index ) ] ^
|
||||
crc64_tables[ 6 ] [ ( byte ) (Index >> 8 ) ] ^
|
||||
crc64_tables[ 5 ] [ ( byte ) (Index >> 16 ) ] ^
|
||||
crc64_tables[ 4 ] [ ( byte ) (Index >> 24 ) ] ^
|
||||
crc64_tables[ 3 ] [ ( byte ) (Index >> 32 ) ] ^
|
||||
crc64_tables[ 2 ] [ ( byte ) (Index >> 40 ) ] ^
|
||||
crc64_tables[ 1 ] [ ( byte ) (Index >> 48 ) ] ^
|
||||
crc64_tables[ 0 ] [ ( byte ) (Index >> 56 ) ] ;
|
||||
}
|
||||
|
||||
for (Size%=8;Size>0;Size--,Data++) // Process left data.
|
||||
StartCRC=crc64_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8);
|
||||
|
||||
return StartCRC;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static void TestCRC();
|
||||
struct TestCRCStruct {TestCRCStruct() {TestCRC();exit(0);}} GlobalTesCRC;
|
||||
|
||||
void TestCRC()
|
||||
{
|
||||
const uint FirstSize=300;
|
||||
byte b[FirstSize];
|
||||
|
||||
if ((CRC32(0xffffffff,(byte*)"testtesttest",12)^0xffffffff)==0x44608e84)
|
||||
mprintf(L"\nCRC32 test1 OK");
|
||||
else
|
||||
mprintf(L"\nCRC32 test1 FAILED");
|
||||
|
||||
if (CRC32(0,(byte*)"te\x80st",5)==0xB2E5C5AE)
|
||||
mprintf(L"\nCRC32 test2 OK");
|
||||
else
|
||||
mprintf(L"\nCRC32 test2 FAILED");
|
||||
|
||||
for (uint I=0;I<14;I++) // Check for possible int sign extension.
|
||||
b[I]=(byte)0x7f+I;
|
||||
if ((CRC32(0xffffffff,b,14)^0xffffffff)==0x1DFA75DA)
|
||||
mprintf(L"\nCRC32 test3 OK");
|
||||
else
|
||||
mprintf(L"\nCRC32 test3 FAILED");
|
||||
|
||||
for (uint I=0;I<FirstSize;I++)
|
||||
b[I]=(byte)I;
|
||||
uint r32=CRC32(0xffffffff,b,FirstSize);
|
||||
for (uint I=FirstSize;I<1024;I++)
|
||||
{
|
||||
b[0]=(byte)I;
|
||||
r32=CRC32(r32,b,1);
|
||||
}
|
||||
if ((r32^0xffffffff)==0xB70B4C26)
|
||||
mprintf(L"\nCRC32 test4 OK");
|
||||
else
|
||||
mprintf(L"\nCRC32 test4 FAILED");
|
||||
|
||||
if ((CRC64(0xffffffffffffffff,(byte*)"testtesttest",12)^0xffffffffffffffff)==0x7B1C2D230EDEB436)
|
||||
mprintf(L"\nCRC64 test1 OK");
|
||||
else
|
||||
mprintf(L"\nCRC64 test1 FAILED");
|
||||
|
||||
if (CRC64(0,(byte*)"te\x80st",5)==0xB5DBF9583A6EED4A)
|
||||
mprintf(L"\nCRC64 test2 OK");
|
||||
else
|
||||
mprintf(L"\nCRC64 test2 FAILED");
|
||||
|
||||
for (uint I=0;I<14;I++) // Check for possible int sign extension.
|
||||
b[I]=(byte)0x7f+I;
|
||||
if ((CRC64(0xffffffffffffffff,b,14)^0xffffffffffffffff)==0xE019941C05B2820C)
|
||||
mprintf(L"\nCRC64 test3 OK");
|
||||
else
|
||||
mprintf(L"\nCRC64 test3 FAILED");
|
||||
|
||||
for (uint I=0;I<FirstSize;I++)
|
||||
b[I]=(byte)I;
|
||||
uint64 r64=CRC64(0xffffffffffffffff,b,FirstSize);
|
||||
for (uint I=FirstSize;I<1024;I++)
|
||||
{
|
||||
b[0]=(byte)I;
|
||||
r64=CRC64(r64,b,1);
|
||||
}
|
||||
if ((r64^0xffffffffffffffff)==0xD51FB58DC789C400)
|
||||
mprintf(L"\nCRC64 test4 OK");
|
||||
else
|
||||
mprintf(L"\nCRC64 test4 FAILED");
|
||||
|
||||
const size_t BufSize=0x100000;
|
||||
byte *Buf=new byte[BufSize];
|
||||
memset(Buf,0,BufSize);
|
||||
|
||||
clock_t StartTime=clock();
|
||||
r32=0xffffffff;
|
||||
const uint BufCount=5000;
|
||||
for (uint I=0;I<BufCount;I++)
|
||||
r32=CRC32(r32,Buf,BufSize);
|
||||
if (r32!=0) // Otherwise compiler optimizer removes CRC calculation.
|
||||
mprintf(L"\nCRC32 speed: %d MB/s",BufCount*1000/(clock()-StartTime));
|
||||
|
||||
StartTime=clock();
|
||||
r64=0xffffffffffffffff;
|
||||
for (uint I=0;I<BufCount;I++)
|
||||
r64=CRC64(r64,Buf,BufSize);
|
||||
if (r64!=0) // Otherwise compiler optimizer removes CRC calculation.
|
||||
mprintf(L"\nCRC64 speed: %d MB/s",BufCount*1000/(clock()-StartTime));
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
4
deps/unrar/crc.hpp
vendored
4
deps/unrar/crc.hpp
vendored
@ -11,5 +11,9 @@ uint CRC32(uint StartCRC,const void *Addr,size_t Size);
|
||||
ushort Checksum14(ushort StartCRC,const void *Addr,size_t Size);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
void InitCRC64(uint64 *CRCTab);
|
||||
uint64 CRC64(uint64 StartCRC,const void *Addr,size_t Size);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
14
deps/unrar/crypt.cpp
vendored
14
deps/unrar/crypt.cpp
vendored
@ -11,21 +11,12 @@
|
||||
CryptData::CryptData()
|
||||
{
|
||||
Method=CRYPT_NONE;
|
||||
memset(KDF3Cache,0,sizeof(KDF3Cache));
|
||||
memset(KDF5Cache,0,sizeof(KDF5Cache));
|
||||
KDF3CachePos=0;
|
||||
KDF5CachePos=0;
|
||||
memset(CRCTab,0,sizeof(CRCTab));
|
||||
}
|
||||
|
||||
|
||||
CryptData::~CryptData()
|
||||
{
|
||||
cleandata(KDF3Cache,sizeof(KDF3Cache));
|
||||
cleandata(KDF5Cache,sizeof(KDF5Cache));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void CryptData::DecryptBlock(byte *Buf,size_t Size)
|
||||
@ -56,15 +47,18 @@ bool CryptData::SetCryptKeys(bool Encrypt,CRYPT_METHOD Method,
|
||||
SecPassword *Password,const byte *Salt,
|
||||
const byte *InitV,uint Lg2Cnt,byte *HashKey,byte *PswCheck)
|
||||
{
|
||||
if (!Password->IsSet() || Method==CRYPT_NONE)
|
||||
if (Method==CRYPT_NONE || !Password->IsSet())
|
||||
return false;
|
||||
|
||||
CryptData::Method=Method;
|
||||
|
||||
wchar PwdW[MAXPASSWORD];
|
||||
Password->Get(PwdW,ASIZE(PwdW));
|
||||
PwdW[Min(MAXPASSWORD_RAR,MAXPASSWORD)-1]=0; // For compatibility with existing archives.
|
||||
|
||||
char PwdA[MAXPASSWORD];
|
||||
WideToChar(PwdW,PwdA,ASIZE(PwdA));
|
||||
PwdA[Min(MAXPASSWORD_RAR,MAXPASSWORD)-1]=0; // For compatibility with existing archives.
|
||||
|
||||
switch(Method)
|
||||
{
|
||||
|
72
deps/unrar/crypt.hpp
vendored
72
deps/unrar/crypt.hpp
vendored
@ -30,6 +30,18 @@ class CryptData
|
||||
uint Lg2Count; // Log2 of PBKDF2 repetition count.
|
||||
byte PswCheckValue[SHA256_DIGEST_SIZE];
|
||||
byte HashKeyValue[SHA256_DIGEST_SIZE];
|
||||
|
||||
KDF5CacheItem() {Clean();}
|
||||
~KDF5CacheItem() {Clean();}
|
||||
|
||||
void Clean()
|
||||
{
|
||||
cleandata(Salt,sizeof(Salt));
|
||||
cleandata(Key,sizeof(Key));
|
||||
cleandata(&Lg2Count,sizeof(Lg2Count));
|
||||
cleandata(PswCheckValue,sizeof(PswCheckValue));
|
||||
cleandata(HashKeyValue,sizeof(HashKeyValue));
|
||||
}
|
||||
};
|
||||
|
||||
struct KDF3CacheItem
|
||||
@ -39,6 +51,17 @@ class CryptData
|
||||
byte Key[16];
|
||||
byte Init[16];
|
||||
bool SaltPresent;
|
||||
|
||||
KDF3CacheItem() {Clean();}
|
||||
~KDF3CacheItem() {Clean();}
|
||||
|
||||
void Clean()
|
||||
{
|
||||
cleandata(Salt,sizeof(Salt));
|
||||
cleandata(Key,sizeof(Key));
|
||||
cleandata(Init,sizeof(Init));
|
||||
cleandata(&SaltPresent,sizeof(SaltPresent));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -77,7 +100,6 @@ class CryptData
|
||||
ushort Key15[4];
|
||||
public:
|
||||
CryptData();
|
||||
~CryptData();
|
||||
bool SetCryptKeys(bool Encrypt,CRYPT_METHOD Method,SecPassword *Password,
|
||||
const byte *Salt,const byte *InitV,uint Lg2Cnt,
|
||||
byte *HashKey,byte *PswCheck);
|
||||
@ -89,6 +111,54 @@ class CryptData
|
||||
static void SetSalt(byte *Salt,size_t SaltSize);
|
||||
};
|
||||
|
||||
|
||||
class CheckPassword
|
||||
{
|
||||
public:
|
||||
enum CONFIDENCE {CONFIDENCE_HIGH,CONFIDENCE_MEDIUM,CONFIDENCE_LOW};
|
||||
virtual CONFIDENCE GetConfidence()=0;
|
||||
virtual bool Check(SecPassword *Password)=0;
|
||||
};
|
||||
|
||||
class RarCheckPassword:public CheckPassword
|
||||
{
|
||||
private:
|
||||
CryptData *Crypt;
|
||||
uint Lg2Count;
|
||||
byte Salt[SIZE_SALT50];
|
||||
byte InitV[SIZE_INITV];
|
||||
byte PswCheck[SIZE_PSWCHECK];
|
||||
public:
|
||||
RarCheckPassword()
|
||||
{
|
||||
Crypt=NULL;
|
||||
}
|
||||
~RarCheckPassword()
|
||||
{
|
||||
delete Crypt;
|
||||
}
|
||||
void Set(byte *Salt,byte *InitV,uint Lg2Count,byte *PswCheck)
|
||||
{
|
||||
if (Crypt==NULL)
|
||||
Crypt=new CryptData;
|
||||
memcpy(this->Salt,Salt,sizeof(this->Salt));
|
||||
memcpy(this->InitV,InitV,sizeof(this->InitV));
|
||||
this->Lg2Count=Lg2Count;
|
||||
memcpy(this->PswCheck,PswCheck,sizeof(this->PswCheck));
|
||||
}
|
||||
bool IsSet() {return Crypt!=NULL;}
|
||||
|
||||
// RAR5 provides the higly reliable 64 bit password verification value.
|
||||
CONFIDENCE GetConfidence() {return CONFIDENCE_HIGH;}
|
||||
|
||||
bool Check(SecPassword *Password)
|
||||
{
|
||||
byte PswCheck[SIZE_PSWCHECK];
|
||||
Crypt->SetCryptKeys(false,CRYPT_RAR50,Password,Salt,InitV,Lg2Count,NULL,PswCheck);
|
||||
return memcmp(PswCheck,this->PswCheck,sizeof(this->PswCheck))==0;
|
||||
}
|
||||
};
|
||||
|
||||
void GetRnd(byte *RndBuf,size_t BufSize);
|
||||
|
||||
void hmac_sha256(const byte *Key,size_t KeyLength,const byte *Data,
|
||||
|
5
deps/unrar/crypt3.cpp
vendored
5
deps/unrar/crypt3.cpp
vendored
@ -18,8 +18,9 @@ void CryptData::SetKey30(bool Encrypt,SecPassword *Password,const wchar *PwdW,co
|
||||
if (!Cached)
|
||||
{
|
||||
byte RawPsw[2*MAXPASSWORD+SIZE_SALT30];
|
||||
WideToRaw(PwdW,RawPsw,ASIZE(RawPsw));
|
||||
size_t RawLength=2*wcslen(PwdW);
|
||||
size_t PswLength=wcslen(PwdW);
|
||||
size_t RawLength=2*PswLength;
|
||||
WideToRaw(PwdW,PswLength,RawPsw,RawLength);
|
||||
if (Salt!=NULL)
|
||||
{
|
||||
memcpy(RawPsw+RawLength,Salt,SIZE_SALT30);
|
||||
|
12
deps/unrar/crypt5.cpp
vendored
12
deps/unrar/crypt5.cpp
vendored
@ -21,7 +21,7 @@ static void hmac_sha256(const byte *Key,size_t KeyLength,const byte *Data,
|
||||
sha256_context ICtx;
|
||||
|
||||
if (ICtxOpt!=NULL && *SetIOpt)
|
||||
ICtx=*ICtxOpt; // Use already calculated first block context.
|
||||
ICtx=*ICtxOpt; // Use already calculated the first block context.
|
||||
else
|
||||
{
|
||||
// This calculation is the same for all iterations with same password.
|
||||
@ -90,10 +90,10 @@ void pbkdf2(const byte *Pwd, size_t PwdLength,
|
||||
byte SaltData[MaxSalt+4];
|
||||
memcpy(SaltData, Salt, Min(SaltLength,MaxSalt));
|
||||
|
||||
SaltData[SaltLength + 0] = 0; // Salt concatenated to 1.
|
||||
SaltData[SaltLength + 1] = 0;
|
||||
SaltData[SaltLength + 2] = 0;
|
||||
SaltData[SaltLength + 3] = 1;
|
||||
SaltData[SaltLength + 0] = 0; // Block index appened to salt.
|
||||
SaltData[SaltLength + 1] = 0; //
|
||||
SaltData[SaltLength + 2] = 0; // Since we do not request the key width
|
||||
SaltData[SaltLength + 3] = 1; // exceeding HMAC width, it is always 1.
|
||||
|
||||
// First iteration: HMAC of password, salt and block index (1).
|
||||
byte U1[SHA256_DIGEST_SIZE];
|
||||
@ -140,7 +140,7 @@ void CryptData::SetKey50(bool Encrypt,SecPassword *Password,const wchar *PwdW,
|
||||
for (uint I=0;I<ASIZE(KDF5Cache);I++)
|
||||
{
|
||||
KDF5CacheItem *Item=KDF5Cache+I;
|
||||
if (Item->Lg2Count==Lg2Cnt && Item->Pwd==*Password &&
|
||||
if (Item->Pwd==*Password && Item->Lg2Count==Lg2Cnt &&
|
||||
memcmp(Item->Salt,Salt,SIZE_SALT50)==0)
|
||||
{
|
||||
memcpy(Key,Item->Key,sizeof(Key));
|
||||
|
26
deps/unrar/dll.def
vendored
26
deps/unrar/dll.def
vendored
@ -1,13 +1,13 @@
|
||||
EXPORTS
|
||||
RAROpenArchive
|
||||
RAROpenArchiveEx
|
||||
RARCloseArchive
|
||||
RARReadHeader
|
||||
RARReadHeaderEx
|
||||
RARProcessFile
|
||||
RARProcessFileW
|
||||
RARSetCallback
|
||||
RARSetChangeVolProc
|
||||
RARSetProcessDataProc
|
||||
RARSetPassword
|
||||
RARGetDllVersion
|
||||
EXPORTS
|
||||
RAROpenArchive
|
||||
RAROpenArchiveEx
|
||||
RARCloseArchive
|
||||
RARReadHeader
|
||||
RARReadHeaderEx
|
||||
RARProcessFile
|
||||
RARProcessFileW
|
||||
RARSetCallback
|
||||
RARSetChangeVolProc
|
||||
RARSetProcessDataProc
|
||||
RARSetPassword
|
||||
RARGetDllVersion
|
||||
|
56
deps/unrar/dll.rc
vendored
56
deps/unrar/dll.rc
vendored
@ -1,28 +1,28 @@
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 6, 1, 100, 3756
|
||||
PRODUCTVERSION 6, 1, 100, 3756
|
||||
FILEOS VOS__WINDOWS32
|
||||
FILETYPE VFT_APP
|
||||
{
|
||||
BLOCK "StringFileInfo"
|
||||
{
|
||||
BLOCK "040904E4"
|
||||
{
|
||||
VALUE "CompanyName", "Alexander Roshal\0"
|
||||
VALUE "ProductName", "RAR decompression library\0"
|
||||
VALUE "FileDescription", "RAR decompression library\0"
|
||||
VALUE "FileVersion", "6.1.0\0"
|
||||
VALUE "ProductVersion", "6.1.0\0"
|
||||
VALUE "LegalCopyright", "Copyright © Alexander Roshal 1993-2021\0"
|
||||
VALUE "OriginalFilename", "Unrar.dll\0"
|
||||
}
|
||||
}
|
||||
BLOCK "VarFileInfo"
|
||||
{
|
||||
VALUE "Translation", 0x0409, 0x04E4
|
||||
}
|
||||
}
|
||||
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 6, 22, 1, 865
|
||||
PRODUCTVERSION 6, 22, 1, 865
|
||||
FILEOS VOS__WINDOWS32
|
||||
FILETYPE VFT_APP
|
||||
{
|
||||
BLOCK "StringFileInfo"
|
||||
{
|
||||
BLOCK "040904E4"
|
||||
{
|
||||
VALUE "CompanyName", "Alexander Roshal\0"
|
||||
VALUE "ProductName", "RAR decompression library\0"
|
||||
VALUE "FileDescription", "RAR decompression library\0"
|
||||
VALUE "FileVersion", "6.22.1\0"
|
||||
VALUE "ProductVersion", "6.22.1\0"
|
||||
VALUE "LegalCopyright", "Copyright © Alexander Roshal 1993-2023\0"
|
||||
VALUE "OriginalFilename", "Unrar.dll\0"
|
||||
}
|
||||
}
|
||||
BLOCK "VarFileInfo"
|
||||
{
|
||||
VALUE "Translation", 0x0409, 0x04E4
|
||||
}
|
||||
}
|
||||
|
||||
|
26
deps/unrar/dll_nocrypt.def
vendored
26
deps/unrar/dll_nocrypt.def
vendored
@ -1,13 +1,13 @@
|
||||
EXPORTS
|
||||
RAROpenArchive
|
||||
RAROpenArchiveEx
|
||||
RARCloseArchive
|
||||
RARReadHeader
|
||||
RARReadHeaderEx
|
||||
RARProcessFile
|
||||
RARProcessFileW
|
||||
RARSetCallback
|
||||
RARSetChangeVolProc
|
||||
RARSetProcessDataProc
|
||||
; RARSetPassword
|
||||
RARGetDllVersion
|
||||
EXPORTS
|
||||
RAROpenArchive
|
||||
RAROpenArchiveEx
|
||||
RARCloseArchive
|
||||
RARReadHeader
|
||||
RARReadHeaderEx
|
||||
RARProcessFile
|
||||
RARProcessFileW
|
||||
RARSetCallback
|
||||
RARSetChangeVolProc
|
||||
RARSetProcessDataProc
|
||||
; RARSetPassword
|
||||
RARGetDllVersion
|
||||
|
2
deps/unrar/encname.cpp
vendored
2
deps/unrar/encname.cpp
vendored
@ -20,8 +20,6 @@ void EncodeFileName::Decode(char *Name,size_t NameSize,byte *EncName,size_t EncS
|
||||
{
|
||||
if (FlagBits==0)
|
||||
{
|
||||
if (EncPos>=EncSize)
|
||||
break;
|
||||
Flags=EncName[EncPos++];
|
||||
FlagBits=8;
|
||||
}
|
||||
|
3
deps/unrar/encname.hpp
vendored
3
deps/unrar/encname.hpp
vendored
@ -4,9 +4,8 @@
|
||||
class EncodeFileName
|
||||
{
|
||||
private:
|
||||
void AddFlags(int Value);
|
||||
void AddFlags(byte Value,byte *EncName);
|
||||
|
||||
byte *EncName;
|
||||
byte Flags;
|
||||
uint FlagBits;
|
||||
size_t FlagsPos;
|
||||
|
7
deps/unrar/errhnd.cpp
vendored
7
deps/unrar/errhnd.cpp
vendored
@ -169,10 +169,13 @@ void ErrorHandler::OpenErrorMsg(const wchar *FileName)
|
||||
|
||||
void ErrorHandler::OpenErrorMsg(const wchar *ArcName,const wchar *FileName)
|
||||
{
|
||||
Wait(); // Keep GUI responsive if many files cannot be opened when archiving.
|
||||
uiMsg(UIERROR_FILEOPEN,ArcName,FileName);
|
||||
SysErrMsg();
|
||||
SetErrorCode(RARX_OPEN);
|
||||
|
||||
// Keep GUI responsive if many files cannot be opened when archiving.
|
||||
// Call after SysErrMsg to avoid modifying the error code and SysErrMsg text.
|
||||
Wait();
|
||||
}
|
||||
|
||||
|
||||
@ -367,7 +370,7 @@ bool ErrorHandler::GetSysErrMsg(wchar *Msg,size_t Size)
|
||||
|
||||
void ErrorHandler::SysErrMsg()
|
||||
{
|
||||
#if !defined(SFX_MODULE) && !defined(SILENT)
|
||||
#ifndef SILENT
|
||||
wchar Msg[1024];
|
||||
if (!GetSysErrMsg(Msg,ASIZE(Msg)))
|
||||
return;
|
||||
|
89
deps/unrar/extinfo.cpp
vendored
89
deps/unrar/extinfo.cpp
vendored
@ -112,6 +112,68 @@ static bool LinkInPath(const wchar *Name)
|
||||
}
|
||||
|
||||
|
||||
// Delete symbolic links in file path, if any, and replace them by directories.
|
||||
// Prevents extracting files outside of destination folder with symlink chains.
|
||||
bool LinksToDirs(const wchar *SrcName,const wchar *SkipPart,std::wstring &LastChecked)
|
||||
{
|
||||
// Unlike Unix, Windows doesn't expand lnk1 in symlink targets like
|
||||
// "lnk1/../dir", but converts the path to "dir". In Unix we need to call
|
||||
// this function to prevent placing unpacked files outside of destination
|
||||
// folder if previously we unpacked "dir/lnk1" -> "..",
|
||||
// "dir/lnk2" -> "lnk1/.." and "dir/lnk2/anypath/poc.txt".
|
||||
// We may still need this function to prevent abusing symlink chains
|
||||
// in link source path if we remove detection of such chains
|
||||
// in IsRelativeSymlinkSafe. This function seems to make other symlink
|
||||
// related safety checks redundant, but for now we prefer to keep them too.
|
||||
//
|
||||
// 2022.12.01: the performance impact is minimized after adding the check
|
||||
// against the previous path and enabling this verification only after
|
||||
// extracting a symlink with ".." in target. So we enabled it for Windows
|
||||
// as well for extra safety.
|
||||
//#ifdef _UNIX
|
||||
wchar Path[NM];
|
||||
if (wcslen(SrcName)>=ASIZE(Path))
|
||||
return false; // It should not be that long, skip.
|
||||
wcsncpyz(Path,SrcName,ASIZE(Path));
|
||||
|
||||
size_t SkipLength=wcslen(SkipPart);
|
||||
|
||||
if (SkipLength>0 && wcsncmp(Path,SkipPart,SkipLength)!=0)
|
||||
SkipLength=0; // Parameter validation, not really needed now.
|
||||
|
||||
// Do not check parts already checked in previous path to improve performance.
|
||||
for (uint I=0;Path[I]!=0 && I<LastChecked.size() && Path[I]==LastChecked[I];I++)
|
||||
if (IsPathDiv(Path[I]) && I>SkipLength)
|
||||
SkipLength=I;
|
||||
|
||||
wchar *Name=Path;
|
||||
if (SkipLength>0)
|
||||
{
|
||||
// Avoid converting symlinks in destination path part specified by user.
|
||||
Name+=SkipLength;
|
||||
while (IsPathDiv(*Name))
|
||||
Name++;
|
||||
}
|
||||
|
||||
for (wchar *s=Path+wcslen(Path)-1;s>Name;s--)
|
||||
if (IsPathDiv(*s))
|
||||
{
|
||||
*s=0;
|
||||
FindData FD;
|
||||
if (FindFile::FastFind(Path,&FD,true) && FD.IsLink)
|
||||
#ifdef _WIN_ALL
|
||||
if (!DelDir(Path))
|
||||
#else
|
||||
if (!DelFile(Path))
|
||||
#endif
|
||||
return false; // Couldn't delete the symlink to replace it with directory.
|
||||
}
|
||||
LastChecked=SrcName;
|
||||
//#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *PrepSrcName,const wchar *TargetName)
|
||||
{
|
||||
// Catch root dir based /path/file paths also as stuff like \\?\.
|
||||
@ -131,10 +193,14 @@ bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *Pr
|
||||
UpLevels++;
|
||||
TargetName++;
|
||||
}
|
||||
// If link target includes "..", it must not have another links
|
||||
// in the path, because they can bypass our safety check. For example,
|
||||
// If link target includes "..", it must not have another links in its
|
||||
// source path, because they can bypass our safety check. For example,
|
||||
// suppose we extracted "lnk1" -> "." first and "lnk1/lnk2" -> ".." next
|
||||
// or "dir/lnk1" -> ".." first and "dir/lnk1/lnk2" -> ".." next.
|
||||
// or "dir/lnk1" -> ".." first, "dir/lnk1/lnk2" -> ".." next and
|
||||
// file "dir/lnk1/lnk2/poc.txt" last.
|
||||
// Do not confuse with link chains in target, this is in link source path.
|
||||
// It is important for Windows too, though this check can be omitted
|
||||
// if LinksToDirs is invoked in Windows as well.
|
||||
if (UpLevels>0 && LinkInPath(PrepSrcName))
|
||||
return false;
|
||||
|
||||
@ -160,15 +226,26 @@ bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *Pr
|
||||
}
|
||||
|
||||
|
||||
bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName)
|
||||
bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName,bool &UpLink)
|
||||
{
|
||||
// Returning true in Uplink indicates that link target might include ".."
|
||||
// and enables additional checks. It is ok to falsely return true here,
|
||||
// as it implies only the minor performance penalty. But we shall always
|
||||
// return true for links with ".." in target for security reason.
|
||||
|
||||
UpLink=true; // Assume the target might include potentially unsafe "..".
|
||||
#if defined(SAVE_LINKS) && defined(_UNIX) || defined(_WIN_ALL)
|
||||
if (Arc.Format==RARFMT50) // For RAR5 archives we can check RedirName for both Unix and Windows.
|
||||
UpLink=wcsstr(Arc.FileHead.RedirName,L"..")!=NULL;
|
||||
#endif
|
||||
|
||||
#if defined(SAVE_LINKS) && defined(_UNIX)
|
||||
// For RAR 3.x archives we process links even in test mode to skip link data.
|
||||
if (Arc.Format==RARFMT15)
|
||||
return ExtractUnixLink30(Cmd,DataIO,Arc,LinkName);
|
||||
return ExtractUnixLink30(Cmd,DataIO,Arc,LinkName,UpLink);
|
||||
if (Arc.Format==RARFMT50)
|
||||
return ExtractUnixLink50(Cmd,LinkName,&Arc.FileHead);
|
||||
#elif defined _WIN_ALL
|
||||
#elif defined(_WIN_ALL)
|
||||
// RAR 5.0 archives store link information in file header, so there is
|
||||
// no need to additionally test it if we do not create a file.
|
||||
if (Arc.Format==RARFMT50)
|
||||
|
3
deps/unrar/extinfo.hpp
vendored
3
deps/unrar/extinfo.hpp
vendored
@ -1,8 +1,9 @@
|
||||
#ifndef _RAR_EXTINFO_
|
||||
#define _RAR_EXTINFO_
|
||||
|
||||
bool LinksToDirs(const wchar *SrcName,const wchar *SkipPart,std::wstring &LastChecked);
|
||||
bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *PrepSrcName,const wchar *TargetName);
|
||||
bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName);
|
||||
bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName,bool &UpLink);
|
||||
#ifdef _UNIX
|
||||
void SetUnixOwner(Archive &Arc,const wchar *FileName);
|
||||
#endif
|
||||
|
577
deps/unrar/extract.cpp
vendored
577
deps/unrar/extract.cpp
vendored
@ -5,10 +5,30 @@ CmdExtract::CmdExtract(CommandData *Cmd)
|
||||
CmdExtract::Cmd=Cmd;
|
||||
|
||||
*ArcName=0;
|
||||
|
||||
*DestFileName=0;
|
||||
|
||||
ArcAnalyzed=false;
|
||||
Analyze=new AnalyzeData;
|
||||
memset(Analyze,0,sizeof(*Analyze));
|
||||
|
||||
TotalFileCount=0;
|
||||
|
||||
// Common for all archives involved. Set here instead of DoExtract()
|
||||
// to use in unrar.dll too. Allows to avoid LinksToDirs() calls
|
||||
// and save CPU time in no symlinks including ".." in target were extracted.
|
||||
#if defined(_WIN_ALL)
|
||||
// We can't expand symlink path components in another symlink target
|
||||
// in Windows. We can't create symlinks in Android now. Even though we do not
|
||||
// really need LinksToDirs() calls in these systems, we still call it
|
||||
// for extra safety, but only if symlink with ".." in target was extracted.
|
||||
ConvertSymlinkPaths=false;
|
||||
#else
|
||||
// We enable it by default in Unix to care about the case when several
|
||||
// archives are unpacked to same directory with several independent RAR runs.
|
||||
// Worst case performance penalty for a lot of small files seems to be ~3%.
|
||||
ConvertSymlinkPaths=true;
|
||||
#endif
|
||||
|
||||
Unp=new Unpack(&DataIO);
|
||||
#ifdef RAR_SMP
|
||||
Unp->SetThreads(Cmd->Threads);
|
||||
@ -18,7 +38,26 @@ CmdExtract::CmdExtract(CommandData *Cmd)
|
||||
|
||||
CmdExtract::~CmdExtract()
|
||||
{
|
||||
FreeAnalyzeData();
|
||||
delete Unp;
|
||||
delete Analyze;
|
||||
}
|
||||
|
||||
|
||||
void CmdExtract::FreeAnalyzeData()
|
||||
{
|
||||
for (size_t I=0;I<RefList.Size();I++)
|
||||
{
|
||||
// We can have undeleted temporary reference source here if extraction
|
||||
// was interrupted early or if user refused to overwrite prompt.
|
||||
if (RefList[I].TmpName!=NULL)
|
||||
DelFile(RefList[I].TmpName);
|
||||
free(RefList[I].RefName);
|
||||
free(RefList[I].TmpName);
|
||||
}
|
||||
RefList.Reset();
|
||||
|
||||
memset(Analyze,0,sizeof(*Analyze));
|
||||
}
|
||||
|
||||
|
||||
@ -30,10 +69,13 @@ void CmdExtract::DoExtract()
|
||||
PasswordCancelled=false;
|
||||
DataIO.SetCurrentCommand(Cmd->Command[0]);
|
||||
|
||||
FindData FD;
|
||||
while (Cmd->GetArcName(ArcName,ASIZE(ArcName)))
|
||||
if (FindFile::FastFind(ArcName,&FD))
|
||||
DataIO.TotalArcSize+=FD.Size;
|
||||
if (*Cmd->UseStdin==0)
|
||||
{
|
||||
FindData FD;
|
||||
while (Cmd->GetArcName(ArcName,ASIZE(ArcName)))
|
||||
if (FindFile::FastFind(ArcName,&FD))
|
||||
DataIO.TotalArcSize+=FD.Size;
|
||||
}
|
||||
|
||||
Cmd->ArcNames.Rewind();
|
||||
while (Cmd->GetArcName(ArcName,ASIZE(ArcName)))
|
||||
@ -49,8 +91,7 @@ void CmdExtract::DoExtract()
|
||||
if (Code!=EXTRACT_ARC_REPEAT)
|
||||
break;
|
||||
}
|
||||
if (FindFile::FastFind(ArcName,&FD))
|
||||
DataIO.ProcessedArcSize+=FD.Size;
|
||||
DataIO.ProcessedArcSize+=DataIO.LastArcSize;
|
||||
}
|
||||
|
||||
// Clean user entered password. Not really required, just for extra safety.
|
||||
@ -82,7 +123,7 @@ void CmdExtract::DoExtract()
|
||||
|
||||
void CmdExtract::ExtractArchiveInit(Archive &Arc)
|
||||
{
|
||||
DataIO.UnpArcSize=Arc.FileLength();
|
||||
DataIO.AdjustTotalArcSize(&Arc);
|
||||
|
||||
FileCount=0;
|
||||
MatchedArgs=0;
|
||||
@ -98,15 +139,33 @@ void CmdExtract::ExtractArchiveInit(Archive &Arc)
|
||||
AllMatchesExact=true;
|
||||
AnySolidDataUnpackedWell=false;
|
||||
|
||||
ArcAnalyzed=false;
|
||||
|
||||
StartTime.SetCurrentTime();
|
||||
|
||||
LastCheckedSymlink.clear();
|
||||
}
|
||||
|
||||
|
||||
EXTRACT_ARC_CODE CmdExtract::ExtractArchive()
|
||||
{
|
||||
Archive Arc(Cmd);
|
||||
if (!Arc.WOpen(ArcName))
|
||||
return EXTRACT_ARC_NEXT;
|
||||
if (*Cmd->UseStdin!=0)
|
||||
{
|
||||
Arc.SetHandleType(FILE_HANDLESTD);
|
||||
#ifdef USE_QOPEN
|
||||
Arc.SetProhibitQOpen(true);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(_WIN_ALL) && !defined(SFX_MODULE) // WinRAR GUI code also resets the cache.
|
||||
if (*Cmd->Command=='T' || Cmd->Test)
|
||||
ResetFileCache(ArcName); // Reset the file cache when testing an archive.
|
||||
#endif
|
||||
if (!Arc.WOpen(ArcName))
|
||||
return EXTRACT_ARC_NEXT;
|
||||
}
|
||||
|
||||
if (!Arc.IsArchive(true))
|
||||
{
|
||||
@ -155,20 +214,33 @@ EXTRACT_ARC_CODE CmdExtract::ExtractArchive()
|
||||
}
|
||||
#endif
|
||||
|
||||
Arc.ViewComment(); // Must be before possible EXTRACT_ARC_REPEAT.
|
||||
|
||||
int64 VolumeSetSize=0; // Total size of volumes after the current volume.
|
||||
|
||||
#ifndef SFX_MODULE
|
||||
if (!ArcAnalyzed && *Cmd->UseStdin==0)
|
||||
{
|
||||
AnalyzeArchive(Arc.FileName,Arc.Volume,Arc.NewNumbering);
|
||||
ArcAnalyzed=true; // Avoid repeated analysis on EXTRACT_ARC_REPEAT.
|
||||
}
|
||||
#endif
|
||||
|
||||
if (Arc.Volume)
|
||||
{
|
||||
#ifndef SFX_MODULE
|
||||
// Try to speed up extraction for independent solid volumes by starting
|
||||
// extraction from non-first volume if we can.
|
||||
if (!UseExactVolName && Arc.Solid && DetectStartVolume(Arc.FileName,Arc.NewNumbering))
|
||||
if (*Analyze->StartName!=0)
|
||||
{
|
||||
wcsncpyz(ArcName,Analyze->StartName,ASIZE(ArcName));
|
||||
*Analyze->StartName=0;
|
||||
|
||||
UseExactVolName=true;
|
||||
return EXTRACT_ARC_REPEAT;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// Calculate the total size of all accessible volumes.
|
||||
// This size is necessary to display the correct total progress indicator.
|
||||
|
||||
@ -203,7 +275,13 @@ EXTRACT_ARC_CODE CmdExtract::ExtractArchive()
|
||||
else
|
||||
uiStartArchiveExtract(!Cmd->Test,ArcName);
|
||||
|
||||
Arc.ViewComment();
|
||||
#ifndef SFX_MODULE
|
||||
if (Analyze->StartPos!=0)
|
||||
{
|
||||
Arc.Seek(Analyze->StartPos,SEEK_SET);
|
||||
Analyze->StartPos=0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
while (1)
|
||||
@ -216,14 +294,11 @@ EXTRACT_ARC_CODE CmdExtract::ExtractArchive()
|
||||
if (Repeat)
|
||||
{
|
||||
// If we started extraction from not first volume and need to
|
||||
// restart it from first, we must correct DataIO.TotalArcSize
|
||||
// for correct total progress display. We subtract the size
|
||||
// of current volume and all volumes after it and add the size
|
||||
// of new (first) volume.
|
||||
FindData OldArc,NewArc;
|
||||
if (FindFile::FastFind(Arc.FileName,&OldArc) &&
|
||||
FindFile::FastFind(ArcName,&NewArc))
|
||||
DataIO.TotalArcSize-=VolumeSetSize+OldArc.Size-NewArc.Size;
|
||||
// restart it from first, we must set DataIO.TotalArcSize to size
|
||||
// of new first volume to display the total progress correctly.
|
||||
FindData NewArc;
|
||||
if (FindFile::FastFind(ArcName,&NewArc))
|
||||
DataIO.TotalArcSize=NewArc.Size;
|
||||
return EXTRACT_ARC_REPEAT;
|
||||
}
|
||||
else
|
||||
@ -262,7 +337,14 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
return false;
|
||||
|
||||
HEADER_TYPE HeaderType=Arc.GetHeaderType();
|
||||
if (HeaderType!=HEAD_FILE)
|
||||
if (HeaderType==HEAD_FILE)
|
||||
{
|
||||
// Unlike Arc.FileName, ArcName might store an old volume name here.
|
||||
if (Analyze->EndPos!=0 && Analyze->EndPos==Arc.CurBlockPos &&
|
||||
(*Analyze->EndName==0 || wcscmp(Analyze->EndName,Arc.FileName)==0))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifndef SFX_MODULE
|
||||
if (Arc.Format==RARFMT15 && HeaderType==HEAD3_OLDSERVICE && PrevProcessed)
|
||||
@ -305,6 +387,9 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
if (Arc.FileHead.UnpSize<0)
|
||||
Arc.FileHead.UnpSize=0;
|
||||
|
||||
// 2022.03.20: We might remove this check in the future.
|
||||
// It duplicates Analyze->EndPos and Analyze->EndName in all cases except
|
||||
// volumes on removable media.
|
||||
if (!Cmd->Recurse && MatchedArgs>=Cmd->FileArgs.ItemsCount() && AllMatchesExact)
|
||||
return false;
|
||||
|
||||
@ -403,7 +488,39 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
FirstFile=false;
|
||||
#endif
|
||||
|
||||
if (MatchFound || (SkipSolid=Arc.Solid)!=0)
|
||||
bool RefTarget=false;
|
||||
if (!MatchFound)
|
||||
for (size_t I=0;I<RefList.Size();I++)
|
||||
if (wcscmp(ArcFileName,RefList[I].RefName)==0)
|
||||
{
|
||||
ExtractRef *MatchedRef=&RefList[I];
|
||||
|
||||
if (!Cmd->Test) // While harmless, it is useless for 't'.
|
||||
{
|
||||
// If reference source isn't selected, but target is selected,
|
||||
// we unpack the source under the temporary name and then rename
|
||||
// or copy it to target name. We do not unpack it under the target
|
||||
// name immediately, because the same source can be used by multiple
|
||||
// targets and it is possible that first target isn't unpacked
|
||||
// for some reason. Also targets might have associated service blocks
|
||||
// like ACLs. All this would complicate processing a lot.
|
||||
wcsncpyz(DestFileName,*Cmd->TempPath!=0 ? Cmd->TempPath:Cmd->ExtrPath,ASIZE(DestFileName));
|
||||
AddEndSlash(DestFileName,ASIZE(DestFileName));
|
||||
wcsncatz(DestFileName,L"__tmp_reference_source_",ASIZE(DestFileName));
|
||||
MkTemp(DestFileName,ASIZE(DestFileName));
|
||||
MatchedRef->TmpName=wcsdup(DestFileName);
|
||||
}
|
||||
RefTarget=true; // Need it even for 't' to test the reference source.
|
||||
break;
|
||||
}
|
||||
|
||||
if (Arc.FileHead.Encrypted && Cmd->SkipEncrypted)
|
||||
if (Arc.Solid)
|
||||
return false; // Abort the entire extraction for solid archive.
|
||||
else
|
||||
MatchFound=false; // Skip only the current file for non-solid archive.
|
||||
|
||||
if (MatchFound || RefTarget || (SkipSolid=Arc.Solid)!=0)
|
||||
{
|
||||
// First common call of uiStartFileExtract. It is done before overwrite
|
||||
// prompts, so if SkipSolid state is changed below, we'll need to make
|
||||
@ -411,7 +528,8 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
if (!uiStartFileExtract(ArcFileName,!Cmd->Test,Cmd->Test && Command!='I',SkipSolid))
|
||||
return false;
|
||||
|
||||
ExtrPrepareName(Arc,ArcFileName,DestFileName,ASIZE(DestFileName));
|
||||
if (!RefTarget)
|
||||
ExtrPrepareName(Arc,ArcFileName,DestFileName,ASIZE(DestFileName));
|
||||
|
||||
// DestFileName can be set empty in case of excessive -ap switch.
|
||||
ExtrFile=!SkipSolid && *DestFileName!=0 && !Arc.FileHead.SplitBefore;
|
||||
@ -448,9 +566,13 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
return !Arc.Solid; // Can try extracting next file only in non-solid archive.
|
||||
}
|
||||
|
||||
while (true) // Repeat the password prompt for wrong and empty passwords.
|
||||
if (Arc.FileHead.Encrypted)
|
||||
{
|
||||
if (Arc.FileHead.Encrypted)
|
||||
RarCheckPassword CheckPwd;
|
||||
if (Arc.Format==RARFMT50 && Arc.FileHead.UsePswCheck && !Arc.BrokenHeader)
|
||||
CheckPwd.Set(Arc.FileHead.Salt,Arc.FileHead.InitV,Arc.FileHead.Lg2Count,Arc.FileHead.PswCheck);
|
||||
|
||||
while (true) // Repeat the password prompt for wrong and empty passwords.
|
||||
{
|
||||
// Stop archive extracting if user cancelled a password prompt.
|
||||
#ifdef RARDLL
|
||||
@ -460,77 +582,83 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
if (!ExtrGetPassword(Arc,ArcFileName))
|
||||
if (!ExtrGetPassword(Arc,ArcFileName,CheckPwd.IsSet() ? &CheckPwd:NULL))
|
||||
{
|
||||
PasswordCancelled=true;
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Set a password before creating the file, so we can skip creating
|
||||
// in case of wrong password.
|
||||
SecPassword FilePassword=Cmd->Password;
|
||||
#if defined(_WIN_ALL) && !defined(SFX_MODULE)
|
||||
ConvertDosPassword(Arc,FilePassword);
|
||||
#endif
|
||||
// Set a password before creating the file, so we can skip creating
|
||||
// in case of wrong password.
|
||||
SecPassword FilePassword=Cmd->Password;
|
||||
#if defined(_WIN_ALL) && !defined(SFX_MODULE)
|
||||
ConvertDosPassword(Arc,FilePassword);
|
||||
#endif
|
||||
|
||||
byte PswCheck[SIZE_PSWCHECK];
|
||||
DataIO.SetEncryption(false,Arc.FileHead.CryptMethod,&FilePassword,
|
||||
Arc.FileHead.SaltSet ? Arc.FileHead.Salt:NULL,
|
||||
Arc.FileHead.InitV,Arc.FileHead.Lg2Count,
|
||||
Arc.FileHead.HashKey,PswCheck);
|
||||
byte PswCheck[SIZE_PSWCHECK];
|
||||
DataIO.SetEncryption(false,Arc.FileHead.CryptMethod,&FilePassword,
|
||||
Arc.FileHead.SaltSet ? Arc.FileHead.Salt:NULL,
|
||||
Arc.FileHead.InitV,Arc.FileHead.Lg2Count,
|
||||
Arc.FileHead.HashKey,PswCheck);
|
||||
|
||||
// If header is damaged, we cannot rely on password check value,
|
||||
// because it can be damaged too.
|
||||
if (Arc.FileHead.Encrypted && Arc.FileHead.UsePswCheck &&
|
||||
memcmp(Arc.FileHead.PswCheck,PswCheck,SIZE_PSWCHECK)!=0 &&
|
||||
!Arc.BrokenHeader)
|
||||
{
|
||||
if (GlobalPassword) // For -p<pwd> or Ctrl+P to avoid the infinite loop.
|
||||
// If header is damaged, we cannot rely on password check value,
|
||||
// because it can be damaged too.
|
||||
if (Arc.FileHead.UsePswCheck && !Arc.BrokenHeader &&
|
||||
memcmp(Arc.FileHead.PswCheck,PswCheck,SIZE_PSWCHECK)!=0)
|
||||
{
|
||||
// This message is used by Android GUI to reset cached passwords.
|
||||
// Update appropriate code if changed.
|
||||
uiMsg(UIERROR_BADPSW,Arc.FileName,ArcFileName);
|
||||
}
|
||||
else // For passwords entered manually.
|
||||
{
|
||||
// This message is used by Android GUI and Windows GUI and SFX to
|
||||
// reset cached passwords. Update appropriate code if changed.
|
||||
uiMsg(UIWAIT_BADPSW,Arc.FileName,ArcFileName);
|
||||
Cmd->Password.Clean();
|
||||
if (GlobalPassword) // For -p<pwd> or Ctrl+P to avoid the infinite loop.
|
||||
{
|
||||
// This message is used by Android GUI to reset cached passwords.
|
||||
// Update appropriate code if changed.
|
||||
uiMsg(UIERROR_BADPSW,Arc.FileName,ArcFileName);
|
||||
}
|
||||
else // For passwords entered manually.
|
||||
{
|
||||
// This message is used by Android GUI and Windows GUI and SFX to
|
||||
// reset cached passwords. Update appropriate code if changed.
|
||||
uiMsg(UIWAIT_BADPSW,Arc.FileName,ArcFileName);
|
||||
Cmd->Password.Clean();
|
||||
|
||||
// Avoid new requests for unrar.dll to prevent the infinite loop
|
||||
// if app always returns the same password.
|
||||
#ifndef RARDLL
|
||||
continue; // Request a password again.
|
||||
#endif
|
||||
// Avoid new requests for unrar.dll to prevent the infinite loop
|
||||
// if app always returns the same password.
|
||||
#ifndef RARDLL
|
||||
continue; // Request a password again.
|
||||
#endif
|
||||
}
|
||||
#ifdef RARDLL
|
||||
// If we already have ERAR_EOPEN as result of missing volume,
|
||||
// we should not replace it with less precise ERAR_BAD_PASSWORD.
|
||||
if (Cmd->DllError!=ERAR_EOPEN)
|
||||
Cmd->DllError=ERAR_BAD_PASSWORD;
|
||||
#endif
|
||||
ErrHandler.SetErrorCode(RARX_BADPWD);
|
||||
ExtrFile=false;
|
||||
}
|
||||
#ifdef RARDLL
|
||||
// If we already have ERAR_EOPEN as result of missing volume,
|
||||
// we should not replace it with less precise ERAR_BAD_PASSWORD.
|
||||
if (Cmd->DllError!=ERAR_EOPEN)
|
||||
Cmd->DllError=ERAR_BAD_PASSWORD;
|
||||
#endif
|
||||
ErrHandler.SetErrorCode(RARX_BADPWD);
|
||||
ExtrFile=false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
DataIO.SetEncryption(false,CRYPT_NONE,NULL,NULL,NULL,0,NULL,NULL);
|
||||
|
||||
#ifdef RARDLL
|
||||
if (*Cmd->DllDestName!=0)
|
||||
wcsncpyz(DestFileName,Cmd->DllDestName,ASIZE(DestFileName));
|
||||
#endif
|
||||
|
||||
if (ExtrFile && Command!='P' && !Cmd->Test && !Cmd->AbsoluteLinks &&
|
||||
ConvertSymlinkPaths)
|
||||
ExtrFile=LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink);
|
||||
|
||||
File CurFile;
|
||||
|
||||
bool LinkEntry=Arc.FileHead.RedirType!=FSREDIR_NONE;
|
||||
if (LinkEntry && Arc.FileHead.RedirType!=FSREDIR_FILECOPY)
|
||||
if (LinkEntry && (Arc.FileHead.RedirType!=FSREDIR_FILECOPY))
|
||||
{
|
||||
if (ExtrFile && Command!='P' && !Cmd->Test)
|
||||
{
|
||||
// Overwrite prompt for symbolic and hard links.
|
||||
// Overwrite prompt for symbolic and hard links and when we move
|
||||
// a temporary file to the file reference instead of copying it.
|
||||
bool UserReject=false;
|
||||
if (FileExist(DestFileName) && !UserReject)
|
||||
FileCreate(Cmd,NULL,DestFileName,ASIZE(DestFileName),&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime);
|
||||
@ -632,7 +760,7 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
|
||||
uint64 Preallocated=0;
|
||||
if (!TestMode && !Arc.BrokenHeader && Arc.FileHead.UnpSize>1000000 &&
|
||||
Arc.FileHead.PackSize*1024>Arc.FileHead.UnpSize &&
|
||||
Arc.FileHead.PackSize*1024>Arc.FileHead.UnpSize && Arc.IsSeekable() &&
|
||||
(Arc.FileHead.UnpSize<100000000 || Arc.FileLength()>Arc.FileHead.PackSize))
|
||||
{
|
||||
CurFile.Prealloc(Arc.FileHead.UnpSize);
|
||||
@ -650,23 +778,51 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
|
||||
if (Type==FSREDIR_HARDLINK || Type==FSREDIR_FILECOPY)
|
||||
{
|
||||
wchar RedirName[NM];
|
||||
|
||||
// 2022.11.15: Might be needed when unpacking WinRAR 5.0 links with
|
||||
// Unix RAR. WinRAR 5.0 used \ path separators here, when beginning
|
||||
// from 5.10 even Windows version uses / internally and converts
|
||||
// them to \ when reading FHEXTRA_REDIR.
|
||||
// We must perform this conversion before ConvertPath call,
|
||||
// so paths mixing different slashes like \dir1/dir2\file are
|
||||
// processed correctly.
|
||||
SlashToNative(Arc.FileHead.RedirName,RedirName,ASIZE(RedirName));
|
||||
|
||||
ConvertPath(RedirName,RedirName,ASIZE(RedirName));
|
||||
|
||||
wchar NameExisting[NM];
|
||||
ExtrPrepareName(Arc,Arc.FileHead.RedirName,NameExisting,ASIZE(NameExisting));
|
||||
ExtrPrepareName(Arc,RedirName,NameExisting,ASIZE(NameExisting));
|
||||
if (FileCreateMode && *NameExisting!=0) // *NameExisting can be 0 in case of excessive -ap switch.
|
||||
if (Type==FSREDIR_HARDLINK)
|
||||
LinkSuccess=ExtractHardlink(Cmd,DestFileName,NameExisting,ASIZE(NameExisting));
|
||||
else
|
||||
LinkSuccess=ExtractFileCopy(CurFile,Arc.FileName,DestFileName,NameExisting,ASIZE(NameExisting));
|
||||
LinkSuccess=ExtractFileCopy(CurFile,Arc.FileName,RedirName,DestFileName,NameExisting,ASIZE(NameExisting),Arc.FileHead.UnpSize);
|
||||
}
|
||||
else
|
||||
if (Type==FSREDIR_UNIXSYMLINK || Type==FSREDIR_WINSYMLINK || Type==FSREDIR_JUNCTION)
|
||||
{
|
||||
if (FileCreateMode)
|
||||
LinkSuccess=ExtractSymlink(Cmd,DataIO,Arc,DestFileName);
|
||||
{
|
||||
bool UpLink;
|
||||
LinkSuccess=ExtractSymlink(Cmd,DataIO,Arc,DestFileName,UpLink);
|
||||
ConvertSymlinkPaths|=LinkSuccess && UpLink;
|
||||
|
||||
// We do not actually need to reset the cache here if we cache
|
||||
// only the single last checked path, because at this point
|
||||
// it will always contain the link own path and link can't
|
||||
// overwrite its parent folder. But if we ever decide to cache
|
||||
// several already checked paths, we'll need to reset them here.
|
||||
// Otherwise if no files were created in one of such paths,
|
||||
// let's say because of file create error, it might be possible
|
||||
// to overwrite the path with link and avoid checks. We keep this
|
||||
// code here as a reminder in case of possible modifications.
|
||||
LastCheckedSymlink.clear(); // Reset cache for safety reason.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
uiMsg(UIERROR_UNKNOWNEXTRA,Arc.FileName,DestFileName);
|
||||
uiMsg(UIERROR_UNKNOWNEXTRA,Arc.FileName,ArcFileName);
|
||||
LinkSuccess=false;
|
||||
}
|
||||
|
||||
@ -690,6 +846,7 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat)
|
||||
Unp->Init(Arc.FileHead.WinSize,Arc.FileHead.Solid);
|
||||
Unp->SetDestSize(Arc.FileHead.UnpSize);
|
||||
#ifndef SFX_MODULE
|
||||
// RAR 1.3 - 1.5 archives do not set per file solid flag.
|
||||
if (Arc.Format!=RARFMT50 && Arc.FileHead.UnpVer<=15)
|
||||
Unp->DoUnpack(15,FileCount>1 && Arc.Solid);
|
||||
else
|
||||
@ -847,22 +1004,64 @@ void CmdExtract::UnstoreFile(ComprDataIO &DataIO,int64 DestUnpSize)
|
||||
}
|
||||
|
||||
|
||||
bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize)
|
||||
bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,const wchar *RedirName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize,int64 UnpSize)
|
||||
{
|
||||
SlashToNative(NameExisting,NameExisting,NameExistingSize); // Not needed for RAR 5.1+ archives.
|
||||
|
||||
File Existing;
|
||||
if (!Existing.WOpen(NameExisting))
|
||||
if (!Existing.Open(NameExisting))
|
||||
{
|
||||
uiMsg(UIERROR_FILECOPY,ArcName,NameExisting,NameNew);
|
||||
uiMsg(UIERROR_FILECOPYHINT,ArcName);
|
||||
bool OpenFailed=true;
|
||||
// If we couldn't find the existing file, check if match is present
|
||||
// in temporary reference sources list.
|
||||
for (size_t I=0;I<RefList.Size();I++)
|
||||
if (wcscmp(RedirName,RefList[I].RefName)==0 && RefList[I].TmpName!=NULL)
|
||||
{
|
||||
// If only one reference left targeting to this temporary file,
|
||||
// it is faster to move the file instead of copying and deleting it.
|
||||
bool RefMove=RefList[I].RefCount-- == 1;
|
||||
NameExisting=RefList[I].TmpName;
|
||||
if (RefMove) // Only one reference left for this temporary file.
|
||||
{
|
||||
New.Delete(); // Delete the previously opened destination file.
|
||||
// Try moving the file first.
|
||||
bool MoveFailed=!RenameFile(NameExisting,NameNew);
|
||||
if (MoveFailed)
|
||||
{
|
||||
// If move failed, re-create the destination and try coping.
|
||||
if (!New.WCreate(NameNew,FMF_WRITE|FMF_SHAREREAD))
|
||||
return false;
|
||||
RefMove=false; // Try copying below.
|
||||
}
|
||||
else
|
||||
{
|
||||
// If moved successfully, reopen the destination file and seek to
|
||||
// end for SetOpenFileTime() and possible Truncate() calls later.
|
||||
if (New.Open(NameNew))
|
||||
New.Seek(0,SEEK_END);
|
||||
// We already moved the file, so clean the name to not try
|
||||
// deleting non-existent temporary file later.
|
||||
free(RefList[I].TmpName);
|
||||
RefList[I].TmpName=NULL;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (!RefMove)
|
||||
OpenFailed=!Existing.Open(NameExisting);
|
||||
break;
|
||||
}
|
||||
|
||||
if (OpenFailed)
|
||||
{
|
||||
ErrHandler.OpenErrorMsg(NameExisting);
|
||||
uiMsg(UIERROR_FILECOPY,ArcName,NameExisting,NameNew);
|
||||
uiMsg(UIERROR_FILECOPYHINT,ArcName);
|
||||
#ifdef RARDLL
|
||||
Cmd->DllError=ERAR_EREFERENCE;
|
||||
Cmd->DllError=ERAR_EREFERENCE;
|
||||
#endif
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Array<char> Buffer(0x100000);
|
||||
Array<byte> Buffer(0x100000);
|
||||
int64 CopySize=0;
|
||||
|
||||
while (true)
|
||||
@ -871,6 +1070,10 @@ bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar *
|
||||
int ReadSize=Existing.Read(&Buffer[0],Buffer.Size());
|
||||
if (ReadSize==0)
|
||||
break;
|
||||
// Update only the current file progress in WinRAR, set the total to 0
|
||||
// to keep it as is. It looks better for WinRAR.
|
||||
uiExtractProgress(CopySize,UnpSize,0,0);
|
||||
|
||||
New.Write(&Buffer[0],ReadSize);
|
||||
CopySize+=ReadSize;
|
||||
}
|
||||
@ -881,6 +1084,16 @@ bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar *
|
||||
|
||||
void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *DestName,size_t DestSize)
|
||||
{
|
||||
if (Cmd->Test)
|
||||
{
|
||||
// Destination name conversion isn't needed for simple archive test.
|
||||
// This check also allows to avoid issuing "Attempting to correct...
|
||||
// Renaming..." messages in MakeNameCompatible() below for problematic
|
||||
// names like aux.txt when testing an archive.
|
||||
wcsncpyz(DestName,ArcFileName,DestSize);
|
||||
return;
|
||||
}
|
||||
|
||||
wcsncpyz(DestName,Cmd->ExtrPath,DestSize);
|
||||
|
||||
if (*Cmd->ExtrPath!=0)
|
||||
@ -888,6 +1101,8 @@ void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *De
|
||||
wchar LastChar=*PointToLastChar(Cmd->ExtrPath);
|
||||
// We need IsPathDiv check here to correctly handle Unix forward slash
|
||||
// in the end of destination path in Windows: rar x arc dest/
|
||||
// so we call IsPathDiv first instead of just calling AddEndSlash,
|
||||
// which checks for only one type of path separator.
|
||||
// IsDriveDiv is needed for current drive dir: rar x arc d:
|
||||
if (!IsPathDiv(LastChar) && !IsDriveDiv(LastChar))
|
||||
{
|
||||
@ -919,19 +1134,13 @@ void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *De
|
||||
#endif
|
||||
|
||||
#ifndef SFX_MODULE
|
||||
size_t ArcPathLength=wcslen(Cmd->ArcPath);
|
||||
wchar *ArcPath=*Cmd->ExclArcPath!=0 ? Cmd->ExclArcPath:Cmd->ArcPath;
|
||||
size_t ArcPathLength=wcslen(ArcPath);
|
||||
if (ArcPathLength>0)
|
||||
{
|
||||
size_t NameLength=wcslen(ArcFileName);
|
||||
|
||||
// Earlier we compared lengths only here, but then noticed a cosmetic bug
|
||||
// in WinRAR. When extracting a file reference from subfolder with
|
||||
// "Extract relative paths", so WinRAR sets ArcPath, if reference target
|
||||
// is missing, error message removed ArcPath both from reference and target
|
||||
// names. If target was stored in another folder, its name looked wrong.
|
||||
if (NameLength>=ArcPathLength &&
|
||||
wcsnicompc(Cmd->ArcPath,ArcFileName,ArcPathLength)==0 &&
|
||||
(IsPathDiv(Cmd->ArcPath[ArcPathLength-1]) ||
|
||||
if (NameLength>=ArcPathLength && wcsnicompc(ArcPath,ArcFileName,ArcPathLength)==0 &&
|
||||
(IsPathDiv(ArcPath[ArcPathLength-1]) ||
|
||||
IsPathDiv(ArcFileName[ArcPathLength]) || ArcFileName[ArcPathLength]==0))
|
||||
{
|
||||
ArcFileName+=Min(ArcPathLength,NameLength);
|
||||
@ -964,7 +1173,7 @@ void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *De
|
||||
// Must do after Cmd->ArcPath processing above, so file name and arc path
|
||||
// trailing spaces are in sync.
|
||||
if (!Cmd->AllowIncompatNames)
|
||||
MakeNameCompatible(DestName);
|
||||
MakeNameCompatible(DestName,DestSize);
|
||||
#endif
|
||||
|
||||
wchar DiskLetter=toupperw(DestName[0]);
|
||||
@ -1018,18 +1227,14 @@ bool CmdExtract::ExtrDllGetPassword()
|
||||
|
||||
|
||||
#ifndef RARDLL
|
||||
bool CmdExtract::ExtrGetPassword(Archive &Arc,const wchar *ArcFileName)
|
||||
bool CmdExtract::ExtrGetPassword(Archive &Arc,const wchar *ArcFileName,RarCheckPassword *CheckPwd)
|
||||
{
|
||||
if (!Cmd->Password.IsSet())
|
||||
{
|
||||
if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password)/* || !Cmd->Password.IsSet()*/)
|
||||
if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password,CheckPwd)/* || !Cmd->Password.IsSet()*/)
|
||||
{
|
||||
// Suppress "test is ok" message if user cancelled the password prompt.
|
||||
// 2019.03.23: If some archives are tested ok and prompt is cancelled for others,
|
||||
// do we really need to suppress "test is ok"? Also if we set an empty password
|
||||
// and "Use for all archives" in WinRAR Ctrl+P and skip some encrypted archives.
|
||||
// We commented out this UIERROR_INCERRCOUNT for now.
|
||||
// uiMsg(UIERROR_INCERRCOUNT);
|
||||
uiMsg(UIERROR_INCERRCOUNT);
|
||||
return false;
|
||||
}
|
||||
Cmd->ManualPassword=true;
|
||||
@ -1044,7 +1249,7 @@ bool CmdExtract::ExtrGetPassword(Archive &Arc,const wchar *ArcFileName)
|
||||
case -1:
|
||||
ErrHandler.Exit(RARX_USERBREAK);
|
||||
case 2:
|
||||
if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password))
|
||||
if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password,CheckPwd))
|
||||
return false;
|
||||
break;
|
||||
case 3:
|
||||
@ -1120,6 +1325,8 @@ void CmdExtract::ExtrCreateDir(Archive &Arc,const wchar *ArcFileName)
|
||||
DirExist=FileExist(DestFileName) && IsDir(GetFileAttr(DestFileName));
|
||||
if (!DirExist)
|
||||
{
|
||||
if (!Cmd->AbsoluteLinks && ConvertSymlinkPaths)
|
||||
LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink);
|
||||
CreatePath(DestFileName,true,Cmd->DisableNames);
|
||||
MDCode=MakeDir(DestFileName,!Cmd->IgnoreGeneralAttr,Arc.FileHead.FileAttr);
|
||||
}
|
||||
@ -1201,6 +1408,8 @@ bool CmdExtract::ExtrCreateFile(Archive &Arc,File &CurFile)
|
||||
|
||||
MakeNameUsable(DestFileName,true);
|
||||
|
||||
if (!Cmd->AbsoluteLinks && ConvertSymlinkPaths)
|
||||
LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink);
|
||||
CreatePath(DestFileName,true,Cmd->DisableNames);
|
||||
if (FileCreate(Cmd,&CurFile,DestFileName,ASIZE(DestFileName),&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime,true))
|
||||
{
|
||||
@ -1247,31 +1456,59 @@ bool CmdExtract::CheckUnpVer(Archive &Arc,const wchar *ArcFileName)
|
||||
|
||||
|
||||
#ifndef SFX_MODULE
|
||||
// To speed up solid volumes extraction, try to find a non-first start volume,
|
||||
// which still allows to unpack all files. It is possible for independent
|
||||
// solid volumes with solid statistics reset in the beginning.
|
||||
bool CmdExtract::DetectStartVolume(const wchar *VolName,bool NewNumbering)
|
||||
// Find non-matched reference sources in solid and non-solid archives.
|
||||
// Detect the optimal start position for semi-solid archives
|
||||
// and optimal start volume for independent solid volumes.
|
||||
//
|
||||
// Alternatively we could collect references while extracting an archive
|
||||
// and perform the second extraction pass for references only.
|
||||
// But it would be slower for solid archives than scaning headers
|
||||
// in first pass and extracting everything in second, as implemented now.
|
||||
//
|
||||
void CmdExtract::AnalyzeArchive(const wchar *ArcName,bool Volume,bool NewNumbering)
|
||||
{
|
||||
FreeAnalyzeData(); // If processing non-first archive in multiple archives set.
|
||||
|
||||
wchar *ArgName=Cmd->FileArgs.GetString();
|
||||
Cmd->FileArgs.Rewind();
|
||||
if (ArgName!=NULL && (wcscmp(ArgName,L"*")==0 || wcscmp(ArgName,L"*.*")==0))
|
||||
return false; // No need to check further for * and *.* masks.
|
||||
return; // No need to check further for * and *.* masks.
|
||||
|
||||
wchar StartName[NM];
|
||||
*StartName=0;
|
||||
|
||||
// Start search from first volume if all volumes preceding current are available.
|
||||
wchar NextName[NM];
|
||||
GetFirstVolIfFullSet(VolName,NewNumbering,NextName,ASIZE(NextName));
|
||||
if (Volume)
|
||||
GetFirstVolIfFullSet(ArcName,NewNumbering,NextName,ASIZE(NextName));
|
||||
else
|
||||
wcsncpyz(NextName,ArcName,ASIZE(NextName));
|
||||
|
||||
bool MatchFound=false;
|
||||
bool PrevMatched=false;
|
||||
bool OpenNext=false;
|
||||
|
||||
bool Matched=false;
|
||||
while (!Matched)
|
||||
bool FirstVolume=true;
|
||||
|
||||
// We shall set FirstFile once for all volumes and not for each volume.
|
||||
// So we do not reuse the outdated Analyze->StartPos from previous volume
|
||||
// if extracted file resides completely in the beginning of current one.
|
||||
bool FirstFile=true;
|
||||
|
||||
while (true)
|
||||
{
|
||||
Archive Arc(Cmd);
|
||||
if (!Arc.Open(NextName) || !Arc.IsArchive(false) || !Arc.Volume)
|
||||
if (!Arc.Open(NextName) || !Arc.IsArchive(false))
|
||||
{
|
||||
if (OpenNext)
|
||||
{
|
||||
// If we couldn't open trailing volumes, we can't set early exit
|
||||
// parameters. It is possible that some volume are on removable media
|
||||
// and will be provided by user when extracting.
|
||||
*Analyze->EndName=0;
|
||||
Analyze->EndPos=0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
bool OpenNext=false;
|
||||
OpenNext=false;
|
||||
while (Arc.ReadHeader()>0)
|
||||
{
|
||||
Wait();
|
||||
@ -1284,17 +1521,88 @@ bool CmdExtract::DetectStartVolume(const wchar *VolName,bool NewNumbering)
|
||||
}
|
||||
if (HeaderType==HEAD_FILE)
|
||||
{
|
||||
if ((Arc.Format==RARFMT14 || Arc.Format==RARFMT15) && Arc.FileHead.UnpVer<=15)
|
||||
{
|
||||
// RAR versions earlier than 2.0 do not set per file solid flag.
|
||||
// They have only the global archive solid flag, so we can't
|
||||
// reliably analyze them here.
|
||||
OpenNext=false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!Arc.FileHead.SplitBefore)
|
||||
{
|
||||
if (!Arc.FileHead.Solid) // Can start extraction from here.
|
||||
wcsncpyz(StartName,NextName,ASIZE(StartName));
|
||||
if (!MatchFound && !Arc.FileHead.Solid) // Can start extraction from here.
|
||||
{
|
||||
// We would gain nothing and unnecessarily complicate extraction
|
||||
// if we set StartName for first volume or StartPos for first
|
||||
// archived file.
|
||||
if (!FirstVolume)
|
||||
wcsncpyz(Analyze->StartName,NextName,ASIZE(Analyze->StartName));
|
||||
|
||||
// We shall set FirstFile once for all volumes for this code
|
||||
// to work properly. Alternatively we could append
|
||||
// "|| Analyze->StartPos!=0" to the condition, so we do not reuse
|
||||
// the outdated Analyze->StartPos value from previous volume.
|
||||
if (!FirstFile)
|
||||
Analyze->StartPos=Arc.CurBlockPos;
|
||||
}
|
||||
|
||||
if (Cmd->IsProcessFile(Arc.FileHead,NULL,MATCH_WILDSUBPATH,0,NULL,0)!=0)
|
||||
{
|
||||
Matched=true; // First matched file found, must stop further scan.
|
||||
break;
|
||||
MatchFound = true;
|
||||
PrevMatched = true;
|
||||
|
||||
// Reset the previously set early exit position, if any, because
|
||||
// we found a new matched file.
|
||||
Analyze->EndPos=0;
|
||||
|
||||
// Matched file reference pointing at maybe non-matched source file.
|
||||
// Even though we know RedirName, we can't check if source file
|
||||
// is certainly non-matched, because it can be filtered out by
|
||||
// date or attributes, which we do not know here.
|
||||
if (Arc.FileHead.RedirType==FSREDIR_FILECOPY)
|
||||
{
|
||||
bool AlreadyAdded=false;
|
||||
for (size_t I=0;I<RefList.Size();I++)
|
||||
if (wcscmp(Arc.FileHead.RedirName,RefList[I].RefName)==0)
|
||||
{
|
||||
// Increment the reference count if we added such reference
|
||||
// source earlier.
|
||||
RefList[I].RefCount++;
|
||||
AlreadyAdded=true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Limit the maximum size of reference sources list to some
|
||||
// sensible value to prevent the excessive memory allocation.
|
||||
size_t MaxListSize=1000000;
|
||||
|
||||
if (!AlreadyAdded && RefList.Size()<MaxListSize)
|
||||
{
|
||||
ExtractRef Ref={0};
|
||||
Ref.RefName=wcsdup(Arc.FileHead.RedirName);
|
||||
Ref.RefCount=1;
|
||||
RefList.Push(Ref);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PrevMatched) // First non-matched item after matched.
|
||||
{
|
||||
// We would perform the unnecessarily string comparison
|
||||
// when extracting if we set this value for first volume
|
||||
// or non-volume archive.
|
||||
if (!FirstVolume)
|
||||
wcsncpyz(Analyze->EndName,NextName,ASIZE(Analyze->EndName));
|
||||
Analyze->EndPos=Arc.CurBlockPos;
|
||||
}
|
||||
PrevMatched=false;
|
||||
}
|
||||
}
|
||||
|
||||
FirstFile=false;
|
||||
if (Arc.FileHead.SplitAfter)
|
||||
{
|
||||
OpenNext=true; // Allow open next volume.
|
||||
@ -1305,16 +1613,25 @@ bool CmdExtract::DetectStartVolume(const wchar *VolName,bool NewNumbering)
|
||||
}
|
||||
Arc.Close();
|
||||
|
||||
if (!OpenNext)
|
||||
break;
|
||||
if (Volume && OpenNext)
|
||||
{
|
||||
NextVolumeName(NextName,ASIZE(NextName),!Arc.NewNumbering);
|
||||
FirstVolume=false;
|
||||
|
||||
NextVolumeName(NextName,ASIZE(NextName),!Arc.NewNumbering);
|
||||
// Needed for multivolume archives. Added in case some 'break'
|
||||
// will quit early from loop above, so we do not set it in the loop.
|
||||
// Now it can happen for hypothetical archive without file records
|
||||
// and with HEAD_ENDARC record.
|
||||
FirstFile=false;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
bool NewStartFound=wcscmp(VolName,StartName)!=0;
|
||||
if (NewStartFound) // Found a new volume to start extraction.
|
||||
wcsncpyz(ArcName,StartName,ASIZE(ArcName));
|
||||
|
||||
return NewStartFound;
|
||||
|
||||
// If file references are present, we can't reliably skip in semi-solid
|
||||
// archives, because reference source can be present in skipped data.
|
||||
if (RefList.Size()!=0)
|
||||
memset(Analyze,0,sizeof(*Analyze));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
34
deps/unrar/extract.hpp
vendored
34
deps/unrar/extract.hpp
vendored
@ -6,13 +6,32 @@ enum EXTRACT_ARC_CODE {EXTRACT_ARC_NEXT,EXTRACT_ARC_REPEAT};
|
||||
class CmdExtract
|
||||
{
|
||||
private:
|
||||
struct ExtractRef
|
||||
{
|
||||
wchar *RefName;
|
||||
wchar *TmpName;
|
||||
uint64 RefCount;
|
||||
};
|
||||
Array<ExtractRef> RefList;
|
||||
|
||||
struct AnalyzeData
|
||||
{
|
||||
wchar StartName[NM];
|
||||
uint64 StartPos;
|
||||
wchar EndName[NM];
|
||||
uint64 EndPos;
|
||||
} *Analyze;
|
||||
|
||||
bool ArcAnalyzed;
|
||||
|
||||
void FreeAnalyzeData();
|
||||
EXTRACT_ARC_CODE ExtractArchive();
|
||||
bool ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize);
|
||||
bool ExtractFileCopy(File &New,wchar *ArcName,const wchar *RedirName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize,int64 UnpSize);
|
||||
void ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *DestName,size_t DestSize);
|
||||
#ifdef RARDLL
|
||||
bool ExtrDllGetPassword();
|
||||
#else
|
||||
bool ExtrGetPassword(Archive &Arc,const wchar *ArcFileName);
|
||||
bool ExtrGetPassword(Archive &Arc,const wchar *ArcFileName,RarCheckPassword *CheckPwd);
|
||||
#endif
|
||||
#if defined(_WIN_ALL) && !defined(SFX_MODULE)
|
||||
void ConvertDosPassword(Archive &Arc,SecPassword &DestPwd);
|
||||
@ -21,7 +40,7 @@ class CmdExtract
|
||||
bool ExtrCreateFile(Archive &Arc,File &CurFile);
|
||||
bool CheckUnpVer(Archive &Arc,const wchar *ArcFileName);
|
||||
#ifndef SFX_MODULE
|
||||
bool DetectStartVolume(const wchar *VolName,bool NewNumbering);
|
||||
void AnalyzeArchive(const wchar *ArcName,bool Volume,bool NewNumbering);
|
||||
void GetFirstVolIfFullSet(const wchar *SrcName,bool NewNumbering,wchar *DestName,size_t DestSize);
|
||||
#endif
|
||||
|
||||
@ -52,6 +71,15 @@ class CmdExtract
|
||||
bool PrevProcessed; // If previous file was successfully extracted or tested.
|
||||
wchar DestFileName[NM];
|
||||
bool PasswordCancelled;
|
||||
|
||||
// In Windows it is set to true if at least one symlink with ".."
|
||||
// in target was extracted.
|
||||
bool ConvertSymlinkPaths;
|
||||
|
||||
// Last path checked for symlinks. We use it to improve the performance,
|
||||
// so we do not check recently checked folders again.
|
||||
std::wstring LastCheckedSymlink;
|
||||
|
||||
#if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(SILENT)
|
||||
bool Fat32,NotFat32;
|
||||
#endif
|
||||
|
8
deps/unrar/filcreat.cpp
vendored
8
deps/unrar/filcreat.cpp
vendored
@ -1,9 +1,9 @@
|
||||
#include "rar.hpp"
|
||||
|
||||
// If NewFile==NULL, we delete created file after user confirmation.
|
||||
// It is useful we we need to overwrite an existing folder or file,
|
||||
// It is useful if we need to overwrite an existing folder or file,
|
||||
// but need user confirmation for that.
|
||||
bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize,
|
||||
bool FileCreate(CommandData *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize,
|
||||
bool *UserReject,int64 FileSize,RarTime *FileTime,bool WriteOnly)
|
||||
{
|
||||
if (UserReject!=NULL)
|
||||
@ -44,7 +44,9 @@ bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize,
|
||||
}
|
||||
|
||||
// Try to truncate the existing file first instead of delete,
|
||||
// so we preserve existing file permissions such as NTFS permissions.
|
||||
// so we preserve existing file permissions, such as NTFS permissions,
|
||||
// also as "Compressed" attribute and hard links. In GUI version we avoid
|
||||
// deleting an existing file for non-.rar archive formats as well.
|
||||
uint FileMode=WriteOnly ? FMF_WRITE|FMF_SHAREREAD:FMF_UPDATE|FMF_SHAREREAD;
|
||||
if (NewFile!=NULL && NewFile->Create(Name,FileMode))
|
||||
return true;
|
||||
|
2
deps/unrar/filcreat.hpp
vendored
2
deps/unrar/filcreat.hpp
vendored
@ -1,7 +1,7 @@
|
||||
#ifndef _RAR_FILECREATE_
|
||||
#define _RAR_FILECREATE_
|
||||
|
||||
bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize,
|
||||
bool FileCreate(CommandData *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize,
|
||||
bool *UserReject,int64 FileSize=INT64NDF,
|
||||
RarTime *FileTime=NULL,bool WriteOnly=false);
|
||||
|
||||
|
102
deps/unrar/file.cpp
vendored
102
deps/unrar/file.cpp
vendored
@ -7,6 +7,7 @@ File::File()
|
||||
NewFile=false;
|
||||
LastWrite=false;
|
||||
HandleType=FILE_HANDLENORMAL;
|
||||
LineInput=false;
|
||||
SkipClose=false;
|
||||
ErrorType=FILE_SUCCESS;
|
||||
OpenShared=false;
|
||||
@ -14,11 +15,11 @@ File::File()
|
||||
AllowExceptions=true;
|
||||
PreserveAtime=false;
|
||||
#ifdef _WIN_ALL
|
||||
NoSequentialRead=false;
|
||||
CreateMode=FMF_UNDEFINED;
|
||||
#endif
|
||||
ReadErrorMode=FREM_ASK;
|
||||
TruncatedAfterReadError=false;
|
||||
CurFilePos=0;
|
||||
}
|
||||
|
||||
|
||||
@ -58,7 +59,7 @@ bool File::Open(const wchar *Name,uint Mode)
|
||||
uint ShareMode=(Mode & FMF_OPENEXCLUSIVE) ? 0 : FILE_SHARE_READ;
|
||||
if (OpenShared)
|
||||
ShareMode|=FILE_SHARE_WRITE;
|
||||
uint Flags=NoSequentialRead ? 0:FILE_FLAG_SEQUENTIAL_SCAN;
|
||||
uint Flags=FILE_FLAG_SEQUENTIAL_SCAN;
|
||||
FindData FD;
|
||||
if (PreserveAtime)
|
||||
Access|=FILE_WRITE_ATTRIBUTES; // Needed to preserve atime.
|
||||
@ -379,10 +380,11 @@ int File::Read(void *Data,size_t Size)
|
||||
|
||||
if (ReadErrorMode==FREM_IGNORE)
|
||||
FilePos=Tell();
|
||||
int ReadSize;
|
||||
int TotalRead=0;
|
||||
while (true)
|
||||
{
|
||||
ReadSize=DirectRead(Data,Size);
|
||||
int ReadSize=DirectRead(Data,Size);
|
||||
|
||||
if (ReadSize==-1)
|
||||
{
|
||||
ErrorType=FILE_READERROR;
|
||||
@ -396,6 +398,8 @@ int File::Read(void *Data,size_t Size)
|
||||
size_t SizeToRead=Min(Size-I,512);
|
||||
int ReadCode=DirectRead(Data,SizeToRead);
|
||||
ReadSize+=(ReadCode==-1) ? 512:ReadCode;
|
||||
if (ReadSize!=-1)
|
||||
TotalRead+=ReadSize;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -415,9 +419,28 @@ int File::Read(void *Data,size_t Size)
|
||||
ErrHandler.ReadError(FileName);
|
||||
}
|
||||
}
|
||||
TotalRead+=ReadSize; // If ReadSize is -1, TotalRead is also set to -1 here.
|
||||
|
||||
if (HandleType==FILE_HANDLESTD && !LineInput && ReadSize>0 && (uint)ReadSize<Size)
|
||||
{
|
||||
// Unlike regular files, for pipe we can read only as much as was
|
||||
// written at the other end of pipe. We had seen data coming in small
|
||||
// ~80 byte chunks when piping from 'type arc.rar'. Extraction code
|
||||
// would fail if we read an incomplete archive header from stdin.
|
||||
// So here we ensure that requested size is completely read.
|
||||
// But we return the available data immediately in "line input" mode,
|
||||
// when processing user's input in console prompts. Otherwise apps
|
||||
// piping user responses to multiple Ask() prompts can hang if no more
|
||||
// data is available yet and pipe isn't closed.
|
||||
Data=(byte*)Data+ReadSize;
|
||||
Size-=ReadSize;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return ReadSize; // It can return -1 only if AllowExceptions is disabled.
|
||||
if (TotalRead>0) // Can be -1 for error and AllowExceptions disabled.
|
||||
CurFilePos+=TotalRead;
|
||||
return TotalRead; // It can return -1 only if AllowExceptions is disabled.
|
||||
}
|
||||
|
||||
|
||||
@ -499,6 +522,36 @@ bool File::RawSeek(int64 Offset,int Method)
|
||||
{
|
||||
if (hFile==FILE_BAD_HANDLE)
|
||||
return true;
|
||||
if (!IsSeekable()) // To extract archives from stdin with -si.
|
||||
{
|
||||
// We tried to dynamically allocate 32 KB buffer here, but it improved
|
||||
// speed in Windows 10 by mere ~1.5%.
|
||||
byte Buf[4096];
|
||||
if (Method==SEEK_CUR || Method==SEEK_SET && Offset>=CurFilePos)
|
||||
{
|
||||
uint64 SkipSize=Method==SEEK_CUR ? Offset:Offset-CurFilePos;
|
||||
while (SkipSize>0) // Reading to emulate seek forward.
|
||||
{
|
||||
int ReadSize=Read(Buf,(size_t)Min(SkipSize,ASIZE(Buf)));
|
||||
if (ReadSize<=0)
|
||||
return false;
|
||||
SkipSize-=ReadSize;
|
||||
CurFilePos+=ReadSize;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// May need it in FileLength() in Archive::UnexpEndArcMsg() when unpacking
|
||||
// RAR 4.x archives without the end of archive block created with -en.
|
||||
if (Method==SEEK_END)
|
||||
{
|
||||
int ReadSize;
|
||||
while ((ReadSize=Read(Buf,ASIZE(Buf)))>0)
|
||||
CurFilePos+=ReadSize;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false; // Backward seek on unseekable file.
|
||||
}
|
||||
if (Offset<0 && Method!=SEEK_SET)
|
||||
{
|
||||
Offset=(Method==SEEK_CUR ? Tell():FileLength())+Offset;
|
||||
@ -533,6 +586,8 @@ int64 File::Tell()
|
||||
ErrHandler.SeekError(FileName);
|
||||
else
|
||||
return -1;
|
||||
if (!IsSeekable())
|
||||
return CurFilePos;
|
||||
#ifdef _WIN_ALL
|
||||
LONG HighDist=0;
|
||||
uint LowDist=SetFilePointer(hFile,0,&HighDist,FILE_CURRENT);
|
||||
@ -683,17 +738,40 @@ void File::SetCloseFileTimeByName(const wchar *Name,RarTime *ftm,RarTime *fta)
|
||||
}
|
||||
|
||||
|
||||
void File::GetOpenFileTime(RarTime *ft)
|
||||
#ifdef _UNIX
|
||||
void File::StatToRarTime(struct stat &st,RarTime *ftm,RarTime *ftc,RarTime *fta)
|
||||
{
|
||||
#ifdef UNIX_TIME_NS
|
||||
#if defined(_APPLE)
|
||||
if (ftm!=NULL) ftm->SetUnixNS(st.st_mtimespec.tv_sec*(uint64)1000000000+st.st_mtimespec.tv_nsec);
|
||||
if (ftc!=NULL) ftc->SetUnixNS(st.st_ctimespec.tv_sec*(uint64)1000000000+st.st_ctimespec.tv_nsec);
|
||||
if (fta!=NULL) fta->SetUnixNS(st.st_atimespec.tv_sec*(uint64)1000000000+st.st_atimespec.tv_nsec);
|
||||
#else
|
||||
if (ftm!=NULL) ftm->SetUnixNS(st.st_mtim.tv_sec*(uint64)1000000000+st.st_mtim.tv_nsec);
|
||||
if (ftc!=NULL) ftc->SetUnixNS(st.st_ctim.tv_sec*(uint64)1000000000+st.st_ctim.tv_nsec);
|
||||
if (fta!=NULL) fta->SetUnixNS(st.st_atim.tv_sec*(uint64)1000000000+st.st_atim.tv_nsec);
|
||||
#endif
|
||||
#else
|
||||
if (ftm!=NULL) ftm->SetUnix(st.st_mtime);
|
||||
if (ftc!=NULL) ftc->SetUnix(st.st_ctime);
|
||||
if (fta!=NULL) fta->SetUnix(st.st_atime);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void File::GetOpenFileTime(RarTime *ftm,RarTime *ftc,RarTime *fta)
|
||||
{
|
||||
#ifdef _WIN_ALL
|
||||
FILETIME FileTime;
|
||||
GetFileTime(hFile,NULL,NULL,&FileTime);
|
||||
ft->SetWinFT(&FileTime);
|
||||
#endif
|
||||
#if defined(_UNIX) || defined(_EMX)
|
||||
FILETIME ctime,atime,mtime;
|
||||
GetFileTime(hFile,&ctime,&atime,&mtime);
|
||||
if (ftm!=NULL) ftm->SetWinFT(&mtime);
|
||||
if (ftc!=NULL) ftc->SetWinFT(&ctime);
|
||||
if (fta!=NULL) fta->SetWinFT(&atime);
|
||||
#elif defined(_UNIX)
|
||||
struct stat st;
|
||||
fstat(GetFD(),&st);
|
||||
ft->SetUnix(st.st_mtime);
|
||||
StatToRarTime(st,ftm,ftc,fta);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
27
deps/unrar/file.hpp
vendored
27
deps/unrar/file.hpp
vendored
@ -14,8 +14,6 @@
|
||||
#define FILE_BAD_HANDLE NULL
|
||||
#endif
|
||||
|
||||
class RAROptions;
|
||||
|
||||
enum FILE_HANDLETYPE {FILE_HANDLENORMAL,FILE_HANDLESTD};
|
||||
|
||||
enum FILE_ERRORTYPE {FILE_SUCCESS,FILE_NOTFOUND,FILE_READERROR};
|
||||
@ -59,6 +57,16 @@ class File
|
||||
FileHandle hFile;
|
||||
bool LastWrite;
|
||||
FILE_HANDLETYPE HandleType;
|
||||
|
||||
// If we read the user input in console prompts from stdin, we shall
|
||||
// process the available line immediately, not waiting for rest of data.
|
||||
// Otherwise apps piping user responses to multiple Ask() prompts can
|
||||
// hang if no more data is available yet and pipe isn't closed.
|
||||
// If we read RAR archive or other file data from stdin, we shall collect
|
||||
// the entire requested block as long as pipe isn't closed, so we get
|
||||
// complete archive headers, not split between different reads.
|
||||
bool LineInput;
|
||||
|
||||
bool SkipClose;
|
||||
FILE_READ_ERROR_MODE ReadErrorMode;
|
||||
bool NewFile;
|
||||
@ -70,12 +78,17 @@ class File
|
||||
#endif
|
||||
bool PreserveAtime;
|
||||
bool TruncatedAfterReadError;
|
||||
|
||||
int64 CurFilePos; // Used for forward seeks in stdin files.
|
||||
protected:
|
||||
bool OpenShared; // Set by 'Archive' class.
|
||||
public:
|
||||
wchar FileName[NM];
|
||||
|
||||
FILE_ERRORTYPE ErrorType;
|
||||
|
||||
byte *SeekBuf; // To read instead of seek for stdin files.
|
||||
static const size_t SeekBufSize=0x10000;
|
||||
public:
|
||||
File();
|
||||
virtual ~File();
|
||||
@ -106,11 +119,16 @@ class File
|
||||
void SetOpenFileTime(RarTime *ftm,RarTime *ftc=NULL,RarTime *fta=NULL);
|
||||
void SetCloseFileTime(RarTime *ftm,RarTime *fta=NULL);
|
||||
static void SetCloseFileTimeByName(const wchar *Name,RarTime *ftm,RarTime *fta);
|
||||
void GetOpenFileTime(RarTime *ft);
|
||||
#ifdef _UNIX
|
||||
static void StatToRarTime(struct stat &st,RarTime *ftm,RarTime *ftc,RarTime *fta);
|
||||
#endif
|
||||
void GetOpenFileTime(RarTime *ftm,RarTime *ftc=NULL,RarTime *fta=NULL);
|
||||
virtual bool IsOpened() {return hFile!=FILE_BAD_HANDLE;} // 'virtual' for MultiFile class.
|
||||
int64 FileLength();
|
||||
void SetHandleType(FILE_HANDLETYPE Type) {HandleType=Type;}
|
||||
void SetLineInputMode(bool Mode) {LineInput=Mode;}
|
||||
FILE_HANDLETYPE GetHandleType() {return HandleType;}
|
||||
bool IsSeekable() {return HandleType!=FILE_HANDLESTD;}
|
||||
bool IsDevice();
|
||||
static bool RemoveCreated();
|
||||
FileHandle GetHandle() {return hFile;}
|
||||
@ -119,9 +137,6 @@ class File
|
||||
int64 Copy(File &Dest,int64 Length=INT64NDF);
|
||||
void SetAllowDelete(bool Allow) {AllowDelete=Allow;}
|
||||
void SetExceptions(bool Allow) {AllowExceptions=Allow;}
|
||||
#ifdef _WIN_ALL
|
||||
void RemoveSequentialFlag() {NoSequentialRead=true;}
|
||||
#endif
|
||||
void SetPreserveAtime(bool Preserve) {PreserveAtime=Preserve;}
|
||||
bool IsTruncatedAfterReadError() {return TruncatedAfterReadError;}
|
||||
#ifdef _UNIX
|
||||
|
20
deps/unrar/filefn.cpp
vendored
20
deps/unrar/filefn.cpp
vendored
@ -320,7 +320,6 @@ bool SetFileAttr(const wchar *Name,uint Attr)
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
wchar *MkTemp(wchar *Name,size_t MaxSize)
|
||||
{
|
||||
size_t Length=wcslen(Name);
|
||||
@ -354,7 +353,6 @@ wchar *MkTemp(wchar *Name,size_t MaxSize)
|
||||
}
|
||||
return Name;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if !defined(SFX_MODULE)
|
||||
@ -397,7 +395,11 @@ void CalcFileSum(File *SrcFile,uint *CRC32,byte *Blake2,uint Threads,int64 Size,
|
||||
{
|
||||
#ifndef SILENT
|
||||
if ((Flags & CALCFSUM_SHOWPROGRESS)!=0)
|
||||
uiExtractProgress(TotalRead,FileLength,TotalRead,FileLength);
|
||||
{
|
||||
// Update only the current file progress in WinRAR, set the total to 0
|
||||
// to keep it as is. It looks better for WinRAR.
|
||||
uiExtractProgress(TotalRead,FileLength,0,0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((Flags & CALCFSUM_SHOWPERCENT)!=0)
|
||||
@ -517,6 +519,18 @@ bool SetFileCompression(const wchar *Name,bool State)
|
||||
CloseHandle(hFile);
|
||||
return RetCode!=0;
|
||||
}
|
||||
|
||||
|
||||
void ResetFileCache(const wchar *Name)
|
||||
{
|
||||
// To reset file cache in Windows it is enough to open it with
|
||||
// FILE_FLAG_NO_BUFFERING and then close it.
|
||||
HANDLE hSrc=CreateFile(Name,GENERIC_READ,
|
||||
FILE_SHARE_READ|FILE_SHARE_WRITE,
|
||||
NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL);
|
||||
if (hSrc!=INVALID_HANDLE_VALUE)
|
||||
CloseHandle(hSrc);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
3
deps/unrar/filefn.hpp
vendored
3
deps/unrar/filefn.hpp
vendored
@ -27,9 +27,7 @@ bool IsDeleteAllowed(uint FileAttr);
|
||||
void PrepareToDelete(const wchar *Name);
|
||||
uint GetFileAttr(const wchar *Name);
|
||||
bool SetFileAttr(const wchar *Name,uint Attr);
|
||||
#if 0
|
||||
wchar* MkTemp(wchar *Name,size_t MaxSize);
|
||||
#endif
|
||||
|
||||
enum CALCFSUM_FLAGS {CALCFSUM_SHOWTEXT=1,CALCFSUM_SHOWPERCENT=2,CALCFSUM_SHOWPROGRESS=4,CALCFSUM_CURPOS=8};
|
||||
|
||||
@ -41,6 +39,7 @@ bool DelDir(const wchar *Name);
|
||||
|
||||
#if defined(_WIN_ALL) && !defined(SFX_MODULE)
|
||||
bool SetFileCompression(const wchar *Name,bool State);
|
||||
void ResetFileCache(const wchar *Name);
|
||||
#endif
|
||||
|
||||
|
||||
|
12
deps/unrar/find.cpp
vendored
12
deps/unrar/find.cpp
vendored
@ -117,7 +117,7 @@ bool FindFile::FastFind(const wchar *FindMask,FindData *fd,bool GetSymLink)
|
||||
if (hFind==INVALID_HANDLE_VALUE)
|
||||
return false;
|
||||
FindClose(hFind);
|
||||
#else
|
||||
#elif defined(_UNIX)
|
||||
char FindMaskA[NM];
|
||||
WideToChar(FindMask,FindMaskA,ASIZE(FindMaskA));
|
||||
|
||||
@ -143,15 +143,7 @@ bool FindFile::FastFind(const wchar *FindMask,FindData *fd,bool GetSymLink)
|
||||
fd->FileAttr=st.st_mode;
|
||||
fd->Size=st.st_size;
|
||||
|
||||
#ifdef UNIX_TIME_NS
|
||||
fd->mtime.SetUnixNS(st.st_mtim.tv_sec*(uint64)1000000000+st.st_mtim.tv_nsec);
|
||||
fd->atime.SetUnixNS(st.st_atim.tv_sec*(uint64)1000000000+st.st_atim.tv_nsec);
|
||||
fd->ctime.SetUnixNS(st.st_ctim.tv_sec*(uint64)1000000000+st.st_ctim.tv_nsec);
|
||||
#else
|
||||
fd->mtime.SetUnix(st.st_mtime);
|
||||
fd->atime.SetUnix(st.st_atime);
|
||||
fd->ctime.SetUnix(st.st_ctime);
|
||||
#endif
|
||||
File::StatToRarTime(st,&fd->mtime,&fd->ctime,&fd->atime);
|
||||
|
||||
wcsncpyz(fd->Name,FindMask,ASIZE(fd->Name));
|
||||
#endif
|
||||
|
2
deps/unrar/getbits.cpp
vendored
2
deps/unrar/getbits.cpp
vendored
@ -5,7 +5,7 @@ BitInput::BitInput(bool AllocBuffer)
|
||||
ExternalBuffer=false;
|
||||
if (AllocBuffer)
|
||||
{
|
||||
// getbits32 attempts to read data from InAddr, ... InAddr+3 positions.
|
||||
// getbits*() attempt to read data from InAddr, ... InAddr+3 positions.
|
||||
// So let's allocate 3 additional bytes for situation, when we need to
|
||||
// read only 1 byte from the last position of buffer and avoid a crash
|
||||
// from access to next 3 bytes, which contents we do not need.
|
||||
|
16
deps/unrar/getbits.hpp
vendored
16
deps/unrar/getbits.hpp
vendored
@ -4,7 +4,7 @@
|
||||
class BitInput
|
||||
{
|
||||
public:
|
||||
enum BufferSize {MAX_SIZE=0x50000}; // Size of input buffer.
|
||||
enum BufferSize {MAX_SIZE=0x8000}; // Size of input buffer.
|
||||
|
||||
int InAddr; // Curent byte position in the buffer.
|
||||
int InBit; // Current bit position in the current byte.
|
||||
@ -28,26 +28,38 @@ class BitInput
|
||||
InAddr+=Bits>>3;
|
||||
InBit=Bits&7;
|
||||
}
|
||||
|
||||
|
||||
// Return 16 bits from current position in the buffer.
|
||||
// Bit at (InAddr,InBit) has the highest position in returning data.
|
||||
uint getbits()
|
||||
{
|
||||
#if defined(LITTLE_ENDIAN) && defined(ALLOW_MISALIGNED)
|
||||
uint32 BitField=*(uint32*)(InBuf+InAddr);
|
||||
BitField=ByteSwap32(BitField);
|
||||
BitField >>= (16-InBit);
|
||||
#else
|
||||
uint BitField=(uint)InBuf[InAddr] << 16;
|
||||
BitField|=(uint)InBuf[InAddr+1] << 8;
|
||||
BitField|=(uint)InBuf[InAddr+2];
|
||||
BitField >>= (8-InBit);
|
||||
#endif
|
||||
return BitField & 0xffff;
|
||||
}
|
||||
|
||||
|
||||
// Return 32 bits from current position in the buffer.
|
||||
// Bit at (InAddr,InBit) has the highest position in returning data.
|
||||
uint getbits32()
|
||||
{
|
||||
#if defined(LITTLE_ENDIAN) && defined(ALLOW_MISALIGNED)
|
||||
uint32 BitField=*(uint32*)(InBuf+InAddr);
|
||||
BitField=ByteSwap32(BitField);
|
||||
#else
|
||||
uint BitField=(uint)InBuf[InAddr] << 24;
|
||||
BitField|=(uint)InBuf[InAddr+1] << 16;
|
||||
BitField|=(uint)InBuf[InAddr+2] << 8;
|
||||
BitField|=(uint)InBuf[InAddr+3];
|
||||
#endif
|
||||
BitField <<= InBit;
|
||||
BitField|=(uint)InBuf[InAddr+4] >> (8-InBit);
|
||||
return BitField & 0xffffffff;
|
||||
|
2
deps/unrar/global.cpp
vendored
2
deps/unrar/global.cpp
vendored
@ -1,6 +1,6 @@
|
||||
#define INCLUDEGLOBAL
|
||||
|
||||
#if defined(__BORLANDC__) || defined(_MSC_VER)
|
||||
#ifdef _MSC_VER
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
|
2
deps/unrar/hardlinks.cpp
vendored
2
deps/unrar/hardlinks.cpp
vendored
@ -1,7 +1,5 @@
|
||||
bool ExtractHardlink(CommandData *Cmd,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize)
|
||||
{
|
||||
SlashToNative(NameExisting,NameExisting,NameExistingSize); // Not needed for RAR 5.1+ archives.
|
||||
|
||||
if (!FileExist(NameExisting))
|
||||
{
|
||||
uiMsg(UIERROR_HLINKCREATE,NameNew);
|
||||
|
2
deps/unrar/hash.cpp
vendored
2
deps/unrar/hash.cpp
vendored
@ -26,7 +26,7 @@ void HashValue::Init(HASH_TYPE Type)
|
||||
}
|
||||
|
||||
|
||||
bool HashValue::operator == (const HashValue &cmp)
|
||||
bool HashValue::operator == (const HashValue &cmp) const
|
||||
{
|
||||
if (Type==HASH_NONE || cmp.Type==HASH_NONE)
|
||||
return true;
|
||||
|
10
deps/unrar/hash.hpp
vendored
10
deps/unrar/hash.hpp
vendored
@ -6,8 +6,14 @@ enum HASH_TYPE {HASH_NONE,HASH_RAR14,HASH_CRC32,HASH_BLAKE2};
|
||||
struct HashValue
|
||||
{
|
||||
void Init(HASH_TYPE Type);
|
||||
bool operator == (const HashValue &cmp);
|
||||
bool operator != (const HashValue &cmp) {return !(*this==cmp);}
|
||||
|
||||
// Use the const member, so types on both sides of "==" match.
|
||||
// Otherwise clang -std=c++20 issues "ambiguity is between a regular call
|
||||
// to this operator and a call with the argument order reversed" warning.
|
||||
bool operator == (const HashValue &cmp) const;
|
||||
|
||||
// Not actually used now. Const member for same reason as operator == above.
|
||||
bool operator != (const HashValue &cmp) const {return !(*this==cmp);}
|
||||
|
||||
HASH_TYPE Type;
|
||||
union
|
||||
|
10
deps/unrar/headers.cpp
vendored
10
deps/unrar/headers.cpp
vendored
@ -49,13 +49,5 @@ FileHeader& FileHeader::operator = (FileHeader &hd)
|
||||
|
||||
void MainHeader::Reset()
|
||||
{
|
||||
HighPosAV=0;
|
||||
PosAV=0;
|
||||
CommentInHeader=false;
|
||||
PackComment=false;
|
||||
Locator=false;
|
||||
QOpenOffset=0;
|
||||
QOpenMaxSize=0;
|
||||
RROffset=0;
|
||||
RRMaxSize=0;
|
||||
*this={};
|
||||
}
|
||||
|
18
deps/unrar/headers.hpp
vendored
18
deps/unrar/headers.hpp
vendored
@ -6,7 +6,7 @@
|
||||
#define SIZEOF_MAINHEAD3 13 // Size of RAR 4.x main archive header.
|
||||
#define SIZEOF_FILEHEAD14 21 // Size of RAR 1.4 file header.
|
||||
#define SIZEOF_FILEHEAD3 32 // Size of RAR 3.0 file header.
|
||||
#define SIZEOF_SHORTBLOCKHEAD 7
|
||||
#define SIZEOF_SHORTBLOCKHEAD 7 // Smallest RAR 4.x block size.
|
||||
#define SIZEOF_LONGBLOCKHEAD 11
|
||||
#define SIZEOF_SUBBLOCKHEAD 14
|
||||
#define SIZEOF_COMMHEAD 13
|
||||
@ -162,12 +162,16 @@ struct MainHeader:BaseBlock
|
||||
ushort HighPosAV;
|
||||
uint PosAV;
|
||||
bool CommentInHeader;
|
||||
bool PackComment; // For RAR 1.4 archive format only.
|
||||
bool PackComment; // For RAR 1.4 archive format only.
|
||||
bool Locator;
|
||||
uint64 QOpenOffset; // Offset of quick list record.
|
||||
uint64 QOpenMaxSize; // Maximum size of QOpen offset in locator extra field.
|
||||
uint64 RROffset; // Offset of recovery record.
|
||||
uint64 RRMaxSize; // Maximum size of RR offset in locator extra field.
|
||||
uint64 QOpenOffset; // Offset of quick list record.
|
||||
uint64 QOpenMaxSize; // Maximum size of QOpen offset in locator extra field.
|
||||
uint64 RROffset; // Offset of recovery record.
|
||||
uint64 RRMaxSize; // Maximum size of RR offset in locator extra field.
|
||||
size_t MetaNameMaxSize; // Maximum size of archive name in metadata extra field.
|
||||
std::wstring OrigName; // Original archive name.
|
||||
RarTime OrigTime; // Original archive time.
|
||||
|
||||
void Reset();
|
||||
};
|
||||
|
||||
@ -230,7 +234,7 @@ struct FileHeader:BlockHeader
|
||||
bool LargeFile;
|
||||
|
||||
// 'true' for HEAD_SERVICE block, which is a child of preceding file block.
|
||||
// RAR 4.x uses 'solid' flag to indicate child subheader blocks in archives.
|
||||
// RAR 4.x uses 'solid' flag to indicate children subheader blocks in archives.
|
||||
bool SubBlock;
|
||||
|
||||
HOST_SYSTEM_TYPE HSType;
|
||||
|
7
deps/unrar/headers5.hpp
vendored
7
deps/unrar/headers5.hpp
vendored
@ -59,11 +59,18 @@
|
||||
|
||||
// Main header extra field values.
|
||||
#define MHEXTRA_LOCATOR 0x01 // Position of quick list and other blocks.
|
||||
#define MHEXTRA_METADATA 0x02 // Archive metadata.
|
||||
|
||||
// Flags for MHEXTRA_LOCATOR.
|
||||
#define MHEXTRA_LOCATOR_QLIST 0x01 // Quick open offset is present.
|
||||
#define MHEXTRA_LOCATOR_RR 0x02 // Recovery record offset is present.
|
||||
|
||||
// Flags for MHEXTRA_METADATA.
|
||||
#define MHEXTRA_METADATA_NAME 0x01 // Archive name is present.
|
||||
#define MHEXTRA_METADATA_CTIME 0x02 // Archive creation time is present.
|
||||
#define MHEXTRA_METADATA_UNIXTIME 0x04 // Use Unix nanosecond time format.
|
||||
#define MHEXTRA_METADATA_UNIX_NS 0x08 // Unix format with nanosecond precision.
|
||||
|
||||
// File and service header extra field values.
|
||||
#define FHEXTRA_CRYPT 0x01 // Encryption parameters.
|
||||
#define FHEXTRA_HASH 0x02 // File hash.
|
||||
|
101
deps/unrar/isnt.cpp
vendored
101
deps/unrar/isnt.cpp
vendored
@ -13,6 +13,7 @@ DWORD WinNT()
|
||||
dwPlatformId=WinVer.dwPlatformId;
|
||||
dwMajorVersion=WinVer.dwMajorVersion;
|
||||
dwMinorVersion=WinVer.dwMinorVersion;
|
||||
|
||||
}
|
||||
DWORD Result=0;
|
||||
if (dwPlatformId==VER_PLATFORM_WIN32_NT)
|
||||
@ -21,4 +22,102 @@ DWORD WinNT()
|
||||
|
||||
return Result;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// Replace it with documented Windows 11 check when available.
|
||||
#include <comdef.h>
|
||||
#include <wbemidl.h>
|
||||
#pragma comment(lib, "wbemuuid.lib")
|
||||
|
||||
static bool WMI_IsWindows10()
|
||||
{
|
||||
IWbemLocator *pLoc = NULL;
|
||||
|
||||
HRESULT hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
|
||||
IID_IWbemLocator,(LPVOID *)&pLoc);
|
||||
|
||||
if (FAILED(hres))
|
||||
return false;
|
||||
|
||||
IWbemServices *pSvc = NULL;
|
||||
|
||||
BSTR bstr_root_cimv2 = SysAllocString(L"ROOT\\CIMV2");
|
||||
|
||||
hres = pLoc->ConnectServer(bstr_root_cimv2,NULL,NULL,NULL,0,0,0,&pSvc);
|
||||
|
||||
if (FAILED(hres))
|
||||
{
|
||||
pLoc->Release();
|
||||
return false;
|
||||
}
|
||||
|
||||
hres = CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
|
||||
RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
|
||||
|
||||
if (FAILED(hres))
|
||||
{
|
||||
pSvc->Release();
|
||||
pLoc->Release();
|
||||
return false;
|
||||
}
|
||||
|
||||
IEnumWbemClassObject *pEnumerator = NULL;
|
||||
|
||||
BSTR bstr_wql = SysAllocString(L"WQL");
|
||||
BSTR bstr_sql = SysAllocString(L"SELECT * FROM Win32_OperatingSystem");
|
||||
|
||||
hres = pSvc->ExecQuery(bstr_wql, bstr_sql,
|
||||
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
|
||||
|
||||
if (FAILED(hres))
|
||||
{
|
||||
pSvc->Release();
|
||||
pLoc->Release();
|
||||
return false;
|
||||
}
|
||||
|
||||
IWbemClassObject *pclsObj = NULL;
|
||||
ULONG uReturn = 0;
|
||||
|
||||
bool Win10=false;
|
||||
while (pEnumerator!=NULL)
|
||||
{
|
||||
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
|
||||
|
||||
if (uReturn==0)
|
||||
break;
|
||||
|
||||
VARIANT vtProp;
|
||||
|
||||
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
|
||||
Win10|=wcsstr(vtProp.bstrVal,L"Windows 10")!=NULL;
|
||||
VariantClear(&vtProp);
|
||||
|
||||
pclsObj->Release();
|
||||
}
|
||||
|
||||
pSvc->Release();
|
||||
pLoc->Release();
|
||||
pEnumerator->Release();
|
||||
|
||||
return Win10;
|
||||
}
|
||||
|
||||
|
||||
// Replace it with actual check when available.
|
||||
bool IsWindows11OrGreater()
|
||||
{
|
||||
static bool IsSet=false,IsWin11=false;
|
||||
if (!IsSet)
|
||||
{
|
||||
OSVERSIONINFO WinVer;
|
||||
WinVer.dwOSVersionInfoSize=sizeof(WinVer);
|
||||
GetVersionEx(&WinVer);
|
||||
IsWin11=WinVer.dwMajorVersion>10 ||
|
||||
WinVer.dwMajorVersion==10 && WinVer.dwBuildNumber >= 22000 && !WMI_IsWindows10();
|
||||
IsSet=true;
|
||||
}
|
||||
return IsWin11;
|
||||
}
|
||||
|
||||
#endif // _WIN_ALL
|
||||
|
3
deps/unrar/isnt.hpp
vendored
3
deps/unrar/isnt.hpp
vendored
@ -10,4 +10,7 @@ enum WINNT_VERSION {
|
||||
DWORD WinNT();
|
||||
|
||||
|
||||
// Replace it with actual check when available.
|
||||
bool IsWindows11OrGreater();
|
||||
|
||||
#endif
|
||||
|
83
deps/unrar/list.cpp
vendored
83
deps/unrar/list.cpp
vendored
@ -1,6 +1,6 @@
|
||||
#include "rar.hpp"
|
||||
|
||||
static void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare);
|
||||
static void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare,bool DisableNames);
|
||||
static void ListSymLink(Archive &Arc);
|
||||
static void ListFileAttr(uint A,HOST_SYSTEM_TYPE HostType,wchar *AttrStr,size_t AttrSize);
|
||||
static void ListOldSubHeader(Archive &Arc);
|
||||
@ -22,9 +22,6 @@ void ListArchive(CommandData *Cmd)
|
||||
Cmd->Password.Clean(); // Clean user entered password before processing next archive.
|
||||
|
||||
Archive Arc(Cmd);
|
||||
#ifdef _WIN_ALL
|
||||
Arc.RemoveSequentialFlag();
|
||||
#endif
|
||||
if (!Arc.WOpen(ArcName))
|
||||
continue;
|
||||
bool FileMatched=true;
|
||||
@ -39,6 +36,7 @@ void ListArchive(CommandData *Cmd)
|
||||
{
|
||||
Arc.ViewComment();
|
||||
mprintf(L"\n%s: %s",St(MListArchive),Arc.FileName);
|
||||
|
||||
mprintf(L"\n%s: ",St(MListDetails));
|
||||
uint SetCount=0;
|
||||
const wchar *Fmt=Arc.Format==RARFMT14 ? L"RAR 1.4":(Arc.Format==RARFMT15 ? L"RAR 4":L"RAR 5");
|
||||
@ -64,6 +62,16 @@ void ListArchive(CommandData *Cmd)
|
||||
mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListLock));
|
||||
if (Arc.Encrypted)
|
||||
mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListEncHead));
|
||||
|
||||
if (!Arc.MainHead.OrigName.empty())
|
||||
mprintf(L"\n%s: %s",St(MOrigName),Arc.MainHead.OrigName.c_str());
|
||||
if (Arc.MainHead.OrigTime.IsSet())
|
||||
{
|
||||
wchar DateStr[50];
|
||||
Arc.MainHead.OrigTime.GetText(DateStr,ASIZE(DateStr),Technical);
|
||||
mprintf(L"\n%s: %s",St(MOriginalTime),DateStr);
|
||||
}
|
||||
|
||||
mprintf(L"\n");
|
||||
}
|
||||
|
||||
@ -95,7 +103,7 @@ void ListArchive(CommandData *Cmd)
|
||||
FileMatched=Cmd->IsProcessFile(Arc.FileHead,NULL,MATCH_WILDSUBPATH,0,NULL,0)!=0;
|
||||
if (FileMatched)
|
||||
{
|
||||
ListFileHeader(Arc,Arc.FileHead,TitleShown,Verbose,Technical,Bare);
|
||||
ListFileHeader(Arc,Arc.FileHead,TitleShown,Verbose,Technical,Bare,Cmd->DisableNames);
|
||||
if (!Arc.FileHead.SplitBefore)
|
||||
{
|
||||
TotalUnpSize+=Arc.FileHead.UnpSize;
|
||||
@ -108,7 +116,7 @@ void ListArchive(CommandData *Cmd)
|
||||
if (FileMatched && !Bare)
|
||||
{
|
||||
if (Technical && ShowService)
|
||||
ListFileHeader(Arc,Arc.SubHead,TitleShown,Verbose,true,false);
|
||||
ListFileHeader(Arc,Arc.SubHead,TitleShown,Verbose,true,false,Cmd->DisableNames);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -188,8 +196,29 @@ enum LISTCOL_TYPE {
|
||||
};
|
||||
|
||||
|
||||
void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare)
|
||||
void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare,bool DisableNames)
|
||||
{
|
||||
if (!TitleShown && !Technical && !Bare)
|
||||
{
|
||||
if (Verbose)
|
||||
{
|
||||
mprintf(L"\n%ls",St(MListTitleV));
|
||||
if (!DisableNames)
|
||||
mprintf(L"\n----------- --------- -------- ----- ---------- ----- -------- ----");
|
||||
}
|
||||
else
|
||||
{
|
||||
mprintf(L"\n%ls",St(MListTitleL));
|
||||
if (!DisableNames)
|
||||
mprintf(L"\n----------- --------- ---------- ----- ----");
|
||||
}
|
||||
// Must be set even in DisableNames mode to suppress "0 files" output
|
||||
// unless no files are matched.
|
||||
TitleShown=true;
|
||||
}
|
||||
if (DisableNames)
|
||||
return;
|
||||
|
||||
wchar *Name=hd.FileName;
|
||||
RARFORMAT Format=Arc.Format;
|
||||
|
||||
@ -199,21 +228,6 @@ void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bo
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TitleShown && !Technical)
|
||||
{
|
||||
if (Verbose)
|
||||
{
|
||||
mprintf(L"\n%ls",St(MListTitleV));
|
||||
mprintf(L"\n----------- --------- -------- ----- ---------- ----- -------- ----");
|
||||
}
|
||||
else
|
||||
{
|
||||
mprintf(L"\n%ls",St(MListTitleL));
|
||||
mprintf(L"\n----------- --------- ---------- ----- ----");
|
||||
}
|
||||
TitleShown=true;
|
||||
}
|
||||
|
||||
wchar UnpSizeText[30],PackSizeText[30];
|
||||
if (hd.UnpSize==INT64NDF)
|
||||
wcsncpyz(UnpSizeText,L"?",ASIZE(UnpSizeText));
|
||||
@ -304,17 +318,21 @@ void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bo
|
||||
mprintf(L"\n%12ls: %ls",St(MListPacked),PackSizeText);
|
||||
mprintf(L"\n%12ls: %ls",St(MListRatio),RatioStr);
|
||||
}
|
||||
bool WinTitles=false;
|
||||
#ifdef _WIN_ALL
|
||||
WinTitles=true;
|
||||
#endif
|
||||
if (hd.mtime.IsSet())
|
||||
mprintf(L"\n%12ls: %ls",St(MListMtime),DateStr);
|
||||
mprintf(L"\n%12ls: %ls",St(WinTitles ? MListModified:MListMtime),DateStr);
|
||||
if (hd.ctime.IsSet())
|
||||
{
|
||||
hd.ctime.GetText(DateStr,ASIZE(DateStr),true);
|
||||
mprintf(L"\n%12ls: %ls",St(MListCtime),DateStr);
|
||||
mprintf(L"\n%12ls: %ls",St(WinTitles ? MListCreated:MListCtime),DateStr);
|
||||
}
|
||||
if (hd.atime.IsSet())
|
||||
{
|
||||
hd.atime.GetText(DateStr,ASIZE(DateStr),true);
|
||||
mprintf(L"\n%12ls: %ls",St(MListAtime),DateStr);
|
||||
mprintf(L"\n%12ls: %ls",St(WinTitles ? MListAccessed:MListAtime),DateStr);
|
||||
}
|
||||
mprintf(L"\n%12ls: %ls",St(MListAttr),AttrStr);
|
||||
if (hd.FileHash.Type==HASH_CRC32)
|
||||
@ -370,15 +388,16 @@ void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bo
|
||||
{
|
||||
mprintf(L"\n%12ls: ",L"Unix owner");
|
||||
if (*hd.UnixOwnerName!=0)
|
||||
mprintf(L"%ls:",GetWide(hd.UnixOwnerName));
|
||||
mprintf(L"%ls",GetWide(hd.UnixOwnerName));
|
||||
else
|
||||
if (hd.UnixOwnerNumeric)
|
||||
mprintf(L"#%d",hd.UnixOwnerID);
|
||||
mprintf(L":");
|
||||
if (*hd.UnixGroupName!=0)
|
||||
mprintf(L"%ls",GetWide(hd.UnixGroupName));
|
||||
if ((*hd.UnixOwnerName!=0 || *hd.UnixGroupName!=0) && (hd.UnixOwnerNumeric || hd.UnixGroupNumeric))
|
||||
mprintf(L" ");
|
||||
if (hd.UnixOwnerNumeric)
|
||||
mprintf(L"#%d:",hd.UnixOwnerID);
|
||||
if (hd.UnixGroupNumeric)
|
||||
mprintf(L"#%d:",hd.UnixGroupID);
|
||||
else
|
||||
if (hd.UnixGroupNumeric)
|
||||
mprintf(L"#%d",hd.UnixGroupID);
|
||||
}
|
||||
|
||||
mprintf(L"\n");
|
||||
|
18
deps/unrar/loclang.hpp
vendored
18
deps/unrar/loclang.hpp
vendored
@ -28,6 +28,7 @@
|
||||
#define MRARTitle1 L"\nUsage: rar <command> -<switch 1> -<switch N> <archive> <files...>"
|
||||
#define MUNRARTitle1 L"\nUsage: unrar <command> -<switch 1> -<switch N> <archive> <files...>"
|
||||
#define MRARTitle2 L"\n <@listfiles...> <path_to_extract\\>"
|
||||
#define MFwrSlTitle2 L"\n <@listfiles...> <path_to_extract/>"
|
||||
#define MCHelpCmd L"\n\n<Commands>"
|
||||
#define MCHelpCmdA L"\n a Add files to archive"
|
||||
#define MCHelpCmdC L"\n c Add archive comment"
|
||||
@ -58,6 +59,7 @@
|
||||
#define MCHelpSwAD L"\n ad[1,2] Alternate destination path"
|
||||
#define MCHelpSwAG L"\n ag[format] Generate archive name using the current date"
|
||||
#define MCHelpSwAI L"\n ai Ignore file attributes"
|
||||
#define MCHelpSwAM L"\n am[s,r] Archive name and time [save, restore]"
|
||||
#define MCHelpSwAO L"\n ao Add files with Archive attribute set"
|
||||
#define MCHelpSwAP L"\n ap<path> Set path inside archive"
|
||||
#define MCHelpSwAS L"\n as Synchronize archive contents"
|
||||
@ -72,11 +74,11 @@
|
||||
#define MCHelpSwDW L"\n dw Wipe files after archiving"
|
||||
#define MCHelpSwEa L"\n e[+]<attr> Set file exclude and include attributes"
|
||||
#define MCHelpSwED L"\n ed Do not add empty directories"
|
||||
#define MCHelpSwEN L"\n en Do not put 'end of archive' block"
|
||||
#define MCHelpSwEP L"\n ep Exclude paths from names"
|
||||
#define MCHelpSwEP1 L"\n ep1 Exclude base directory from names"
|
||||
#define MCHelpSwEP2 L"\n ep2 Expand paths to full"
|
||||
#define MCHelpSwEP3 L"\n ep3 Expand paths to full including the drive letter"
|
||||
#define MCHelpSwEP4 L"\n ep4<path> Exclude the path prefix from names"
|
||||
#define MCHelpSwF L"\n f Freshen files"
|
||||
#define MCHelpSwHP L"\n hp[password] Encrypt both file data and headers"
|
||||
#define MCHelpSwHT L"\n ht[b|c] Select hash type [BLAKE2,CRC32] for file checksum"
|
||||
@ -95,6 +97,7 @@
|
||||
#define MCHelpSwMA L"\n ma[4|5] Specify a version of archiving format"
|
||||
#define MCHelpSwMC L"\n mc<par> Set advanced compression parameters"
|
||||
#define MCHelpSwMD L"\n md<n>[k,m,g] Dictionary size in KB, MB or GB"
|
||||
#define MCHelpSwME L"\n me[par] Set encryption parameters"
|
||||
#define MCHelpSwMS L"\n ms[ext;ext] Specify file types to store"
|
||||
#define MCHelpSwMT L"\n mt<threads> Set the number of threads"
|
||||
#define MCHelpSwN L"\n n<file> Additionally filter included files"
|
||||
@ -106,11 +109,11 @@
|
||||
#define MCHelpSwOI L"\n oi[0-4][:min] Save identical files as references"
|
||||
#define MCHelpSwOL L"\n ol[a] Process symbolic links as the link [absolute paths]"
|
||||
#define MCHelpSwONI L"\n oni Allow potentially incompatible names"
|
||||
#define MCHelpSwOP L"\n op<path> Set the output path for extracted files"
|
||||
#define MCHelpSwOR L"\n or Rename files automatically"
|
||||
#define MCHelpSwOS L"\n os Save NTFS streams"
|
||||
#define MCHelpSwOW L"\n ow Save or restore file owner and group"
|
||||
#define MCHelpSwP L"\n p[password] Set password"
|
||||
#define MCHelpSwPm L"\n p- Do not query password"
|
||||
#define MCHelpSwQO L"\n qo[-|+] Add quick open information [none|force]"
|
||||
#define MCHelpSwR L"\n r Recurse subdirectories"
|
||||
#define MCHelpSwRm L"\n r- Disable recursion"
|
||||
@ -272,6 +275,9 @@
|
||||
#define MListMtime L"mtime"
|
||||
#define MListCtime L"ctime"
|
||||
#define MListAtime L"atime"
|
||||
#define MListModified L"Modified"
|
||||
#define MListCreated L"Created"
|
||||
#define MListAccessed L"Accessed"
|
||||
#define MListAttr L"Attributes"
|
||||
#define MListFlags L"Flags"
|
||||
#define MListCompInfo L"Compression"
|
||||
@ -385,3 +391,11 @@
|
||||
#define MErrReadTrunc L"\n%s is archived incompletely because of read error.\n"
|
||||
#define MErrReadCount L"\n%u files are archived incompletely because of read errors."
|
||||
#define MDirNameExists L"\nDirectory with such name already exists"
|
||||
#define MStdinNoInput L"\nKeyboard input is not allowed when reading data from stdin"
|
||||
#define MTruncPsw L"\nPassword exceeds the maximum allowed length of %u characters and will be truncated."
|
||||
#define MAdjustValue L"\nAdjusting %s value to %s."
|
||||
#define MOpFailed L"\nOperation failed"
|
||||
#define MSkipEncArc L"\nSkipping the encrypted archive %s"
|
||||
#define MOrigName L"Original name"
|
||||
#define MOriginalTime L"Original time"
|
||||
#define MFileRenamed L"\n%s is renamed to %s"
|
||||
|
13
deps/unrar/makefile
vendored
13
deps/unrar/makefile
vendored
@ -123,10 +123,10 @@ UNRAR_OBJ=filestr.o recvol.o rs.o scantree.o qopen.o
|
||||
LIB_OBJ=filestr.o scantree.o dll.o qopen.o
|
||||
|
||||
OBJECTS=rar.o strlist.o strfn.o pathfn.o smallfn.o global.o file.o filefn.o filcreat.o \
|
||||
archive.o arcread.o unicode.o system.o isnt.o crypt.o crc.o rawread.o encname.o \
|
||||
archive.o arcread.o unicode.o system.o crypt.o crc.o rawread.o encname.o \
|
||||
resource.o match.o timefn.o rdwrfn.o consio.o options.o errhnd.o rarvm.o secpassword.o \
|
||||
rijndael.o getbits.o sha1.o sha256.o blake2s.o hash.o extinfo.o extract.o volume.o \
|
||||
list.o find.o unpack.o headers.o threadpool.o rs16.o cmddata.o ui.o
|
||||
list.o find.o unpack.o headers.o threadpool.o rs16.o cmddata.o ui.o
|
||||
|
||||
.cpp.o:
|
||||
$(COMPILE) -D$(WHAT) -c $<
|
||||
@ -142,20 +142,23 @@ clean:
|
||||
@rm -f $(OBJECTS) $(UNRAR_OBJ) $(LIB_OBJ)
|
||||
@rm -f unrar libunrar.*
|
||||
|
||||
unrar: clean $(OBJECTS) $(UNRAR_OBJ)
|
||||
# We removed 'clean' from dependencies, because it prevented parallel
|
||||
# 'make -Jn' builds.
|
||||
|
||||
unrar: $(OBJECTS) $(UNRAR_OBJ)
|
||||
@rm -f unrar
|
||||
$(LINK) -o unrar $(LDFLAGS) $(OBJECTS) $(UNRAR_OBJ) $(LIBS)
|
||||
$(STRIP) unrar
|
||||
|
||||
sfx: WHAT=SFX_MODULE
|
||||
sfx: clean $(OBJECTS)
|
||||
sfx: $(OBJECTS)
|
||||
@rm -f default.sfx
|
||||
$(LINK) -o default.sfx $(LDFLAGS) $(OBJECTS)
|
||||
$(STRIP) default.sfx
|
||||
|
||||
lib: WHAT=RARDLL
|
||||
lib: CXXFLAGS+=$(LIBFLAGS)
|
||||
lib: clean $(OBJECTS) $(LIB_OBJ)
|
||||
lib: $(OBJECTS) $(LIB_OBJ)
|
||||
@rm -f libunrar.*
|
||||
$(LINK) -shared -o libunrar.so $(LDFLAGS) $(OBJECTS) $(LIB_OBJ)
|
||||
$(AR) rcs libunrar.a $(OBJECTS) $(LIB_OBJ)
|
||||
|
12
deps/unrar/model.cpp
vendored
12
deps/unrar/model.cpp
vendored
@ -532,13 +532,15 @@ inline bool RARPPM_CONTEXT::decodeSymbol2(ModelPPM *Model)
|
||||
Model->Coder.SubRange.LowCount=HiCnt;
|
||||
Model->Coder.SubRange.HighCount=Model->Coder.SubRange.scale;
|
||||
i=NumStats-Model->NumMasked;
|
||||
pps--;
|
||||
|
||||
// 2022.12.02: we removed pps-- here and changed the code below to avoid
|
||||
// "array subscript -1 is outside array bounds" warning in some compilers.
|
||||
do
|
||||
{
|
||||
pps++;
|
||||
if (pps>=ps+ASIZE(ps)) // Extra safety check.
|
||||
return false;
|
||||
Model->CharMask[(*pps)->Symbol]=Model->EscCount;
|
||||
pps++;
|
||||
} while ( --i );
|
||||
psee2c->Summ += Model->Coder.SubRange.scale;
|
||||
Model->NumMasked = NumStats;
|
||||
@ -566,17 +568,14 @@ void ModelPPM::CleanUp()
|
||||
}
|
||||
|
||||
|
||||
bool ModelPPM::DecodeInit(Unpack *UnpackRead,int &EscChar,byte *hcppm)
|
||||
bool ModelPPM::DecodeInit(Unpack *UnpackRead,int &EscChar)
|
||||
{
|
||||
int MaxOrder=UnpackRead->GetChar();
|
||||
bool Reset=(MaxOrder & 0x20)!=0;
|
||||
|
||||
int MaxMB;
|
||||
if (Reset)
|
||||
{
|
||||
MaxMB=UnpackRead->GetChar();
|
||||
if (MaxMB>128) return(false);
|
||||
}
|
||||
else
|
||||
if (SubAlloc.GetAllocatedMemory()==0)
|
||||
return(false);
|
||||
@ -593,7 +592,6 @@ bool ModelPPM::DecodeInit(Unpack *UnpackRead,int &EscChar,byte *hcppm)
|
||||
SubAlloc.StopSubAllocator();
|
||||
return(false);
|
||||
}
|
||||
SubAlloc.SetHeapStartFixed(hcppm);
|
||||
SubAlloc.StartSubAllocator(MaxMB+1);
|
||||
StartModelRare(MaxOrder);
|
||||
}
|
||||
|
2
deps/unrar/model.hpp
vendored
2
deps/unrar/model.hpp
vendored
@ -115,7 +115,7 @@ class ModelPPM : RARPPM_DEF
|
||||
public:
|
||||
ModelPPM();
|
||||
void CleanUp(); // reset PPM variables after data error
|
||||
bool DecodeInit(Unpack *UnpackRead,int &EscChar,byte *hcppm);
|
||||
bool DecodeInit(Unpack *UnpackRead,int &EscChar);
|
||||
int DecodeChar();
|
||||
};
|
||||
|
||||
|
8
deps/unrar/options.cpp
vendored
8
deps/unrar/options.cpp
vendored
@ -6,14 +6,6 @@ RAROptions::RAROptions()
|
||||
}
|
||||
|
||||
|
||||
RAROptions::~RAROptions()
|
||||
{
|
||||
// It is important for security reasons, so we do not have the unnecessary
|
||||
// password data left in memory.
|
||||
memset(this,0,sizeof(RAROptions));
|
||||
}
|
||||
|
||||
|
||||
void RAROptions::Init()
|
||||
{
|
||||
memset(this,0,sizeof(RAROptions));
|
||||
|
22
deps/unrar/options.hpp
vendored
22
deps/unrar/options.hpp
vendored
@ -45,6 +45,12 @@ enum OVERWRITE_MODE
|
||||
OVERWRITE_FORCE_ASK
|
||||
};
|
||||
|
||||
enum ARC_METADATA
|
||||
{
|
||||
ARCMETA_NONE=0,
|
||||
ARCMETA_SAVE, // -ams
|
||||
ARCMETA_RESTORE // -amr
|
||||
};
|
||||
|
||||
enum QOPEN_MODE { QOPEN_NONE, QOPEN_AUTO, QOPEN_ALWAYS };
|
||||
|
||||
@ -84,11 +90,12 @@ struct FilterMode
|
||||
#define MAX_GENERATE_MASK 128
|
||||
|
||||
|
||||
// Here we store simple data types, which we can clear and move all together
|
||||
// quickly. Rest of data types goes to CommandData.
|
||||
class RAROptions
|
||||
{
|
||||
public:
|
||||
RAROptions();
|
||||
~RAROptions();
|
||||
void Init();
|
||||
|
||||
uint ExclFileAttr;
|
||||
@ -116,9 +123,10 @@ class RAROptions
|
||||
RAR_CHARSET ErrlogCharset;
|
||||
RAR_CHARSET RedirectCharset;
|
||||
|
||||
wchar ArcPath[NM];
|
||||
SecPassword Password;
|
||||
wchar ArcPath[NM]; // For -ap<path>.
|
||||
wchar ExclArcPath[NM]; // For -ep4<path> switch.
|
||||
bool EncryptHeaders;
|
||||
bool SkipEncrypted;
|
||||
|
||||
bool ManualPassword; // Password entered manually during operation, might need to clean for next archive.
|
||||
|
||||
@ -130,6 +138,7 @@ class RAROptions
|
||||
HASH_TYPE HashType;
|
||||
int Recovery;
|
||||
int RecVolNumber;
|
||||
ARC_METADATA ArcMetadata;
|
||||
bool DisablePercentage;
|
||||
bool DisableCopyright;
|
||||
bool DisableDone;
|
||||
@ -145,7 +154,6 @@ class RAROptions
|
||||
PATH_EXCL_MODE ExclPath;
|
||||
RECURSE_MODE Recurse;
|
||||
int64 VolSize;
|
||||
Array<int64> NextVolSizes;
|
||||
uint CurVolNum;
|
||||
bool AllYes;
|
||||
bool VerboseOutput; // -iv, display verbose output, used only in "WinRAR t" now.
|
||||
@ -195,7 +203,11 @@ class RAROptions
|
||||
EXTTIME_MODE xctime;
|
||||
EXTTIME_MODE xatime;
|
||||
bool PreserveAtime;
|
||||
wchar CompressStdin[NM];
|
||||
|
||||
// Read data from stdin and store in archive under a name specified here
|
||||
// when archiving. Read an archive from stdin if any non-empty string
|
||||
// is specified here when extracting.
|
||||
wchar UseStdin[NM];
|
||||
|
||||
uint Threads; // We use it to init hash even if RAR_SMP is not defined.
|
||||
|
||||
|
33
deps/unrar/os.hpp
vendored
33
deps/unrar/os.hpp
vendored
@ -13,6 +13,8 @@
|
||||
#endif
|
||||
|
||||
#include <new>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
#if defined(_WIN_ALL) || defined(_EMX)
|
||||
@ -36,12 +38,23 @@
|
||||
// re-definition warnings in third party projects.
|
||||
#ifndef UNICODE
|
||||
#define UNICODE
|
||||
#define _UNICODE // Set _T() macro to convert from narrow to wide strings.
|
||||
#endif
|
||||
|
||||
#undef WINVER
|
||||
|
||||
#ifdef _WIN32_WINNT
|
||||
#undef _WIN32_WINNT
|
||||
#define WINVER 0x0501
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
// 2021.09.05: Allow newer Vista+ APIs like IFileOpenDialog for WinRAR,
|
||||
// but still keep SFX modules XP compatible.
|
||||
#define WINVER _WIN32_WINNT_VISTA
|
||||
#define _WIN32_WINNT _WIN32_WINNT_VISTA
|
||||
#else
|
||||
#define WINVER _WIN32_WINNT_WINXP
|
||||
#define _WIN32_WINNT _WIN32_WINNT_WINXP
|
||||
#endif
|
||||
|
||||
#if !defined(ZIPSFX)
|
||||
#define RAR_SMP
|
||||
@ -73,14 +86,14 @@
|
||||
#include <dir.h>
|
||||
#endif
|
||||
#ifdef _MSC_VER
|
||||
#if _MSC_VER<1500
|
||||
#define for if (0) ; else for
|
||||
#endif
|
||||
#include <direct.h>
|
||||
#include <intrin.h>
|
||||
|
||||
#define USE_SSE
|
||||
#define SSE_ALIGNMENT 16
|
||||
// Use SSE only for x86/x64, not ARM Windows.
|
||||
#if defined(_M_IX86) || defined(_M_X64)
|
||||
#define USE_SSE
|
||||
#define SSE_ALIGNMENT 16
|
||||
#endif
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#endif // _MSC_VER
|
||||
@ -96,7 +109,6 @@
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
|
||||
|
||||
#define SAVE_LINKS
|
||||
|
||||
#define ENABLE_ACCESS
|
||||
@ -212,7 +224,8 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if _POSIX_C_SOURCE >= 200809L
|
||||
// Unlike Apple x64, utimensat shall be available in all Apple M1 systems.
|
||||
#if _POSIX_C_SOURCE >= 200809L || defined(__APPLE__) && defined(__arm64__)
|
||||
#define UNIX_TIME_NS // Nanosecond time precision in Unix.
|
||||
#endif
|
||||
|
||||
|
171
deps/unrar/pathfn.cpp
vendored
171
deps/unrar/pathfn.cpp
vendored
@ -5,7 +5,7 @@ wchar* PointToName(const wchar *Path)
|
||||
for (int I=(int)wcslen(Path)-1;I>=0;I--)
|
||||
if (IsPathDiv(Path[I]))
|
||||
return (wchar*)&Path[I+1];
|
||||
return (wchar*)((*Path && IsDriveDiv(Path[1])) ? Path+2:Path);
|
||||
return (wchar*)((*Path!=0 && IsDriveDiv(Path[1])) ? Path+2:Path);
|
||||
}
|
||||
|
||||
|
||||
@ -31,11 +31,17 @@ wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath,size_t DestSize)
|
||||
const wchar *s=DestPtr;
|
||||
if (s[0]!=0 && IsDriveDiv(s[1]))
|
||||
s+=2;
|
||||
if (s[0]=='\\' && s[1]=='\\')
|
||||
|
||||
// Skip UNC Windows \\server\share\ or Unix //server/share/
|
||||
if (IsPathDiv(s[0]) && IsPathDiv(s[1]))
|
||||
{
|
||||
const wchar *Slash=wcschr(s+2,'\\');
|
||||
if (Slash!=NULL && (Slash=wcschr(Slash+1,'\\'))!=NULL)
|
||||
s=Slash+1;
|
||||
uint SlashCount=0;
|
||||
for (const wchar *t=s+2;*t!=0;t++)
|
||||
if (IsPathDiv(*t) && ++SlashCount==2)
|
||||
{
|
||||
s=t+1; // Found two more path separators after leading two.
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (const wchar *t=s;*t!=0;t++)
|
||||
if (IsPathDiv(*t))
|
||||
@ -184,7 +190,9 @@ void MakeName(const wchar *Path,const wchar *Name,wchar *Pathname,size_t MaxSize
|
||||
// the temporary buffer instead of constructing the name in 'Pathname'.
|
||||
wchar OutName[NM];
|
||||
wcsncpyz(OutName,Path,ASIZE(OutName));
|
||||
AddEndSlash(OutName,ASIZE(OutName));
|
||||
// Do not add slash to d:, we want to allow relative paths like d:filename.
|
||||
if (!IsDriveLetter(Path) || Path[2]!=0)
|
||||
AddEndSlash(OutName,ASIZE(OutName));
|
||||
wcsncatz(OutName,Name,ASIZE(OutName));
|
||||
wcsncpyz(Pathname,OutName,MaxSize);
|
||||
}
|
||||
@ -317,6 +325,9 @@ void GetConfigName(const wchar *Name,wchar *FullName,size_t MaxSize,bool CheckEx
|
||||
// of file name if numeric part is missing.
|
||||
wchar* GetVolNumPart(const wchar *ArcName)
|
||||
{
|
||||
// We do not want to increment any characters in path component.
|
||||
ArcName=PointToName(ArcName);
|
||||
|
||||
if (*ArcName==0)
|
||||
return (wchar *)ArcName;
|
||||
|
||||
@ -340,7 +351,7 @@ wchar* GetVolNumPart(const wchar *ArcName)
|
||||
{
|
||||
// Validate the first numeric part only if it has a dot somewhere
|
||||
// before it.
|
||||
wchar *Dot=wcschr(PointToName(ArcName),'.');
|
||||
const wchar *Dot=wcschr(ArcName,'.');
|
||||
if (Dot!=NULL && Dot<NumPtr)
|
||||
ChPtr=NumPtr;
|
||||
break;
|
||||
@ -417,50 +428,39 @@ void NextVolumeName(wchar *ArcName,uint MaxLength,bool OldNumbering)
|
||||
|
||||
bool IsNameUsable(const wchar *Name)
|
||||
{
|
||||
#ifndef _UNIX
|
||||
if (Name[0] && Name[1] && wcschr(Name+2,':')!=NULL)
|
||||
// We were asked to apply Windows-like conversion in Linux in case
|
||||
// files are unpacked to Windows share. This code is invoked only
|
||||
// if file failed to be created, so it doesn't affect extraction
|
||||
// of Unix compatible names to native Unix drives.
|
||||
#ifdef _UNIX
|
||||
// Windows shares in Unix do not allow the drive letter,
|
||||
// so unlike Windows version, we check all characters here.
|
||||
if (wcschr(Name,':')!=NULL)
|
||||
return false;
|
||||
#else
|
||||
if (Name[0]!=0 && Name[1]!=0 && wcschr(Name+2,':')!=NULL)
|
||||
return false;
|
||||
#endif
|
||||
for (const wchar *s=Name;*s!=0;s++)
|
||||
{
|
||||
if ((uint)*s<32)
|
||||
return false;
|
||||
|
||||
// It is for Windows shares in Unix. We can create such names in Windows.
|
||||
#ifdef _UNIX
|
||||
// No spaces or dots before the path separator are allowed in Windows
|
||||
// shares. But they are allowed and automtically removed at the end of
|
||||
// file or folder name, so it is useless to replace them here.
|
||||
// Since such files or folders are created successfully, a supposed
|
||||
// conversion here would never be invoked.
|
||||
if ((*s==' ' || *s=='.') && IsPathDiv(s[1]))
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return *Name!=0 && wcspbrk(Name,L"?*<>|\"")==NULL;
|
||||
}
|
||||
|
||||
|
||||
void MakeNameUsable(char *Name,bool Extended)
|
||||
{
|
||||
#ifdef _WIN_ALL
|
||||
// In Windows we also need to convert characters not defined in current
|
||||
// code page. This double conversion changes them to '?', which is
|
||||
// catched by code below.
|
||||
size_t NameLength=strlen(Name);
|
||||
wchar NameW[NM];
|
||||
CharToWide(Name,NameW,ASIZE(NameW));
|
||||
WideToChar(NameW,Name,NameLength+1);
|
||||
Name[NameLength]=0;
|
||||
#endif
|
||||
for (char *s=Name;*s!=0;s=charnext(s))
|
||||
{
|
||||
if (strchr(Extended ? "?*<>|\"":"?*",*s)!=NULL || Extended && (byte)*s<32)
|
||||
*s='_';
|
||||
#ifdef _EMX
|
||||
if (*s=='=')
|
||||
*s='_';
|
||||
#endif
|
||||
#ifndef _UNIX
|
||||
if (s-Name>1 && *s==':')
|
||||
*s='_';
|
||||
// Remove ' ' and '.' before path separator, but allow .\ and ..\.
|
||||
if ((*s==' ' || *s=='.' && s>Name && !IsPathDiv(s[-1]) && s[-1]!='.') && IsPathDiv(s[1]))
|
||||
*s='_';
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MakeNameUsable(wchar *Name,bool Extended)
|
||||
@ -469,7 +469,27 @@ void MakeNameUsable(wchar *Name,bool Extended)
|
||||
{
|
||||
if (wcschr(Extended ? L"?*<>|\"":L"?*",*s)!=NULL || Extended && (uint)*s<32)
|
||||
*s='_';
|
||||
#ifndef _UNIX
|
||||
#ifdef _UNIX
|
||||
// We were asked to apply Windows-like conversion in Linux in case
|
||||
// files are unpacked to Windows share. This code is invoked only
|
||||
// if file failed to be created, so it doesn't affect extraction
|
||||
// of Unix compatible names to native Unix drives.
|
||||
if (Extended)
|
||||
{
|
||||
// Windows shares in Unix do not allow the drive letter,
|
||||
// so unlike Windows version, we check all characters here.
|
||||
if (*s==':')
|
||||
*s='_';
|
||||
|
||||
// No spaces or dots before the path separator are allowed on Windows
|
||||
// shares. But they are allowed and automtically removed at the end of
|
||||
// file or folder name, so it is useless to replace them here.
|
||||
// Since such files or folders are created successfully, a supposed
|
||||
// conversion here would never be invoked.
|
||||
if ((*s==' ' || *s=='.') && IsPathDiv(s[1]))
|
||||
*s='_';
|
||||
}
|
||||
#else
|
||||
if (s-Name>1 && *s==':')
|
||||
*s='_';
|
||||
#if 0 // We already can create such files.
|
||||
@ -692,7 +712,8 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u
|
||||
wchar Mask[MAX_GENERATE_MASK];
|
||||
wcsncpyz(Mask,*GenerateMask!=0 ? GenerateMask:L"yyyymmddhhmmss",ASIZE(Mask));
|
||||
|
||||
bool QuoteMode=false,Hours=false;
|
||||
bool QuoteMode=false;
|
||||
uint MAsMinutes=0; // By default we treat 'M' as months.
|
||||
for (uint I=0;Mask[I]!=0;I++)
|
||||
{
|
||||
if (Mask[I]=='{' || Mask[I]=='}')
|
||||
@ -704,13 +725,16 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u
|
||||
continue;
|
||||
int CurChar=toupperw(Mask[I]);
|
||||
if (CurChar=='H')
|
||||
Hours=true;
|
||||
MAsMinutes=2; // Treat next two 'M' after 'H' as minutes.
|
||||
if (CurChar=='D' || CurChar=='Y')
|
||||
MAsMinutes=0; // Treat 'M' in HHDDMMYY and HHYYMMDD as month.
|
||||
|
||||
if (Hours && CurChar=='M')
|
||||
if (MAsMinutes>0 && CurChar=='M')
|
||||
{
|
||||
// Replace minutes with 'I'. We use 'M' both for months and minutes,
|
||||
// so we treat as minutes only those 'M' which are found after hours.
|
||||
// so we treat as minutes only those 'M', which are found after hours.
|
||||
Mask[I]='I';
|
||||
MAsMinutes--;
|
||||
}
|
||||
if (CurChar=='N')
|
||||
{
|
||||
@ -774,7 +798,9 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u
|
||||
|
||||
const wchar *MaskChars=L"YMDHISWAEN";
|
||||
|
||||
// How many times every modifier character was encountered in the mask.
|
||||
int CField[sizeof(Field)/sizeof(Field[0])];
|
||||
|
||||
memset(CField,0,sizeof(CField));
|
||||
QuoteMode=false;
|
||||
for (uint I=0;Mask[I]!=0;I++)
|
||||
@ -816,13 +842,22 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u
|
||||
{
|
||||
size_t FieldPos=ChPtr-MaskChars;
|
||||
int CharPos=(int)strlen(Field[FieldPos])-CField[FieldPos]--;
|
||||
if (FieldPos==1 && toupperw(Mask[I+1])=='M' && toupperw(Mask[I+2])=='M')
|
||||
|
||||
// CField[FieldPos] shall have exactly 3 "MMM" symbols, so we do not
|
||||
// repeat the month name in case "MMMMMMMM" mask. But since we
|
||||
// decremented CField[FieldPos] above, we compared it with 2.
|
||||
if (FieldPos==1 && CField[FieldPos]==2 &&
|
||||
toupperw(Mask[I+1])=='M' && toupperw(Mask[I+2])=='M')
|
||||
{
|
||||
wcsncpyz(DateText+J,GetMonthName(rlt.Month-1),ASIZE(DateText)-J);
|
||||
J=wcslen(DateText);
|
||||
I+=2;
|
||||
continue;
|
||||
}
|
||||
// If CharPos is negative, we have more modifier characters than
|
||||
// matching time data. We prefer to issue a modifier character
|
||||
// instead of repeating time data from beginning, so user can notice
|
||||
// excessive modifiers added by mistake.
|
||||
if (CharPos<0)
|
||||
DateText[J]=Mask[I];
|
||||
else
|
||||
@ -985,9 +1020,9 @@ void ConvertToPrecomposed(wchar *Name,size_t NameSize)
|
||||
}
|
||||
|
||||
|
||||
// Remove trailing spaces and dots in file name and in dir names in path.
|
||||
void MakeNameCompatible(wchar *Name)
|
||||
void MakeNameCompatible(wchar *Name,size_t MaxSize)
|
||||
{
|
||||
// Remove trailing spaces and dots in file name and in dir names in path.
|
||||
int Src=0,Dest=0;
|
||||
while (true)
|
||||
{
|
||||
@ -1005,5 +1040,47 @@ void MakeNameCompatible(wchar *Name)
|
||||
Src++;
|
||||
Dest++;
|
||||
}
|
||||
|
||||
// Rename reserved device names, such as aux.txt to _aux.txt.
|
||||
// We check them in path components too, where they are also prohibited.
|
||||
for (uint I=0;Name[I]!=0;I++)
|
||||
if (I==0 || I>0 && IsPathDiv(Name[I-1]))
|
||||
{
|
||||
static const wchar *Devices[]={L"CON",L"PRN",L"AUX",L"NUL",L"COM#",L"LPT#"};
|
||||
wchar *s=Name+I;
|
||||
bool MatchFound=false;
|
||||
for (uint J=0;J<ASIZE(Devices);J++)
|
||||
for (uint K=0;;K++)
|
||||
if (Devices[J][K]=='#')
|
||||
{
|
||||
if (!IsDigit(s[K]))
|
||||
break;
|
||||
}
|
||||
else
|
||||
if (Devices[J][K]==0)
|
||||
{
|
||||
// Names like aux.txt are accessible without \\?\ prefix
|
||||
// since Windows 11. Pure aux is still prohibited.
|
||||
MatchFound=s[K]==0 || s[K]=='.' && !IsWindows11OrGreater() || IsPathDiv(s[K]);
|
||||
break;
|
||||
}
|
||||
else
|
||||
if (Devices[J][K]!=toupperw(s[K]))
|
||||
break;
|
||||
if (MatchFound)
|
||||
{
|
||||
wchar OrigName[NM];
|
||||
wcsncpyz(OrigName,Name,ASIZE(OrigName));
|
||||
if (MaxSize>I+1) // I+1, because we do not move the trailing 0.
|
||||
memmove(s+1,s,(MaxSize-I-1)*sizeof(*s));
|
||||
*s='_';
|
||||
#ifndef SFX_MODULE
|
||||
uiMsg(UIMSG_CORRECTINGNAME,nullptr);
|
||||
uiMsg(UIERROR_RENAMING,nullptr,OrigName,Name);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user