mirror of https://github.com/hashcat/hashcat.git
Merge pull request #2695 from matrix/cryptoapi
Added Linux Kernel Crypto API (2.4) KPApull/2639/head^2
commit
307cb63661
@ -0,0 +1,394 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14511_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64];
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, w_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14511_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64];
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, w_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,411 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14511_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha1_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x41000000;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha1_ctx_t ctx = ctx0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
sha1_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
sha1_update_swap (&ctx0_tmp, w, w_len);
|
||||
|
||||
sha1_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14511_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha1_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x41000000;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha1_ctx_t ctx = ctx0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
sha1_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
sha1_update_swap (&ctx0_tmp, w, w_len);
|
||||
|
||||
sha1_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,397 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14511_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14511_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,321 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14512_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, w_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14512_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, w_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,339 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14512_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha1_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x41000000;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha1_ctx_t ctx = ctx0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
sha1_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
sha1_update_swap (&ctx0_tmp, w, w_len);
|
||||
|
||||
sha1_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14512_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha1_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x41000000;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha1_ctx_t ctx = ctx0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
sha1_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
sha1_update_swap (&ctx0_tmp, w, w_len);
|
||||
|
||||
sha1_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,325 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14512_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14512_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,323 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14513_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, w_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14513_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, w_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,341 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14513_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha1_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x41000000;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha1_ctx_t ctx = ctx0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
sha1_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
sha1_update_swap (&ctx0_tmp, w, w_len);
|
||||
|
||||
sha1_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14513_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha1_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x41000000;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha1_ctx_t ctx = ctx0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
sha1_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
sha1_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
sha1_update_swap (&ctx0_tmp, w, w_len);
|
||||
|
||||
sha1_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,327 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha1.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14513_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14513_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha1_ctx_t ctx0;
|
||||
|
||||
sha1_init (&ctx0);
|
||||
|
||||
sha1_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha1_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
sha1_ctx_t ctx;
|
||||
|
||||
sha1_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x41000000;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
sha1_update_swap (&ctx, w, pw_len);
|
||||
|
||||
sha1_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,356 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14521_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14521_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,345 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14521_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha256_ctx_t ctx = ctx0;
|
||||
|
||||
sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha256_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k4 = ctx.h[6];
|
||||
k5 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14521_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha256_ctx_t ctx = ctx0;
|
||||
|
||||
sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha256_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,371 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14521_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14521_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap(&ctx0, w, pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,283 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14522_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14522_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,273 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14522_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha256_ctx_t ctx = ctx0;
|
||||
|
||||
sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha256_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14522_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha256_ctx_t ctx = ctx0;
|
||||
|
||||
sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha256_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,299 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14522_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14522_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,285 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14523_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14523_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,275 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14523_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha256_ctx_t ctx = ctx0;
|
||||
|
||||
sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha256_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14523_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha256_ctx_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha256_ctx_t ctx = ctx0;
|
||||
|
||||
sha256_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha256_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,301 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha256.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14523_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14523_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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_t ctx0;
|
||||
|
||||
sha256_init (&ctx0);
|
||||
|
||||
sha256_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha256_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,355 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14531_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14531_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,345 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14531_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha512_ctx_t ctx = ctx0;
|
||||
|
||||
sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha512_final (&ctx);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx.h[2]);
|
||||
k5 = l32_from_64_S (ctx.h[2]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx.h[3]);
|
||||
k7 = l32_from_64_S (ctx.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14531_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha512_ctx_t ctx = ctx0;
|
||||
|
||||
sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha512_final (&ctx);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx.h[2]);
|
||||
k5 = l32_from_64_S (ctx.h[2]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx.h[3]);
|
||||
k7 = l32_from_64_S (ctx.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,371 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14531_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14531_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap(&ctx0, w, pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,282 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14532_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14532_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,273 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14532_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha512_ctx_t ctx = ctx0;
|
||||
|
||||
sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha512_final (&ctx);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx.h[2]);
|
||||
k5 = l32_from_64_S (ctx.h[2]);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx.h[3]);
|
||||
k7 = l32_from_64_S (ctx.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14532_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha512_ctx_t ctx = ctx0;
|
||||
|
||||
sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha512_final (&ctx);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx.h[2]);
|
||||
k5 = l32_from_64_S (ctx.h[2]);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx.h[3]);
|
||||
k7 = l32_from_64_S (ctx.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,299 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14532_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14532_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,285 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14533_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14533_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,275 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14533_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha512_ctx_t ctx = ctx0;
|
||||
|
||||
sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha512_final (&ctx);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx.h[2]);
|
||||
k5 = l32_from_64_S (ctx.h[2]);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx.h[3]);
|
||||
k7 = l32_from_64_S (ctx.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14533_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
sha512_ctx_t ctx = ctx0;
|
||||
|
||||
sha512_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
sha512_final (&ctx);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx.h[2]);
|
||||
k5 = l32_from_64_S (ctx.h[2]);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx.h[3]);
|
||||
k7 = l32_from_64_S (ctx.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,301 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14533_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14533_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
sha512_ctx_t ctx0;
|
||||
|
||||
sha512_init (&ctx0);
|
||||
|
||||
sha512_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
sha512_final (&ctx0);
|
||||
|
||||
const u32 k0 = h32_from_64_S (ctx0.h[0]);
|
||||
const u32 k1 = l32_from_64_S (ctx0.h[0]);
|
||||
const u32 k2 = h32_from_64_S (ctx0.h[1]);
|
||||
const u32 k3 = l32_from_64_S (ctx0.h[1]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = h32_from_64_S (ctx0.h[2]);
|
||||
k5 = l32_from_64_S (ctx0.h[2]);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = h32_from_64_S (ctx0.h[3]);
|
||||
k7 = l32_from_64_S (ctx0.h[3]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,394 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14541_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64];
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = hc_swap32_S (ctx0.h[0]);
|
||||
const u32 k1 = hc_swap32_S (ctx0.h[1]);
|
||||
const u32 k2 = hc_swap32_S (ctx0.h[2]);
|
||||
const u32 k3 = hc_swap32_S (ctx0.h[3]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = hc_swap32_S (ctx0.h[4]);
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = hc_swap32_S (ctx.h[0]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = hc_swap32_S (ctx.h[1]);
|
||||
k7 = hc_swap32_S (ctx.h[2]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14541_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64];
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = hc_swap32_S (ctx0.h[0]);
|
||||
const u32 k1 = hc_swap32_S (ctx0.h[1]);
|
||||
const u32 k2 = hc_swap32_S (ctx0.h[2]);
|
||||
const u32 k3 = hc_swap32_S (ctx0.h[3]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = hc_swap32_S (ctx0.h[4]);
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = hc_swap32_S (ctx.h[0]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = hc_swap32_S (ctx.h[1]);
|
||||
k7 = hc_swap32_S (ctx.h[2]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,411 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14541_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
ripemd160_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x00000041;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
ripemd160_update (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
ripemd160_ctx_t ctx = ctx0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
const u32 k0 = hc_swap32_S (ctx.h[0]);
|
||||
const u32 k1 = hc_swap32_S (ctx.h[1]);
|
||||
const u32 k2 = hc_swap32_S (ctx.h[2]);
|
||||
const u32 k3 = hc_swap32_S (ctx.h[3]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = hc_swap32_S (ctx.h[4]);
|
||||
|
||||
ripemd160_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
ripemd160_update (&ctx0_tmp, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx0_tmp);
|
||||
|
||||
k5 = hc_swap32_S (ctx0_tmp.h[0]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = hc_swap32_S (ctx0_tmp.h[1]);
|
||||
k7 = hc_swap32_S (ctx0_tmp.h[2]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14541_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
ripemd160_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x00000041;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
ripemd160_update (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
ripemd160_ctx_t ctx = ctx0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
const u32 k0 = hc_swap32_S (ctx.h[0]);
|
||||
const u32 k1 = hc_swap32_S (ctx.h[1]);
|
||||
const u32 k2 = hc_swap32_S (ctx.h[2]);
|
||||
const u32 k3 = hc_swap32_S (ctx.h[3]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = hc_swap32_S (ctx.h[4]);
|
||||
|
||||
ripemd160_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
ripemd160_update (&ctx0_tmp, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx0_tmp);
|
||||
|
||||
k5 = hc_swap32_S (ctx0_tmp.h[0]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = hc_swap32_S (ctx0_tmp.h[1]);
|
||||
k7 = hc_swap32_S (ctx0_tmp.h[2]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,397 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14541_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = hc_swap32_S (ctx0.h[0]);
|
||||
const u32 k1 = hc_swap32_S (ctx0.h[1]);
|
||||
const u32 k2 = hc_swap32_S (ctx0.h[2]);
|
||||
const u32 k3 = hc_swap32_S (ctx0.h[3]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = hc_swap32_S (ctx0.h[4]);
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = hc_swap32_S (ctx.h[0]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = hc_swap32_S (ctx.h[1]);
|
||||
k7 = hc_swap32_S (ctx.h[2]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14541_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = hc_swap32_S (ctx0.h[0]);
|
||||
const u32 k1 = hc_swap32_S (ctx0.h[1]);
|
||||
const u32 k2 = hc_swap32_S (ctx0.h[2]);
|
||||
const u32 k3 = hc_swap32_S (ctx0.h[3]);
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = hc_swap32_S (ctx0.h[4]);
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = hc_swap32_S (ctx.h[0]);
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = hc_swap32_S (ctx.h[1]);
|
||||
k7 = hc_swap32_S (ctx.h[2]);
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,321 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14542_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14542_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,339 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14542_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
ripemd160_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x00000041;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
ripemd160_update (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
ripemd160_ctx_t ctx = ctx0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
ripemd160_update (&ctx0_tmp, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14542_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
ripemd160_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x00000041;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
ripemd160_update (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
ripemd160_ctx_t ctx = ctx0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
ripemd160_update (&ctx0_tmp, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,325 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14542_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14542_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,323 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14543_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14543_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = tmp.pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = tmp.i[i];
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish setkey and encrypt
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,341 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14543_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
ripemd160_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x00000041;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
ripemd160_update (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
ripemd160_ctx_t ctx = ctx0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
ripemd160_update (&ctx0_tmp, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14543_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
ripemd160_ctx_t ctx0, ctx0_padding;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
u32 w[64] = { 0 };
|
||||
|
||||
u32 w_len = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
w_len = pws[gid].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = pws[gid].i[i];
|
||||
|
||||
ctx0_padding = ctx0;
|
||||
|
||||
ctx0_padding.w0[0] = 0x00000041;
|
||||
|
||||
ctx0_padding.len = 1;
|
||||
|
||||
ripemd160_update (&ctx0_padding, w, w_len);
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
ripemd160_ctx_t ctx = ctx0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
w_len = combs_buf[il_pos].pw_len;
|
||||
|
||||
for (u32 i = 0; i < 64; i++) w[i] = combs_buf[il_pos].i[i];
|
||||
}
|
||||
|
||||
ripemd160_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx0_tmp = ctx0_padding;
|
||||
|
||||
ripemd160_update (&ctx0_tmp, w, w_len);
|
||||
|
||||
ripemd160_final (&ctx0_tmp);
|
||||
|
||||
k5 = ctx0_tmp.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0_tmp.h[1];
|
||||
k7 = ctx0_tmp.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,327 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_ripemd160.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14543_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14543_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
ripemd160_ctx_t ctx0;
|
||||
|
||||
ripemd160_init (&ctx0);
|
||||
|
||||
ripemd160_update (&ctx0, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
|
||||
ripemd160_ctx_t ctx;
|
||||
|
||||
ripemd160_init (&ctx);
|
||||
|
||||
ctx.w0[0] = 0x00000041;
|
||||
|
||||
ctx.len = 1;
|
||||
|
||||
ripemd160_update (&ctx, w, pw_len);
|
||||
|
||||
ripemd160_final (&ctx);
|
||||
|
||||
k5 = ctx.h[0];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[1];
|
||||
k7 = ctx.h[2];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,410 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14551_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes/whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14551_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes/whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,399 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14551_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes/whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
whirlpool_ctx_t ctx = ctx0;
|
||||
|
||||
whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
whirlpool_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14551_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes/whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
whirlpool_ctx_t ctx = ctx0;
|
||||
|
||||
whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
whirlpool_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,425 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_aes.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14551_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes/whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14551_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* aes/whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u32 s_te0[256];
|
||||
LOCAL_VK u32 s_te1[256];
|
||||
LOCAL_VK u32 s_te2[256];
|
||||
LOCAL_VK u32 s_te3[256];
|
||||
LOCAL_VK u32 s_te4[256];
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_te0[i] = te0[i];
|
||||
s_te1[i] = te1[i];
|
||||
s_te2[i] = te2[i];
|
||||
s_te3[i] = te3[i];
|
||||
s_te4[i] = te4[i];
|
||||
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u32a *s_te0 = te0;
|
||||
CONSTANT_AS u32a *s_te1 = te1;
|
||||
CONSTANT_AS u32a *s_te2 = te2;
|
||||
CONSTANT_AS u32a *s_te3 = te3;
|
||||
CONSTANT_AS u32a *s_te4 = te4;
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 aes_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap(&ctx0, w, pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = k0;
|
||||
ukey[1] = k1;
|
||||
ukey[2] = k2;
|
||||
ukey[3] = k3;
|
||||
|
||||
if (aes_key_len > 128)
|
||||
{
|
||||
ukey[4] = k4;
|
||||
ukey[5] = k5;
|
||||
|
||||
if (aes_key_len > 192)
|
||||
{
|
||||
ukey[6] = k6;
|
||||
ukey[7] = k7;
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[0]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[1]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[2]),
|
||||
hc_swap32_S(salt_bufs[SALT_POS].salt_buf[3])
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// aes
|
||||
|
||||
u32 ks[60] = { 0 };
|
||||
|
||||
if (aes_key_len == 128)
|
||||
{
|
||||
AES128_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES128_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else if (aes_key_len == 192)
|
||||
{
|
||||
AES192_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES192_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
else
|
||||
{
|
||||
AES256_set_encrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3);
|
||||
|
||||
AES256_encrypt (ks, iv, CT, s_te0, s_te1, s_te2, s_te3, s_te4);
|
||||
}
|
||||
|
||||
const u32 r0 = CT[0];
|
||||
const u32 r1 = CT[1];
|
||||
const u32 r2 = CT[2];
|
||||
const u32 r3 = CT[3];
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,373 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14552_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14552_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,363 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14552_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
whirlpool_ctx_t ctx = ctx0;
|
||||
|
||||
whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
whirlpool_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14552_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
whirlpool_ctx_t ctx = ctx0;
|
||||
|
||||
whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
whirlpool_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,389 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_serpent.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14552_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14552_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 serpent_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (serpent_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (serpent_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// serpent
|
||||
|
||||
u32 ks[140] = { 0 };
|
||||
|
||||
if (serpent_key_len == 128)
|
||||
{
|
||||
serpent128_set_key (ks, ukey);
|
||||
|
||||
serpent128_encrypt (ks, iv, CT);
|
||||
}
|
||||
else if (serpent_key_len == 192)
|
||||
{
|
||||
serpent192_set_key (ks, ukey);
|
||||
|
||||
serpent192_encrypt (ks, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
serpent256_set_key (ks, ukey);
|
||||
|
||||
serpent256_encrypt (ks, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,375 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_rp.h"
|
||||
#include "inc_rp.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14553_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14553_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
COPY_PW (pws[gid]);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
pw_t tmp = PASTE_PW;
|
||||
|
||||
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, tmp.i, tmp.pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,365 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14553_mxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
whirlpool_ctx_t ctx = ctx0;
|
||||
|
||||
whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
whirlpool_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14553_sxx (KERN_ATTR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len);
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
|
||||
{
|
||||
whirlpool_ctx_t ctx = ctx0;
|
||||
|
||||
whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len);
|
||||
|
||||
whirlpool_final (&ctx);
|
||||
|
||||
const u32 k0 = ctx.h[0];
|
||||
const u32 k1 = ctx.h[1];
|
||||
const u32 k2 = ctx.h[2];
|
||||
const u32 k3 = ctx.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx.h[4];
|
||||
k5 = ctx.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx.h[6];
|
||||
k7 = ctx.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,391 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_scalar.cl"
|
||||
#include "inc_hash_whirlpool.cl"
|
||||
#include "inc_cipher_twofish.cl"
|
||||
#endif
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
KERNEL_FQ void m14553_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_M_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL_FQ void m14553_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
/**
|
||||
* whirlpool shared
|
||||
*/
|
||||
|
||||
#ifdef REAL_SHM
|
||||
|
||||
const u64 lid = get_local_id (0);
|
||||
const u64 lsz = get_local_size (0);
|
||||
|
||||
LOCAL_VK u64 s_MT0[256];
|
||||
LOCAL_VK u64 s_MT1[256];
|
||||
LOCAL_VK u64 s_MT2[256];
|
||||
LOCAL_VK u64 s_MT3[256];
|
||||
LOCAL_VK u64 s_MT4[256];
|
||||
LOCAL_VK u64 s_MT5[256];
|
||||
LOCAL_VK u64 s_MT6[256];
|
||||
LOCAL_VK u64 s_MT7[256];
|
||||
|
||||
for (u32 i = lid; i < 256; i += lsz)
|
||||
{
|
||||
s_MT0[i] = MT0[i];
|
||||
s_MT1[i] = MT1[i];
|
||||
s_MT2[i] = MT2[i];
|
||||
s_MT3[i] = MT3[i];
|
||||
s_MT4[i] = MT4[i];
|
||||
s_MT5[i] = MT5[i];
|
||||
s_MT6[i] = MT6[i];
|
||||
s_MT7[i] = MT7[i];
|
||||
}
|
||||
|
||||
SYNC_THREADS ();
|
||||
|
||||
#else
|
||||
|
||||
CONSTANT_AS u64a *s_MT0 = MT0;
|
||||
CONSTANT_AS u64a *s_MT1 = MT1;
|
||||
CONSTANT_AS u64a *s_MT2 = MT2;
|
||||
CONSTANT_AS u64a *s_MT3 = MT3;
|
||||
CONSTANT_AS u64a *s_MT4 = MT4;
|
||||
CONSTANT_AS u64a *s_MT5 = MT5;
|
||||
CONSTANT_AS u64a *s_MT6 = MT6;
|
||||
CONSTANT_AS u64a *s_MT7 = MT7;
|
||||
|
||||
#endif
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* digest
|
||||
*/
|
||||
|
||||
const u32 search[4] =
|
||||
{
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
|
||||
digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
|
||||
};
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
u32 twofish_key_len = esalt_bufs[DIGESTS_OFFSET].key_size;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
* loop
|
||||
*/
|
||||
|
||||
u32x w0l = w[0];
|
||||
|
||||
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
|
||||
{
|
||||
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
|
||||
|
||||
const u32x w0 = w0l | w0r;
|
||||
|
||||
w[0] = w0;
|
||||
|
||||
whirlpool_ctx_t ctx0;
|
||||
|
||||
whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7);
|
||||
|
||||
whirlpool_update_swap (&ctx0, w, pw_len);
|
||||
|
||||
whirlpool_final (&ctx0);
|
||||
|
||||
const u32 k0 = ctx0.h[0];
|
||||
const u32 k1 = ctx0.h[1];
|
||||
const u32 k2 = ctx0.h[2];
|
||||
const u32 k3 = ctx0.h[3];
|
||||
|
||||
u32 k4 = 0, k5 = 0, k6 = 0, k7 = 0;
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
k4 = ctx0.h[4];
|
||||
k5 = ctx0.h[5];
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
k6 = ctx0.h[6];
|
||||
k7 = ctx0.h[7];
|
||||
}
|
||||
}
|
||||
|
||||
// key
|
||||
|
||||
u32 ukey[8] = { 0 };
|
||||
|
||||
ukey[0] = hc_swap32_S (k0);
|
||||
ukey[1] = hc_swap32_S (k1);
|
||||
ukey[2] = hc_swap32_S (k2);
|
||||
ukey[3] = hc_swap32_S (k3);
|
||||
|
||||
if (twofish_key_len > 128)
|
||||
{
|
||||
ukey[4] = hc_swap32_S (k4);
|
||||
ukey[5] = hc_swap32_S (k5);
|
||||
|
||||
if (twofish_key_len > 192)
|
||||
{
|
||||
ukey[6] = hc_swap32_S (k6);
|
||||
ukey[7] = hc_swap32_S (k7);
|
||||
}
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u32 iv[4] = {
|
||||
salt_bufs[SALT_POS].salt_buf[0],
|
||||
salt_bufs[SALT_POS].salt_buf[1],
|
||||
salt_bufs[SALT_POS].salt_buf[2],
|
||||
salt_bufs[SALT_POS].salt_buf[3]
|
||||
};
|
||||
|
||||
// CT
|
||||
|
||||
u32 CT[4] = { 0 };
|
||||
|
||||
// twofish
|
||||
|
||||
u32 sk1[4] = { 0 };
|
||||
u32 lk1[40] = { 0 };
|
||||
|
||||
if (twofish_key_len == 128)
|
||||
{
|
||||
twofish128_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish128_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else if (twofish_key_len == 192)
|
||||
{
|
||||
twofish192_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish192_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
else
|
||||
{
|
||||
twofish256_set_key (sk1, lk1, ukey);
|
||||
|
||||
twofish256_encrypt (sk1, lk1, iv, CT);
|
||||
}
|
||||
|
||||
const u32 r0 = hc_swap32_S (CT[0]);
|
||||
const u32 r1 = hc_swap32_S (CT[1]);
|
||||
const u32 r2 = hc_swap32_S (CT[2]);
|
||||
const u32 r3 = hc_swap32_S (CT[3]);
|
||||
|
||||
COMPARE_S_SCALAR (r0, r1, r2, r3);
|
||||
}
|
||||
}
|
@ -0,0 +1,408 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "modules.h"
|
||||
#include "bitops.h"
|
||||
#include "convert.h"
|
||||
#include "shared.h"
|
||||
|
||||
static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL;
|
||||
static const u32 DGST_POS0 = 0;
|
||||
static const u32 DGST_POS1 = 1;
|
||||
static const u32 DGST_POS2 = 2;
|
||||
static const u32 DGST_POS3 = 3;
|
||||
static const u32 DGST_SIZE = DGST_SIZE_4_4;
|
||||
static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_CIPHER_KPA;
|
||||
static const char *HASH_NAME = "Linux Kernel Crypto API (2.4)";
|
||||
static const u64 KERN_TYPE = 14541; // will be modified below
|
||||
static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE
|
||||
| OPTI_TYPE_NOT_ITERATED
|
||||
| OPTI_TYPE_NOT_SALTED;
|
||||
static const u64 OPTS_TYPE = OPTS_TYPE_PT_GENERATE_LE
|
||||
| OPTS_TYPE_SELF_TEST_DISABLE
|
||||
| OPTS_TYPE_PT_ADD80;
|
||||
static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED;
|
||||
static const char *ST_PASS = "hashcat";
|
||||
static const char *ST_HASH = "$cryptoapi$9$2$03000000000000000000000000000000$00000000000000000000000000000000$d1d20e91a8f2e18881dc79369d8af761";
|
||||
|
||||
u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; }
|
||||
u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; }
|
||||
u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; }
|
||||
u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; }
|
||||
u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; }
|
||||
u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; }
|
||||
u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; }
|
||||
const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; }
|
||||
u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; }
|
||||
u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; }
|
||||
u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; }
|
||||
u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; }
|
||||
const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; }
|
||||
const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; }
|
||||
|
||||
static const char *SIGNATURE_CRYPTOAPI = "$cryptoapi$";
|
||||
|
||||
typedef enum kern_type_cryptoapi
|
||||
{
|
||||
KERN_TYPE_CRYPTOAPI_SHA1_AES = 14511, // 0
|
||||
KERN_TYPE_CRYPTOAPI_SHA1_SERPENT = 14512, // 1
|
||||
KERN_TYPE_CRYPTOAPI_SHA1_TWOFISH = 14513, // 2
|
||||
KERN_TYPE_CRYPTOAPI_SHA256_AES = 14521, // 3
|
||||
KERN_TYPE_CRYPTOAPI_SHA256_SERPENT = 14522, // 4
|
||||
KERN_TYPE_CRYPTOAPI_SHA256_TWOFISH = 14523, // 5
|
||||
KERN_TYPE_CRYPTOAPI_SHA512_AES = 14531, // 6
|
||||
KERN_TYPE_CRYPTOAPI_SHA512_SERPENT = 14532, // 7
|
||||
KERN_TYPE_CRYPTOAPI_SHA512_TWOFISH = 14533, // 8
|
||||
KERN_TYPE_CRYPTOAPI_RIPEMD160_AES = 14541, // 9
|
||||
KERN_TYPE_CRYPTOAPI_RIPEMD160_SERPENT = 14542, // 10
|
||||
KERN_TYPE_CRYPTOAPI_RIPEMD160_TWOFISH = 14543, // 11
|
||||
KERN_TYPE_CRYPTOAPI_WHIRLPOOL_AES = 14551, // 12
|
||||
KERN_TYPE_CRYPTOAPI_WHIRLPOOL_SERPENT = 14552, // 13
|
||||
KERN_TYPE_CRYPTOAPI_WHIRLPOOL_TWOFISH = 14553, // 14
|
||||
|
||||
} kern_type_cryptoapi_t;
|
||||
|
||||
typedef enum hc_cryptoapi_key_size
|
||||
{
|
||||
HC_CRYPTOAPI_KEY_SIZE_128 = 128,
|
||||
HC_CRYPTOAPI_KEY_SIZE_192 = 192,
|
||||
HC_CRYPTOAPI_KEY_SIZE_256 = 256,
|
||||
|
||||
} hc_cryptoapi_key_size_t;
|
||||
|
||||
typedef enum hc_cryptoapi_cipher_type
|
||||
{
|
||||
HC_CRYPTOAPI_CIPHER_TYPE_AES = 1,
|
||||
HC_CRYPTOAPI_CIPHER_TYPE_SERPENT = 2,
|
||||
HC_CRYPTOAPI_CIPHER_TYPE_TWOFISH = 3,
|
||||
|
||||
} hc_cryptoapi_cypher_type_t;
|
||||
|
||||
typedef struct cryptoapi
|
||||
{
|
||||
u32 kern_type;
|
||||
u32 key_size;
|
||||
u32 iv_buf[4];
|
||||
u32 pt_buf[4];
|
||||
|
||||
} cryptoapi_t;
|
||||
|
||||
char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param)
|
||||
{
|
||||
char *jit_build_options = NULL;
|
||||
|
||||
// Extra treatment for Apple systems
|
||||
if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE)
|
||||
{
|
||||
return jit_build_options;
|
||||
}
|
||||
|
||||
// Intel CPU
|
||||
if ((device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) && (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU))
|
||||
{
|
||||
hc_asprintf (&jit_build_options, "-D _unroll");
|
||||
}
|
||||
|
||||
// AMD-GPU-PRO
|
||||
if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == false))
|
||||
{
|
||||
hc_asprintf (&jit_build_options, "-D _unroll");
|
||||
}
|
||||
|
||||
// ROCM
|
||||
if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == true))
|
||||
{
|
||||
hc_asprintf (&jit_build_options, "-D _unroll");
|
||||
}
|
||||
|
||||
return jit_build_options;
|
||||
}
|
||||
|
||||
u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u64 esalt_size = (const u64) sizeof (cryptoapi_t);
|
||||
|
||||
return esalt_size;
|
||||
}
|
||||
|
||||
int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len)
|
||||
{
|
||||
u32 *digest = (u32 *) digest_buf;
|
||||
|
||||
cryptoapi_t *cryptoapi = (cryptoapi_t *) esalt_buf;
|
||||
|
||||
token_t token;
|
||||
|
||||
token.token_cnt = 6;
|
||||
|
||||
token.signatures_cnt = 1;
|
||||
token.signatures_buf[0] = SIGNATURE_CRYPTOAPI;
|
||||
|
||||
token.len[0] = 11;
|
||||
token.attr[0] = TOKEN_ATTR_FIXED_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_SIGNATURE;
|
||||
|
||||
token.sep[1] = '$';
|
||||
token.len_min[1] = 1;
|
||||
token.len_max[1] = 2;
|
||||
token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_DIGIT;
|
||||
|
||||
token.sep[2] = '$';
|
||||
token.len_min[2] = 1;
|
||||
token.len_max[2] = 1;
|
||||
token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_DIGIT;
|
||||
|
||||
token.sep[3] = '$';
|
||||
token.len_min[3] = 16 * 2;
|
||||
token.len_max[3] = 16 * 2;
|
||||
token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
token.sep[4] = '$';
|
||||
token.len_min[4] = 16 * 2;
|
||||
token.len_max[4] = 16 * 2;
|
||||
token.attr[4] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
token.sep[5] = '$';
|
||||
token.len_min[5] = 16 * 2;
|
||||
token.len_max[5] = 16 * 2;
|
||||
token.attr[5] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token);
|
||||
|
||||
if (rc_tokenizer != PARSER_OK) return (rc_tokenizer);
|
||||
|
||||
const u32 type = atoi ((char *)token.buf[1]);
|
||||
|
||||
if (type > 14) return (PARSER_CRYPTOAPI_KERNELTYPE);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 0: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA1_AES; break;
|
||||
case 1: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA1_SERPENT; break;
|
||||
case 2: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA1_TWOFISH; break;
|
||||
case 3: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA256_AES; break;
|
||||
case 4: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA256_SERPENT; break;
|
||||
case 5: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA256_TWOFISH; break;
|
||||
case 6: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA512_AES; break;
|
||||
case 7: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA512_SERPENT; break;
|
||||
case 8: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_SHA512_TWOFISH; break;
|
||||
case 9: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_RIPEMD160_AES; break;
|
||||
case 10: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_RIPEMD160_SERPENT; break;
|
||||
case 11: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_RIPEMD160_TWOFISH; break;
|
||||
case 12: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_WHIRLPOOL_AES; break;
|
||||
case 13: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_WHIRLPOOL_SERPENT; break;
|
||||
case 14: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_WHIRLPOOL_TWOFISH; break;
|
||||
}
|
||||
|
||||
const u32 key_size = atoi ((char *)token.buf[2]);
|
||||
|
||||
if (key_size > 2) return (PARSER_CRYPTOAPI_KEYSIZE);
|
||||
|
||||
switch (key_size)
|
||||
{
|
||||
case 0: cryptoapi->key_size = HC_CRYPTOAPI_KEY_SIZE_128; break;
|
||||
case 1: cryptoapi->key_size = HC_CRYPTOAPI_KEY_SIZE_192; break;
|
||||
case 2: cryptoapi->key_size = HC_CRYPTOAPI_KEY_SIZE_256; break;
|
||||
}
|
||||
|
||||
// IV
|
||||
|
||||
const u8 *iv_pos = token.buf[3];
|
||||
|
||||
cryptoapi->iv_buf[0] = hex_to_u32 (iv_pos + 0);
|
||||
cryptoapi->iv_buf[1] = hex_to_u32 (iv_pos + 8);
|
||||
cryptoapi->iv_buf[2] = hex_to_u32 (iv_pos + 16);
|
||||
cryptoapi->iv_buf[3] = hex_to_u32 (iv_pos + 24);
|
||||
|
||||
// PT
|
||||
|
||||
const u8 *pt_pos = token.buf[4];
|
||||
|
||||
cryptoapi->pt_buf[0] = hex_to_u32 (pt_pos + 0);
|
||||
cryptoapi->pt_buf[1] = hex_to_u32 (pt_pos + 8);
|
||||
cryptoapi->pt_buf[2] = hex_to_u32 (pt_pos + 16);
|
||||
cryptoapi->pt_buf[3] = hex_to_u32 (pt_pos + 24);
|
||||
|
||||
// salt_buf
|
||||
|
||||
salt->salt_len = 16;
|
||||
|
||||
salt->salt_buf[0] = cryptoapi->pt_buf[0] ^ cryptoapi->iv_buf[0];
|
||||
salt->salt_buf[1] = cryptoapi->pt_buf[1] ^ cryptoapi->iv_buf[1];
|
||||
salt->salt_buf[2] = cryptoapi->pt_buf[2] ^ cryptoapi->iv_buf[2];
|
||||
salt->salt_buf[3] = cryptoapi->pt_buf[3] ^ cryptoapi->iv_buf[3];
|
||||
|
||||
// hash
|
||||
|
||||
const u8 *hash_pos = token.buf[5];
|
||||
|
||||
digest[0] = hex_to_u32 (hash_pos + 0);
|
||||
digest[1] = hex_to_u32 (hash_pos + 8);
|
||||
digest[2] = hex_to_u32 (hash_pos + 16);
|
||||
digest[3] = hex_to_u32 (hash_pos + 24);
|
||||
|
||||
digest[0] = byte_swap_32 (digest[0]);
|
||||
digest[1] = byte_swap_32 (digest[1]);
|
||||
digest[2] = byte_swap_32 (digest[2]);
|
||||
digest[3] = byte_swap_32 (digest[3]);
|
||||
|
||||
return (PARSER_OK);
|
||||
}
|
||||
|
||||
int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size)
|
||||
{
|
||||
const cryptoapi_t *cryptoapi = (const cryptoapi_t *) esalt_buf;
|
||||
|
||||
const u32 *digest = (const u32 *) digest_buf;
|
||||
|
||||
u32 type = cryptoapi->kern_type;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case KERN_TYPE_CRYPTOAPI_SHA1_AES: type = 0; break;
|
||||
case KERN_TYPE_CRYPTOAPI_SHA1_SERPENT: type = 1; break;
|
||||
case KERN_TYPE_CRYPTOAPI_SHA1_TWOFISH: type = 2; break;
|
||||
case KERN_TYPE_CRYPTOAPI_SHA256_AES: type = 3; break;
|
||||
case KERN_TYPE_CRYPTOAPI_SHA256_SERPENT: type = 4; break;
|
||||
case KERN_TYPE_CRYPTOAPI_SHA256_TWOFISH: type = 5; break;
|
||||
case KERN_TYPE_CRYPTOAPI_SHA512_AES: type = 6; break;
|
||||
case KERN_TYPE_CRYPTOAPI_SHA512_SERPENT: type = 7; break;
|
||||
case KERN_TYPE_CRYPTOAPI_SHA512_TWOFISH: type = 8; break;
|
||||
case KERN_TYPE_CRYPTOAPI_RIPEMD160_AES: type = 9; break;
|
||||
case KERN_TYPE_CRYPTOAPI_RIPEMD160_SERPENT: type = 10; break;
|
||||
case KERN_TYPE_CRYPTOAPI_RIPEMD160_TWOFISH: type = 11; break;
|
||||
case KERN_TYPE_CRYPTOAPI_WHIRLPOOL_AES: type = 12; break;
|
||||
case KERN_TYPE_CRYPTOAPI_WHIRLPOOL_SERPENT: type = 13; break;
|
||||
case KERN_TYPE_CRYPTOAPI_WHIRLPOOL_TWOFISH: type = 14; break;
|
||||
}
|
||||
|
||||
u32 key_size = cryptoapi->key_size;
|
||||
|
||||
switch (key_size)
|
||||
{
|
||||
case HC_CRYPTOAPI_KEY_SIZE_128: key_size = 0; break;
|
||||
case HC_CRYPTOAPI_KEY_SIZE_192: key_size = 1; break;
|
||||
case HC_CRYPTOAPI_KEY_SIZE_256: key_size = 2; break;
|
||||
}
|
||||
|
||||
u32 tmp[4];
|
||||
|
||||
tmp[0] = byte_swap_32 (digest[0]);
|
||||
tmp[1] = byte_swap_32 (digest[1]);
|
||||
tmp[2] = byte_swap_32 (digest[2]);
|
||||
tmp[3] = byte_swap_32 (digest[3]);
|
||||
|
||||
int out_len = snprintf (line_buf, line_size, "%s%u$%u$%08x%08x%08x%08x$%08x%08x%08x%08x$",
|
||||
SIGNATURE_CRYPTOAPI,
|
||||
type,
|
||||
key_size,
|
||||
byte_swap_32 (cryptoapi->iv_buf[0]),
|
||||
byte_swap_32 (cryptoapi->iv_buf[1]),
|
||||
byte_swap_32 (cryptoapi->iv_buf[2]),
|
||||
byte_swap_32 (cryptoapi->iv_buf[3]),
|
||||
byte_swap_32 (cryptoapi->pt_buf[0]),
|
||||
byte_swap_32 (cryptoapi->pt_buf[1]),
|
||||
byte_swap_32 (cryptoapi->pt_buf[2]),
|
||||
byte_swap_32 (cryptoapi->pt_buf[3]));
|
||||
|
||||
u8 *out_buf = (u8 *) line_buf;
|
||||
|
||||
u32_to_hex (tmp[0], out_buf + out_len); out_len += 8;
|
||||
u32_to_hex (tmp[1], out_buf + out_len); out_len += 8;
|
||||
u32_to_hex (tmp[2], out_buf + out_len); out_len += 8;
|
||||
u32_to_hex (tmp[3], out_buf + out_len); out_len += 8;
|
||||
|
||||
return out_len;
|
||||
}
|
||||
|
||||
u64 module_kern_type_dynamic (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info)
|
||||
{
|
||||
const cryptoapi_t *cryptoapi = (const cryptoapi_t *) esalt_buf;
|
||||
|
||||
return cryptoapi->kern_type;
|
||||
}
|
||||
|
||||
void module_init (module_ctx_t *module_ctx)
|
||||
{
|
||||
module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT;
|
||||
module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT;
|
||||
|
||||
module_ctx->module_attack_exec = module_attack_exec;
|
||||
module_ctx->module_benchmark_esalt = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_mask = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_salt = MODULE_DEFAULT;
|
||||
module_ctx->module_build_plain_postprocess = MODULE_DEFAULT;
|
||||
module_ctx->module_deep_comp_kernel = MODULE_DEFAULT;
|
||||
module_ctx->module_dgst_pos0 = module_dgst_pos0;
|
||||
module_ctx->module_dgst_pos1 = module_dgst_pos1;
|
||||
module_ctx->module_dgst_pos2 = module_dgst_pos2;
|
||||
module_ctx->module_dgst_pos3 = module_dgst_pos3;
|
||||
module_ctx->module_dgst_size = module_dgst_size;
|
||||
module_ctx->module_dictstat_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_esalt_size = module_esalt_size;
|
||||
module_ctx->module_extra_buffer_size = MODULE_DEFAULT;
|
||||
module_ctx->module_extra_tmp_size = MODULE_DEFAULT;
|
||||
module_ctx->module_forced_outfile_format = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_count = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_parse = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_save = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode_potfile = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode = module_hash_decode;
|
||||
module_ctx->module_hash_encode_status = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_encode_potfile = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_encode = module_hash_encode;
|
||||
module_ctx->module_hash_init_selftest = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_mode = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_category = module_hash_category;
|
||||
module_ctx->module_hash_name = module_hash_name;
|
||||
module_ctx->module_hashes_count_min = MODULE_DEFAULT;
|
||||
module_ctx->module_hashes_count_max = MODULE_DEFAULT;
|
||||
module_ctx->module_hlfmt_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_size = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_init = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_term = MODULE_DEFAULT;
|
||||
module_ctx->module_hook12 = MODULE_DEFAULT;
|
||||
module_ctx->module_hook23 = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_salt_size = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_size = MODULE_DEFAULT;
|
||||
module_ctx->module_jit_build_options = module_jit_build_options;
|
||||
module_ctx->module_jit_cache_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_accel_max = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_accel_min = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_loops_max = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_loops_min = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_threads_max = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_threads_min = MODULE_DEFAULT;
|
||||
module_ctx->module_kern_type = module_kern_type;
|
||||
module_ctx->module_kern_type_dynamic = module_kern_type_dynamic;
|
||||
module_ctx->module_opti_type = module_opti_type;
|
||||
module_ctx->module_opts_type = module_opts_type;
|
||||
module_ctx->module_outfile_check_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_custom_check = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT;
|
||||
module_ctx->module_pwdump_column = MODULE_DEFAULT;
|
||||
module_ctx->module_pw_max = MODULE_DEFAULT;
|
||||
module_ctx->module_pw_min = MODULE_DEFAULT;
|
||||
module_ctx->module_salt_max = MODULE_DEFAULT;
|
||||
module_ctx->module_salt_min = MODULE_DEFAULT;
|
||||
module_ctx->module_salt_type = module_salt_type;
|
||||
module_ctx->module_separator = MODULE_DEFAULT;
|
||||
module_ctx->module_st_hash = module_st_hash;
|
||||
module_ctx->module_st_pass = module_st_pass;
|
||||
module_ctx->module_tmp_size = MODULE_DEFAULT;
|
||||
module_ctx->module_unstable_warning = MODULE_DEFAULT;
|
||||
module_ctx->module_warmup_disable = MODULE_DEFAULT;
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Author: Gabriele 'matrix' Gristina
|
||||
# Version: 1.0
|
||||
# Date: Fri May 7 01:02:56 CEST 2021
|
||||
# License: MIT
|
||||
|
||||
import argparse
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
kern_type = -1
|
||||
hash_mode = -1
|
||||
hash_modes = [ 14511, 14512, 14513, 14521, 14522, 14523, 14531, 14532, 14533, 14541, 14542, 14543, 14551, 14552, 14553 ]
|
||||
|
||||
def validate_source(parser, arg):
|
||||
if not os.path.exists(arg):
|
||||
parser.error("! Invalid source argument: does not exist")
|
||||
else:
|
||||
return open(arg, 'rb')
|
||||
|
||||
def validate_keysize(parser, ks):
|
||||
if ks == '128':
|
||||
return 0
|
||||
elif ks == '192':
|
||||
return 1
|
||||
elif ks == '256':
|
||||
return 2
|
||||
else:
|
||||
parser.error("! Invalid key size selected ...")
|
||||
|
||||
def valid_hash_cipher(hash, cipher):
|
||||
if hash != 'sha1' and hash != 'sha256' and hash != 'sha512' and hash != 'ripemd160' and hash != 'whirlpool':
|
||||
print("! Invalid or not supported hash type")
|
||||
exit(1)
|
||||
|
||||
if cipher != 'aes' and cipher != 'serpent' and cipher != 'twofish':
|
||||
print("! Invalid or not supported cipher")
|
||||
exit(1)
|
||||
|
||||
if hash == 'sha1':
|
||||
if cipher == 'aes':
|
||||
return 0
|
||||
elif cipher == 'serpent':
|
||||
return 1
|
||||
else:
|
||||
return 2
|
||||
elif hash == 'sha256':
|
||||
if cipher == 'aes':
|
||||
return 3
|
||||
elif args.cipher == 'serpent':
|
||||
return 4
|
||||
else:
|
||||
return 5
|
||||
elif hash == 'sha512':
|
||||
if cipher == 'aes':
|
||||
return 6
|
||||
elif cipher == 'serpent':
|
||||
return 7
|
||||
else:
|
||||
return 8
|
||||
elif hash == 'ripemd160':
|
||||
if cipher == 'aes':
|
||||
return 9
|
||||
elif cipher == 'serpent':
|
||||
return 10
|
||||
else:
|
||||
return 11
|
||||
else: # whirlpool
|
||||
if cipher == 'aes':
|
||||
return 12
|
||||
elif cipher == 'serpent':
|
||||
return 13
|
||||
else:
|
||||
return 14
|
||||
|
||||
parser = argparse.ArgumentParser(description='cryptoloop2hashcat extraction tool')
|
||||
|
||||
parser.add_argument('--source', required=True, help='set cryptoloop disk/image from path', type=lambda src: validate_source(parser, src))
|
||||
parser.add_argument('--hash', required=True, help='set hash type. Supported: sha1, sha256, sha512, ripemd160 or whirlpool.')
|
||||
parser.add_argument('--cipher', required=True, help='set cipher type. Supported: aes, serpent or twofish.')
|
||||
parser.add_argument('--keysize', required=True, help='set key size. Supported: 128, 192 or 256.', type=lambda ks: validate_keysize(parser, ks))
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
kern_type = valid_hash_cipher(args.hash, args.cipher)
|
||||
hash_mode = hash_modes[kern_type]
|
||||
key_size = args.keysize
|
||||
|
||||
f = args.source
|
||||
f.seek(1536)
|
||||
|
||||
if sys.version_info[0] == 3:
|
||||
ct = f.read(16).hex()
|
||||
else:
|
||||
ct = f.read(16).encode('hex')
|
||||
|
||||
f.close()
|
||||
|
||||
print('$cryptoapi$' + str(kern_type) + '$' + str(key_size) + '$03000000000000000000000000000000$00000000000000000000000000000000$' + ct)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue