mirror of
https://github.com/hashcat/hashcat.git
synced 2025-07-24 15:38:47 +00:00

Updated kernel declarations from "KERNEL_FQ void HC_ATTR_SEQ" to "KERNEL_FQ KERNEL_FA void". Please update your custom plugin kernels accordingly. Added spilling size as a factor in calculating usable memory per device. This is based on undocumented variables and may not be 100% accurate, but it works well in practice. Added a compiler hint to scrypt-based kernels indicating the guaranteed maximum thread count per kernel invocation. Removed redundant kernel code 29800, as it is identical to 27700, and updated the plugin.
1319 lines
33 KiB
Common Lisp
1319 lines
33 KiB
Common Lisp
/**
|
|
* Author......: See docs/credits.txt
|
|
* License.....: MIT
|
|
*/
|
|
|
|
#ifdef KERNEL_STATIC
|
|
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
|
#include M2S(INCLUDE_PATH/inc_types.h)
|
|
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
|
#include M2S(INCLUDE_PATH/inc_common.cl)
|
|
#include M2S(INCLUDE_PATH/inc_hash_sha256.cl)
|
|
#include M2S(INCLUDE_PATH/inc_hash_sha384.cl)
|
|
#include M2S(INCLUDE_PATH/inc_hash_sha512.cl)
|
|
#include M2S(INCLUDE_PATH/inc_cipher_aes.cl)
|
|
#endif
|
|
|
|
#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl)
|
|
#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl)
|
|
|
|
#define PUTCHAR(a,p,c) ((PRIVATE_AS u8 *)(a))[(p)] = (u8) (c)
|
|
#define GETCHAR(a,p) ((PRIVATE_AS u8 *)(a))[(p)]
|
|
|
|
#define PUTCHAR_BE(a,p,c) ((PRIVATE_AS u8 *)(a))[(p) ^ 3] = (u8) (c)
|
|
#define GETCHAR_BE(a,p) ((PRIVATE_AS u8 *)(a))[(p) ^ 3]
|
|
|
|
typedef struct pdf
|
|
{
|
|
int V;
|
|
int R;
|
|
int P;
|
|
|
|
int enc_md;
|
|
|
|
u32 id_buf[8];
|
|
u32 u_buf[32];
|
|
u32 o_buf[32];
|
|
|
|
int id_len;
|
|
int o_len;
|
|
int u_len;
|
|
|
|
u32 rc4key[2];
|
|
u32 rc4data[2];
|
|
|
|
int P_minus;
|
|
|
|
} pdf_t;
|
|
|
|
typedef struct pdf17l8_tmp
|
|
{
|
|
union
|
|
{
|
|
u32 dgst32[16];
|
|
u64 dgst64[8];
|
|
};
|
|
|
|
u32 dgst_len;
|
|
u32 W_len;
|
|
|
|
} pdf17l8_tmp_t;
|
|
|
|
DECLSPEC void aes128_encrypt_cbc (PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 data[4];
|
|
|
|
data[0] = hc_swap32_S (in[0]);
|
|
data[1] = hc_swap32_S (in[1]);
|
|
data[2] = hc_swap32_S (in[2]);
|
|
data[3] = hc_swap32_S (in[3]);
|
|
|
|
data[0] ^= aes_iv[0];
|
|
data[1] ^= aes_iv[1];
|
|
data[2] ^= aes_iv[2];
|
|
data[3] ^= aes_iv[3];
|
|
|
|
aes128_encrypt (aes_ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
aes_iv[0] = out[0];
|
|
aes_iv[1] = out[1];
|
|
aes_iv[2] = out[2];
|
|
aes_iv[3] = out[3];
|
|
|
|
out[0] = hc_swap32_S (out[0]);
|
|
out[1] = hc_swap32_S (out[1]);
|
|
out[2] = hc_swap32_S (out[2]);
|
|
out[3] = hc_swap32_S (out[3]);
|
|
}
|
|
|
|
DECLSPEC u32 sha256_update_aes_64 (PRIVATE_AS sha256_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 ex = 0;
|
|
|
|
const int pos = ctx->len & 63;
|
|
|
|
ctx->len += len;
|
|
|
|
if ((pos + len) < 64)
|
|
{
|
|
switch_buffer_by_offset_be_S (w0, w1, w2, w3, pos);
|
|
|
|
ctx->w0[0] |= w0[0];
|
|
ctx->w0[1] |= w0[1];
|
|
ctx->w0[2] |= w0[2];
|
|
ctx->w0[3] |= w0[3];
|
|
ctx->w1[0] |= w1[0];
|
|
ctx->w1[1] |= w1[1];
|
|
ctx->w1[2] |= w1[2];
|
|
ctx->w1[3] |= w1[3];
|
|
ctx->w2[0] |= w2[0];
|
|
ctx->w2[1] |= w2[1];
|
|
ctx->w2[2] |= w2[2];
|
|
ctx->w2[3] |= w2[3];
|
|
ctx->w3[0] |= w3[0];
|
|
ctx->w3[1] |= w3[1];
|
|
ctx->w3[2] |= w3[2];
|
|
ctx->w3[3] |= w3[3];
|
|
}
|
|
else
|
|
{
|
|
u32 c0[4] = { 0 };
|
|
u32 c1[4] = { 0 };
|
|
u32 c2[4] = { 0 };
|
|
u32 c3[4] = { 0 };
|
|
|
|
switch_buffer_by_offset_carry_be_S (w0, w1, w2, w3, c0, c1, c2, c3, pos);
|
|
|
|
ctx->w0[0] |= w0[0];
|
|
ctx->w0[1] |= w0[1];
|
|
ctx->w0[2] |= w0[2];
|
|
ctx->w0[3] |= w0[3];
|
|
ctx->w1[0] |= w1[0];
|
|
ctx->w1[1] |= w1[1];
|
|
ctx->w1[2] |= w1[2];
|
|
ctx->w1[3] |= w1[3];
|
|
ctx->w2[0] |= w2[0];
|
|
ctx->w2[1] |= w2[1];
|
|
ctx->w2[2] |= w2[2];
|
|
ctx->w2[3] |= w2[3];
|
|
ctx->w3[0] |= w3[0];
|
|
ctx->w3[1] |= w3[1];
|
|
ctx->w3[2] |= w3[2];
|
|
ctx->w3[3] |= w3[3];
|
|
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
ex = ctx->w3[3] & 0xff;
|
|
|
|
sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h);
|
|
|
|
ctx->w0[0] = c0[0];
|
|
ctx->w0[1] = c0[1];
|
|
ctx->w0[2] = c0[2];
|
|
ctx->w0[3] = c0[3];
|
|
ctx->w1[0] = c1[0];
|
|
ctx->w1[1] = c1[1];
|
|
ctx->w1[2] = c1[2];
|
|
ctx->w1[3] = c1[3];
|
|
ctx->w2[0] = c2[0];
|
|
ctx->w2[1] = c2[1];
|
|
ctx->w2[2] = c2[2];
|
|
ctx->w2[3] = c2[3];
|
|
ctx->w3[0] = c3[0];
|
|
ctx->w3[1] = c3[1];
|
|
ctx->w3[2] = c3[2];
|
|
ctx->w3[3] = c3[3];
|
|
}
|
|
|
|
return ex;
|
|
}
|
|
|
|
DECLSPEC void sha256_update_aes (PRIVATE_AS sha256_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 w0[4];
|
|
u32 w1[4];
|
|
u32 w2[4];
|
|
u32 w3[4];
|
|
|
|
int pos1;
|
|
int pos4;
|
|
|
|
for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16)
|
|
{
|
|
w0[0] = w[pos4 + 0];
|
|
w0[1] = w[pos4 + 1];
|
|
w0[2] = w[pos4 + 2];
|
|
w0[3] = w[pos4 + 3];
|
|
w1[0] = w[pos4 + 4];
|
|
w1[1] = w[pos4 + 5];
|
|
w1[2] = w[pos4 + 6];
|
|
w1[3] = w[pos4 + 7];
|
|
w2[0] = w[pos4 + 8];
|
|
w2[1] = w[pos4 + 9];
|
|
w2[2] = w[pos4 + 10];
|
|
w2[3] = w[pos4 + 11];
|
|
w3[0] = w[pos4 + 12];
|
|
w3[1] = w[pos4 + 13];
|
|
w3[2] = w[pos4 + 14];
|
|
w3[3] = w[pos4 + 15];
|
|
|
|
sha256_update_aes_64 (ctx, w0, w1, w2, w3, 64, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
w0[0] = w[pos4 + 0];
|
|
w0[1] = w[pos4 + 1];
|
|
w0[2] = w[pos4 + 2];
|
|
w0[3] = w[pos4 + 3];
|
|
w1[0] = w[pos4 + 4];
|
|
w1[1] = w[pos4 + 5];
|
|
w1[2] = w[pos4 + 6];
|
|
w1[3] = w[pos4 + 7];
|
|
w2[0] = w[pos4 + 8];
|
|
w2[1] = w[pos4 + 9];
|
|
w2[2] = w[pos4 + 10];
|
|
w2[3] = w[pos4 + 11];
|
|
w3[0] = w[pos4 + 12];
|
|
w3[1] = w[pos4 + 13];
|
|
w3[2] = w[pos4 + 14];
|
|
w3[3] = w[pos4 + 15];
|
|
|
|
sha256_update_aes_64 (ctx, w0, w1, w2, w3, len - pos1, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
DECLSPEC void sha256_final_aes (PRIVATE_AS sha256_ctx_t *ctx, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
int pos = ctx->len & 63;
|
|
|
|
// no encryption needed, because pos is always 0
|
|
|
|
append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos ^ 3);
|
|
|
|
if (pos >= 56)
|
|
{
|
|
sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h);
|
|
|
|
ctx->w0[0] = 0;
|
|
ctx->w0[1] = 0;
|
|
ctx->w0[2] = 0;
|
|
ctx->w0[3] = 0;
|
|
ctx->w1[0] = 0;
|
|
ctx->w1[1] = 0;
|
|
ctx->w1[2] = 0;
|
|
ctx->w1[3] = 0;
|
|
ctx->w2[0] = 0;
|
|
ctx->w2[1] = 0;
|
|
ctx->w2[2] = 0;
|
|
ctx->w2[3] = 0;
|
|
ctx->w3[0] = 0;
|
|
ctx->w3[1] = 0;
|
|
ctx->w3[2] = 0;
|
|
ctx->w3[3] = 0;
|
|
}
|
|
|
|
ctx->w3[2] = 0;
|
|
ctx->w3[3] = ctx->len * 8;
|
|
|
|
sha256_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h);
|
|
}
|
|
|
|
DECLSPEC u32 sha384_update_aes_128 (PRIVATE_AS sha384_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, PRIVATE_AS u32 *w4, PRIVATE_AS u32 *w5, PRIVATE_AS u32 *w6, PRIVATE_AS u32 *w7, const int len, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 ex = 0;
|
|
|
|
const int pos = ctx->len & 127;
|
|
|
|
ctx->len += len;
|
|
|
|
if ((pos + len) < 128)
|
|
{
|
|
switch_buffer_by_offset_8x4_be_S (w0, w1, w2, w3, w4, w5, w6, w7, pos);
|
|
|
|
ctx->w0[0] |= w0[0];
|
|
ctx->w0[1] |= w0[1];
|
|
ctx->w0[2] |= w0[2];
|
|
ctx->w0[3] |= w0[3];
|
|
ctx->w1[0] |= w1[0];
|
|
ctx->w1[1] |= w1[1];
|
|
ctx->w1[2] |= w1[2];
|
|
ctx->w1[3] |= w1[3];
|
|
ctx->w2[0] |= w2[0];
|
|
ctx->w2[1] |= w2[1];
|
|
ctx->w2[2] |= w2[2];
|
|
ctx->w2[3] |= w2[3];
|
|
ctx->w3[0] |= w3[0];
|
|
ctx->w3[1] |= w3[1];
|
|
ctx->w3[2] |= w3[2];
|
|
ctx->w3[3] |= w3[3];
|
|
ctx->w4[0] |= w4[0];
|
|
ctx->w4[1] |= w4[1];
|
|
ctx->w4[2] |= w4[2];
|
|
ctx->w4[3] |= w4[3];
|
|
ctx->w5[0] |= w5[0];
|
|
ctx->w5[1] |= w5[1];
|
|
ctx->w5[2] |= w5[2];
|
|
ctx->w5[3] |= w5[3];
|
|
ctx->w6[0] |= w6[0];
|
|
ctx->w6[1] |= w6[1];
|
|
ctx->w6[2] |= w6[2];
|
|
ctx->w6[3] |= w6[3];
|
|
ctx->w7[0] |= w7[0];
|
|
ctx->w7[1] |= w7[1];
|
|
ctx->w7[2] |= w7[2];
|
|
ctx->w7[3] |= w7[3];
|
|
}
|
|
else
|
|
{
|
|
u32 c0[4] = { 0 };
|
|
u32 c1[4] = { 0 };
|
|
u32 c2[4] = { 0 };
|
|
u32 c3[4] = { 0 };
|
|
u32 c4[4] = { 0 };
|
|
u32 c5[4] = { 0 };
|
|
u32 c6[4] = { 0 };
|
|
u32 c7[4] = { 0 };
|
|
|
|
switch_buffer_by_offset_8x4_carry_be_S (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos);
|
|
|
|
ctx->w0[0] |= w0[0];
|
|
ctx->w0[1] |= w0[1];
|
|
ctx->w0[2] |= w0[2];
|
|
ctx->w0[3] |= w0[3];
|
|
ctx->w1[0] |= w1[0];
|
|
ctx->w1[1] |= w1[1];
|
|
ctx->w1[2] |= w1[2];
|
|
ctx->w1[3] |= w1[3];
|
|
ctx->w2[0] |= w2[0];
|
|
ctx->w2[1] |= w2[1];
|
|
ctx->w2[2] |= w2[2];
|
|
ctx->w2[3] |= w2[3];
|
|
ctx->w3[0] |= w3[0];
|
|
ctx->w3[1] |= w3[1];
|
|
ctx->w3[2] |= w3[2];
|
|
ctx->w3[3] |= w3[3];
|
|
ctx->w4[0] |= w4[0];
|
|
ctx->w4[1] |= w4[1];
|
|
ctx->w4[2] |= w4[2];
|
|
ctx->w4[3] |= w4[3];
|
|
ctx->w5[0] |= w5[0];
|
|
ctx->w5[1] |= w5[1];
|
|
ctx->w5[2] |= w5[2];
|
|
ctx->w5[3] |= w5[3];
|
|
ctx->w6[0] |= w6[0];
|
|
ctx->w6[1] |= w6[1];
|
|
ctx->w6[2] |= w6[2];
|
|
ctx->w6[3] |= w6[3];
|
|
ctx->w7[0] |= w7[0];
|
|
ctx->w7[1] |= w7[1];
|
|
ctx->w7[2] |= w7[2];
|
|
ctx->w7[3] |= w7[3];
|
|
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w4, ctx->w4, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w5, ctx->w5, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w6, ctx->w6, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w7, ctx->w7, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
ex = ctx->w7[3] & 0xff;
|
|
|
|
sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h);
|
|
|
|
ctx->w0[0] = c0[0];
|
|
ctx->w0[1] = c0[1];
|
|
ctx->w0[2] = c0[2];
|
|
ctx->w0[3] = c0[3];
|
|
ctx->w1[0] = c1[0];
|
|
ctx->w1[1] = c1[1];
|
|
ctx->w1[2] = c1[2];
|
|
ctx->w1[3] = c1[3];
|
|
ctx->w2[0] = c2[0];
|
|
ctx->w2[1] = c2[1];
|
|
ctx->w2[2] = c2[2];
|
|
ctx->w2[3] = c2[3];
|
|
ctx->w3[0] = c3[0];
|
|
ctx->w3[1] = c3[1];
|
|
ctx->w3[2] = c3[2];
|
|
ctx->w3[3] = c3[3];
|
|
ctx->w4[0] = c4[0];
|
|
ctx->w4[1] = c4[1];
|
|
ctx->w4[2] = c4[2];
|
|
ctx->w4[3] = c4[3];
|
|
ctx->w5[0] = c5[0];
|
|
ctx->w5[1] = c5[1];
|
|
ctx->w5[2] = c5[2];
|
|
ctx->w5[3] = c5[3];
|
|
ctx->w6[0] = c6[0];
|
|
ctx->w6[1] = c6[1];
|
|
ctx->w6[2] = c6[2];
|
|
ctx->w6[3] = c6[3];
|
|
ctx->w7[0] = c7[0];
|
|
ctx->w7[1] = c7[1];
|
|
ctx->w7[2] = c7[2];
|
|
ctx->w7[3] = c7[3];
|
|
}
|
|
|
|
return ex;
|
|
}
|
|
|
|
DECLSPEC void sha384_update_aes (PRIVATE_AS sha384_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 w0[4];
|
|
u32 w1[4];
|
|
u32 w2[4];
|
|
u32 w3[4];
|
|
u32 w4[4];
|
|
u32 w5[4];
|
|
u32 w6[4];
|
|
u32 w7[4];
|
|
|
|
int pos1;
|
|
int pos4;
|
|
|
|
for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32)
|
|
{
|
|
w0[0] = w[pos4 + 0];
|
|
w0[1] = w[pos4 + 1];
|
|
w0[2] = w[pos4 + 2];
|
|
w0[3] = w[pos4 + 3];
|
|
w1[0] = w[pos4 + 4];
|
|
w1[1] = w[pos4 + 5];
|
|
w1[2] = w[pos4 + 6];
|
|
w1[3] = w[pos4 + 7];
|
|
w2[0] = w[pos4 + 8];
|
|
w2[1] = w[pos4 + 9];
|
|
w2[2] = w[pos4 + 10];
|
|
w2[3] = w[pos4 + 11];
|
|
w3[0] = w[pos4 + 12];
|
|
w3[1] = w[pos4 + 13];
|
|
w3[2] = w[pos4 + 14];
|
|
w3[3] = w[pos4 + 15];
|
|
w4[0] = w[pos4 + 16];
|
|
w4[1] = w[pos4 + 17];
|
|
w4[2] = w[pos4 + 18];
|
|
w4[3] = w[pos4 + 19];
|
|
w5[0] = w[pos4 + 20];
|
|
w5[1] = w[pos4 + 21];
|
|
w5[2] = w[pos4 + 22];
|
|
w5[3] = w[pos4 + 23];
|
|
w6[0] = w[pos4 + 24];
|
|
w6[1] = w[pos4 + 25];
|
|
w6[2] = w[pos4 + 26];
|
|
w6[3] = w[pos4 + 27];
|
|
w7[0] = w[pos4 + 28];
|
|
w7[1] = w[pos4 + 29];
|
|
w7[2] = w[pos4 + 30];
|
|
w7[3] = w[pos4 + 31];
|
|
|
|
sha384_update_aes_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
w0[0] = w[pos4 + 0];
|
|
w0[1] = w[pos4 + 1];
|
|
w0[2] = w[pos4 + 2];
|
|
w0[3] = w[pos4 + 3];
|
|
w1[0] = w[pos4 + 4];
|
|
w1[1] = w[pos4 + 5];
|
|
w1[2] = w[pos4 + 6];
|
|
w1[3] = w[pos4 + 7];
|
|
w2[0] = w[pos4 + 8];
|
|
w2[1] = w[pos4 + 9];
|
|
w2[2] = w[pos4 + 10];
|
|
w2[3] = w[pos4 + 11];
|
|
w3[0] = w[pos4 + 12];
|
|
w3[1] = w[pos4 + 13];
|
|
w3[2] = w[pos4 + 14];
|
|
w3[3] = w[pos4 + 15];
|
|
w4[0] = w[pos4 + 16];
|
|
w4[1] = w[pos4 + 17];
|
|
w4[2] = w[pos4 + 18];
|
|
w4[3] = w[pos4 + 19];
|
|
w5[0] = w[pos4 + 20];
|
|
w5[1] = w[pos4 + 21];
|
|
w5[2] = w[pos4 + 22];
|
|
w5[3] = w[pos4 + 23];
|
|
w6[0] = w[pos4 + 24];
|
|
w6[1] = w[pos4 + 25];
|
|
w6[2] = w[pos4 + 26];
|
|
w6[3] = w[pos4 + 27];
|
|
w7[0] = w[pos4 + 28];
|
|
w7[1] = w[pos4 + 29];
|
|
w7[2] = w[pos4 + 30];
|
|
w7[3] = w[pos4 + 31];
|
|
|
|
sha384_update_aes_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
DECLSPEC u32 sha384_final_aes (PRIVATE_AS sha384_ctx_t *ctx, const u32 ex, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 ret = ex;
|
|
|
|
int pos = ctx->len & 127;
|
|
|
|
if (pos)
|
|
{
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
ret = ctx->w3[3] & 0xff;
|
|
}
|
|
|
|
append_0x80_8x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, pos ^ 3);
|
|
|
|
if (pos >= 112)
|
|
{
|
|
sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h);
|
|
|
|
ctx->w0[0] = 0;
|
|
ctx->w0[1] = 0;
|
|
ctx->w0[2] = 0;
|
|
ctx->w0[3] = 0;
|
|
ctx->w1[0] = 0;
|
|
ctx->w1[1] = 0;
|
|
ctx->w1[2] = 0;
|
|
ctx->w1[3] = 0;
|
|
ctx->w2[0] = 0;
|
|
ctx->w2[1] = 0;
|
|
ctx->w2[2] = 0;
|
|
ctx->w2[3] = 0;
|
|
ctx->w3[0] = 0;
|
|
ctx->w3[1] = 0;
|
|
ctx->w3[2] = 0;
|
|
ctx->w3[3] = 0;
|
|
ctx->w4[0] = 0;
|
|
ctx->w4[1] = 0;
|
|
ctx->w4[2] = 0;
|
|
ctx->w4[3] = 0;
|
|
ctx->w5[0] = 0;
|
|
ctx->w5[1] = 0;
|
|
ctx->w5[2] = 0;
|
|
ctx->w5[3] = 0;
|
|
ctx->w6[0] = 0;
|
|
ctx->w6[1] = 0;
|
|
ctx->w6[2] = 0;
|
|
ctx->w6[3] = 0;
|
|
ctx->w7[0] = 0;
|
|
ctx->w7[1] = 0;
|
|
ctx->w7[2] = 0;
|
|
ctx->w7[3] = 0;
|
|
}
|
|
|
|
ctx->w7[2] = 0;
|
|
ctx->w7[3] = ctx->len * 8;
|
|
|
|
sha384_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h);
|
|
|
|
return ret;
|
|
}
|
|
|
|
DECLSPEC u32 sha512_update_aes_128 (PRIVATE_AS sha512_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, PRIVATE_AS u32 *w4, PRIVATE_AS u32 *w5, PRIVATE_AS u32 *w6, PRIVATE_AS u32 *w7, const int len, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 ex = 0;
|
|
|
|
const int pos = ctx->len & 127;
|
|
|
|
ctx->len += len;
|
|
|
|
if ((pos + len) < 128)
|
|
{
|
|
switch_buffer_by_offset_8x4_be_S (w0, w1, w2, w3, w4, w5, w6, w7, pos);
|
|
|
|
ctx->w0[0] |= w0[0];
|
|
ctx->w0[1] |= w0[1];
|
|
ctx->w0[2] |= w0[2];
|
|
ctx->w0[3] |= w0[3];
|
|
ctx->w1[0] |= w1[0];
|
|
ctx->w1[1] |= w1[1];
|
|
ctx->w1[2] |= w1[2];
|
|
ctx->w1[3] |= w1[3];
|
|
ctx->w2[0] |= w2[0];
|
|
ctx->w2[1] |= w2[1];
|
|
ctx->w2[2] |= w2[2];
|
|
ctx->w2[3] |= w2[3];
|
|
ctx->w3[0] |= w3[0];
|
|
ctx->w3[1] |= w3[1];
|
|
ctx->w3[2] |= w3[2];
|
|
ctx->w3[3] |= w3[3];
|
|
ctx->w4[0] |= w4[0];
|
|
ctx->w4[1] |= w4[1];
|
|
ctx->w4[2] |= w4[2];
|
|
ctx->w4[3] |= w4[3];
|
|
ctx->w5[0] |= w5[0];
|
|
ctx->w5[1] |= w5[1];
|
|
ctx->w5[2] |= w5[2];
|
|
ctx->w5[3] |= w5[3];
|
|
ctx->w6[0] |= w6[0];
|
|
ctx->w6[1] |= w6[1];
|
|
ctx->w6[2] |= w6[2];
|
|
ctx->w6[3] |= w6[3];
|
|
ctx->w7[0] |= w7[0];
|
|
ctx->w7[1] |= w7[1];
|
|
ctx->w7[2] |= w7[2];
|
|
ctx->w7[3] |= w7[3];
|
|
}
|
|
else
|
|
{
|
|
u32 c0[4] = { 0 };
|
|
u32 c1[4] = { 0 };
|
|
u32 c2[4] = { 0 };
|
|
u32 c3[4] = { 0 };
|
|
u32 c4[4] = { 0 };
|
|
u32 c5[4] = { 0 };
|
|
u32 c6[4] = { 0 };
|
|
u32 c7[4] = { 0 };
|
|
|
|
switch_buffer_by_offset_8x4_carry_be_S (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos);
|
|
|
|
ctx->w0[0] |= w0[0];
|
|
ctx->w0[1] |= w0[1];
|
|
ctx->w0[2] |= w0[2];
|
|
ctx->w0[3] |= w0[3];
|
|
ctx->w1[0] |= w1[0];
|
|
ctx->w1[1] |= w1[1];
|
|
ctx->w1[2] |= w1[2];
|
|
ctx->w1[3] |= w1[3];
|
|
ctx->w2[0] |= w2[0];
|
|
ctx->w2[1] |= w2[1];
|
|
ctx->w2[2] |= w2[2];
|
|
ctx->w2[3] |= w2[3];
|
|
ctx->w3[0] |= w3[0];
|
|
ctx->w3[1] |= w3[1];
|
|
ctx->w3[2] |= w3[2];
|
|
ctx->w3[3] |= w3[3];
|
|
ctx->w4[0] |= w4[0];
|
|
ctx->w4[1] |= w4[1];
|
|
ctx->w4[2] |= w4[2];
|
|
ctx->w4[3] |= w4[3];
|
|
ctx->w5[0] |= w5[0];
|
|
ctx->w5[1] |= w5[1];
|
|
ctx->w5[2] |= w5[2];
|
|
ctx->w5[3] |= w5[3];
|
|
ctx->w6[0] |= w6[0];
|
|
ctx->w6[1] |= w6[1];
|
|
ctx->w6[2] |= w6[2];
|
|
ctx->w6[3] |= w6[3];
|
|
ctx->w7[0] |= w7[0];
|
|
ctx->w7[1] |= w7[1];
|
|
ctx->w7[2] |= w7[2];
|
|
ctx->w7[3] |= w7[3];
|
|
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w4, ctx->w4, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w5, ctx->w5, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w6, ctx->w6, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w7, ctx->w7, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
ex = ctx->w7[3] & 0xff;
|
|
|
|
sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h);
|
|
|
|
ctx->w0[0] = c0[0];
|
|
ctx->w0[1] = c0[1];
|
|
ctx->w0[2] = c0[2];
|
|
ctx->w0[3] = c0[3];
|
|
ctx->w1[0] = c1[0];
|
|
ctx->w1[1] = c1[1];
|
|
ctx->w1[2] = c1[2];
|
|
ctx->w1[3] = c1[3];
|
|
ctx->w2[0] = c2[0];
|
|
ctx->w2[1] = c2[1];
|
|
ctx->w2[2] = c2[2];
|
|
ctx->w2[3] = c2[3];
|
|
ctx->w3[0] = c3[0];
|
|
ctx->w3[1] = c3[1];
|
|
ctx->w3[2] = c3[2];
|
|
ctx->w3[3] = c3[3];
|
|
ctx->w4[0] = c4[0];
|
|
ctx->w4[1] = c4[1];
|
|
ctx->w4[2] = c4[2];
|
|
ctx->w4[3] = c4[3];
|
|
ctx->w5[0] = c5[0];
|
|
ctx->w5[1] = c5[1];
|
|
ctx->w5[2] = c5[2];
|
|
ctx->w5[3] = c5[3];
|
|
ctx->w6[0] = c6[0];
|
|
ctx->w6[1] = c6[1];
|
|
ctx->w6[2] = c6[2];
|
|
ctx->w6[3] = c6[3];
|
|
ctx->w7[0] = c7[0];
|
|
ctx->w7[1] = c7[1];
|
|
ctx->w7[2] = c7[2];
|
|
ctx->w7[3] = c7[3];
|
|
}
|
|
|
|
return ex;
|
|
}
|
|
|
|
DECLSPEC void sha512_update_aes (PRIVATE_AS sha512_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 w0[4];
|
|
u32 w1[4];
|
|
u32 w2[4];
|
|
u32 w3[4];
|
|
u32 w4[4];
|
|
u32 w5[4];
|
|
u32 w6[4];
|
|
u32 w7[4];
|
|
|
|
int pos1;
|
|
int pos4;
|
|
|
|
for (pos1 = 0, pos4 = 0; pos1 < len - 128; pos1 += 128, pos4 += 32)
|
|
{
|
|
w0[0] = w[pos4 + 0];
|
|
w0[1] = w[pos4 + 1];
|
|
w0[2] = w[pos4 + 2];
|
|
w0[3] = w[pos4 + 3];
|
|
w1[0] = w[pos4 + 4];
|
|
w1[1] = w[pos4 + 5];
|
|
w1[2] = w[pos4 + 6];
|
|
w1[3] = w[pos4 + 7];
|
|
w2[0] = w[pos4 + 8];
|
|
w2[1] = w[pos4 + 9];
|
|
w2[2] = w[pos4 + 10];
|
|
w2[3] = w[pos4 + 11];
|
|
w3[0] = w[pos4 + 12];
|
|
w3[1] = w[pos4 + 13];
|
|
w3[2] = w[pos4 + 14];
|
|
w3[3] = w[pos4 + 15];
|
|
w4[0] = w[pos4 + 16];
|
|
w4[1] = w[pos4 + 17];
|
|
w4[2] = w[pos4 + 18];
|
|
w4[3] = w[pos4 + 19];
|
|
w5[0] = w[pos4 + 20];
|
|
w5[1] = w[pos4 + 21];
|
|
w5[2] = w[pos4 + 22];
|
|
w5[3] = w[pos4 + 23];
|
|
w6[0] = w[pos4 + 24];
|
|
w6[1] = w[pos4 + 25];
|
|
w6[2] = w[pos4 + 26];
|
|
w6[3] = w[pos4 + 27];
|
|
w7[0] = w[pos4 + 28];
|
|
w7[1] = w[pos4 + 29];
|
|
w7[2] = w[pos4 + 30];
|
|
w7[3] = w[pos4 + 31];
|
|
|
|
sha512_update_aes_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
w0[0] = w[pos4 + 0];
|
|
w0[1] = w[pos4 + 1];
|
|
w0[2] = w[pos4 + 2];
|
|
w0[3] = w[pos4 + 3];
|
|
w1[0] = w[pos4 + 4];
|
|
w1[1] = w[pos4 + 5];
|
|
w1[2] = w[pos4 + 6];
|
|
w1[3] = w[pos4 + 7];
|
|
w2[0] = w[pos4 + 8];
|
|
w2[1] = w[pos4 + 9];
|
|
w2[2] = w[pos4 + 10];
|
|
w2[3] = w[pos4 + 11];
|
|
w3[0] = w[pos4 + 12];
|
|
w3[1] = w[pos4 + 13];
|
|
w3[2] = w[pos4 + 14];
|
|
w3[3] = w[pos4 + 15];
|
|
w4[0] = w[pos4 + 16];
|
|
w4[1] = w[pos4 + 17];
|
|
w4[2] = w[pos4 + 18];
|
|
w4[3] = w[pos4 + 19];
|
|
w5[0] = w[pos4 + 20];
|
|
w5[1] = w[pos4 + 21];
|
|
w5[2] = w[pos4 + 22];
|
|
w5[3] = w[pos4 + 23];
|
|
w6[0] = w[pos4 + 24];
|
|
w6[1] = w[pos4 + 25];
|
|
w6[2] = w[pos4 + 26];
|
|
w6[3] = w[pos4 + 27];
|
|
w7[0] = w[pos4 + 28];
|
|
w7[1] = w[pos4 + 29];
|
|
w7[2] = w[pos4 + 30];
|
|
w7[3] = w[pos4 + 31];
|
|
|
|
sha512_update_aes_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
DECLSPEC u32 sha512_final_aes (PRIVATE_AS sha512_ctx_t *ctx, const u32 ex, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 ret = ex;
|
|
|
|
int pos = ctx->len & 127;
|
|
|
|
if (pos)
|
|
{
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w0, ctx->w0, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w1, ctx->w1, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w2, ctx->w2, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
aes128_encrypt_cbc (aes_ks, aes_iv, ctx->w3, ctx->w3, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
ret = ctx->w3[3] & 0xff;
|
|
}
|
|
|
|
append_0x80_8x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, pos ^ 3);
|
|
|
|
if (pos >= 112)
|
|
{
|
|
sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h);
|
|
|
|
ctx->w0[0] = 0;
|
|
ctx->w0[1] = 0;
|
|
ctx->w0[2] = 0;
|
|
ctx->w0[3] = 0;
|
|
ctx->w1[0] = 0;
|
|
ctx->w1[1] = 0;
|
|
ctx->w1[2] = 0;
|
|
ctx->w1[3] = 0;
|
|
ctx->w2[0] = 0;
|
|
ctx->w2[1] = 0;
|
|
ctx->w2[2] = 0;
|
|
ctx->w2[3] = 0;
|
|
ctx->w3[0] = 0;
|
|
ctx->w3[1] = 0;
|
|
ctx->w3[2] = 0;
|
|
ctx->w3[3] = 0;
|
|
ctx->w4[0] = 0;
|
|
ctx->w4[1] = 0;
|
|
ctx->w4[2] = 0;
|
|
ctx->w4[3] = 0;
|
|
ctx->w5[0] = 0;
|
|
ctx->w5[1] = 0;
|
|
ctx->w5[2] = 0;
|
|
ctx->w5[3] = 0;
|
|
ctx->w6[0] = 0;
|
|
ctx->w6[1] = 0;
|
|
ctx->w6[2] = 0;
|
|
ctx->w6[3] = 0;
|
|
ctx->w7[0] = 0;
|
|
ctx->w7[1] = 0;
|
|
ctx->w7[2] = 0;
|
|
ctx->w7[3] = 0;
|
|
}
|
|
|
|
ctx->w7[2] = 0;
|
|
ctx->w7[3] = ctx->len * 8;
|
|
|
|
sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h);
|
|
|
|
return ret;
|
|
}
|
|
|
|
DECLSPEC int find_sum (PRIVATE_AS const u32 *w, const u32 pw_len, PRIVATE_AS u32 *bb, PRIVATE_AS const u32 *aes_ks, PRIVATE_AS const u32 *aes_iv, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
u32 data[4];
|
|
|
|
data[0] = w[0];
|
|
data[1] = w[1];
|
|
data[2] = w[2];
|
|
data[3] = w[3];
|
|
|
|
for (int i = pw_len, j = 0; i < 16; i++, j++)
|
|
{
|
|
PUTCHAR_BE (data, i, GETCHAR_BE (bb, j));
|
|
}
|
|
|
|
data[0] = hc_swap32_S (data[0]);
|
|
data[1] = hc_swap32_S (data[1]);
|
|
data[2] = hc_swap32_S (data[2]);
|
|
data[3] = hc_swap32_S (data[3]);
|
|
|
|
data[0] ^= aes_iv[0];
|
|
data[1] ^= aes_iv[1];
|
|
data[2] ^= aes_iv[2];
|
|
data[3] ^= aes_iv[3];
|
|
|
|
u32 out[4];
|
|
|
|
aes128_encrypt (aes_ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
u32 sum = 0;
|
|
|
|
for (u32 i = 0; i < 4; i++)
|
|
{
|
|
sum += (out[i] >> 24) & 0xff;
|
|
sum += (out[i] >> 16) & 0xff;
|
|
sum += (out[i] >> 8) & 0xff;
|
|
sum += (out[i] >> 0) & 0xff;
|
|
}
|
|
|
|
return sum;
|
|
}
|
|
|
|
DECLSPEC u32 do_round (PRIVATE_AS const u32 *w, const u32 pw_len, PRIVATE_AS pdf17l8_tmp_t *tmp, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
|
|
{
|
|
// get previous hash (already padded)
|
|
|
|
u32 w0[4];
|
|
u32 w1[4];
|
|
u32 w2[4];
|
|
u32 w3[4];
|
|
u32 w4[4];
|
|
u32 w5[4];
|
|
u32 w6[4];
|
|
u32 w7[4];
|
|
|
|
w0[0] = tmp->dgst32[0];
|
|
w0[1] = tmp->dgst32[1];
|
|
w0[2] = tmp->dgst32[2];
|
|
w0[3] = tmp->dgst32[3];
|
|
w1[0] = tmp->dgst32[4];
|
|
w1[1] = tmp->dgst32[5];
|
|
w1[2] = tmp->dgst32[6];
|
|
w1[3] = tmp->dgst32[7];
|
|
w2[0] = 0;
|
|
w2[1] = 0;
|
|
w2[2] = 0;
|
|
w2[3] = 0;
|
|
w3[0] = 0;
|
|
w3[1] = 0;
|
|
w3[2] = 0;
|
|
w3[3] = 0;
|
|
w4[0] = 0;
|
|
w4[1] = 0;
|
|
w4[2] = 0;
|
|
w4[3] = 0;
|
|
w5[0] = 0;
|
|
w5[1] = 0;
|
|
w5[2] = 0;
|
|
w5[3] = 0;
|
|
w6[0] = 0;
|
|
w6[1] = 0;
|
|
w6[2] = 0;
|
|
w6[3] = 0;
|
|
w7[0] = 0;
|
|
w7[1] = 0;
|
|
w7[2] = 0;
|
|
w7[3] = 0;
|
|
|
|
// cipher setup
|
|
|
|
u32 aes_key[4];
|
|
|
|
aes_key[0] = hc_swap32_S (w0[0]);
|
|
aes_key[1] = hc_swap32_S (w0[1]);
|
|
aes_key[2] = hc_swap32_S (w0[2]);
|
|
aes_key[3] = hc_swap32_S (w0[3]);
|
|
|
|
u32 aes_ks[44];
|
|
|
|
aes128_set_encrypt_key (aes_ks, aes_key, s_te0, s_te1, s_te2, s_te3);
|
|
|
|
u32 aes_iv[4];
|
|
|
|
aes_iv[0] = hc_swap32_S (w1[0]);
|
|
aes_iv[1] = hc_swap32_S (w1[1]);
|
|
aes_iv[2] = hc_swap32_S (w1[2]);
|
|
aes_iv[3] = hc_swap32_S (w1[3]);
|
|
|
|
// find hash to use
|
|
|
|
const int sum = find_sum (w, pw_len, w0, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
int sum3 = sum % 3;
|
|
|
|
// hash data
|
|
|
|
u32 ex = 0;
|
|
|
|
if (sum3 == 0)
|
|
{
|
|
sha256_ctx_t ctx256;
|
|
|
|
sha256_init (&ctx256);
|
|
|
|
for (int i = 0; i < 64; i++)
|
|
{
|
|
sha256_update_aes (&ctx256, w, pw_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
w0[0] = tmp->dgst32[ 0];
|
|
w0[1] = tmp->dgst32[ 1];
|
|
w0[2] = tmp->dgst32[ 2];
|
|
w0[3] = tmp->dgst32[ 3];
|
|
w1[0] = tmp->dgst32[ 4];
|
|
w1[1] = tmp->dgst32[ 5];
|
|
w1[2] = tmp->dgst32[ 6];
|
|
w1[3] = tmp->dgst32[ 7];
|
|
w2[0] = tmp->dgst32[ 8];
|
|
w2[1] = tmp->dgst32[ 9];
|
|
w2[2] = tmp->dgst32[10];
|
|
w2[3] = tmp->dgst32[11];
|
|
w3[0] = tmp->dgst32[12];
|
|
w3[1] = tmp->dgst32[13];
|
|
w3[2] = tmp->dgst32[14];
|
|
w3[3] = tmp->dgst32[15];
|
|
w4[0] = 0;
|
|
w4[1] = 0;
|
|
w4[2] = 0;
|
|
w4[3] = 0;
|
|
w5[0] = 0;
|
|
w5[1] = 0;
|
|
w5[2] = 0;
|
|
w5[3] = 0;
|
|
w6[0] = 0;
|
|
w6[1] = 0;
|
|
w6[2] = 0;
|
|
w6[3] = 0;
|
|
w7[0] = 0;
|
|
w7[1] = 0;
|
|
w7[2] = 0;
|
|
w7[3] = 0;
|
|
|
|
ex = sha256_update_aes_64 (&ctx256, w0, w1, w2, w3, tmp->dgst_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
sha256_final_aes (&ctx256, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
tmp->dgst32[ 0] = ctx256.h[0];
|
|
tmp->dgst32[ 1] = ctx256.h[1];
|
|
tmp->dgst32[ 2] = ctx256.h[2];
|
|
tmp->dgst32[ 3] = ctx256.h[3];
|
|
tmp->dgst32[ 4] = ctx256.h[4];
|
|
tmp->dgst32[ 5] = ctx256.h[5];
|
|
tmp->dgst32[ 6] = ctx256.h[6];
|
|
tmp->dgst32[ 7] = ctx256.h[7];
|
|
tmp->dgst32[ 8] = 0;
|
|
tmp->dgst32[ 9] = 0;
|
|
tmp->dgst32[10] = 0;
|
|
tmp->dgst32[11] = 0;
|
|
tmp->dgst32[12] = 0;
|
|
tmp->dgst32[13] = 0;
|
|
tmp->dgst32[14] = 0;
|
|
tmp->dgst32[15] = 0;
|
|
|
|
tmp->dgst_len = 32;
|
|
}
|
|
else if (sum3 == 1)
|
|
{
|
|
sha384_ctx_t ctx384;
|
|
|
|
sha384_init (&ctx384);
|
|
|
|
for (int i = 0; i < 64; i++)
|
|
{
|
|
sha384_update_aes (&ctx384, w, pw_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
w0[0] = tmp->dgst32[ 0];
|
|
w0[1] = tmp->dgst32[ 1];
|
|
w0[2] = tmp->dgst32[ 2];
|
|
w0[3] = tmp->dgst32[ 3];
|
|
w1[0] = tmp->dgst32[ 4];
|
|
w1[1] = tmp->dgst32[ 5];
|
|
w1[2] = tmp->dgst32[ 6];
|
|
w1[3] = tmp->dgst32[ 7];
|
|
w2[0] = tmp->dgst32[ 8];
|
|
w2[1] = tmp->dgst32[ 9];
|
|
w2[2] = tmp->dgst32[10];
|
|
w2[3] = tmp->dgst32[11];
|
|
w3[0] = tmp->dgst32[12];
|
|
w3[1] = tmp->dgst32[13];
|
|
w3[2] = tmp->dgst32[14];
|
|
w3[3] = tmp->dgst32[15];
|
|
w4[0] = 0;
|
|
w4[1] = 0;
|
|
w4[2] = 0;
|
|
w4[3] = 0;
|
|
w5[0] = 0;
|
|
w5[1] = 0;
|
|
w5[2] = 0;
|
|
w5[3] = 0;
|
|
w6[0] = 0;
|
|
w6[1] = 0;
|
|
w6[2] = 0;
|
|
w6[3] = 0;
|
|
w7[0] = 0;
|
|
w7[1] = 0;
|
|
w7[2] = 0;
|
|
w7[3] = 0;
|
|
|
|
ex = sha384_update_aes_128 (&ctx384, w0, w1, w2, w3, w4, w5, w6, w7, tmp->dgst_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
ex = sha384_final_aes (&ctx384, ex, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
tmp->dgst32[ 0] = h32_from_64_S (ctx384.h[0]);
|
|
tmp->dgst32[ 1] = l32_from_64_S (ctx384.h[0]);
|
|
tmp->dgst32[ 2] = h32_from_64_S (ctx384.h[1]);
|
|
tmp->dgst32[ 3] = l32_from_64_S (ctx384.h[1]);
|
|
tmp->dgst32[ 4] = h32_from_64_S (ctx384.h[2]);
|
|
tmp->dgst32[ 5] = l32_from_64_S (ctx384.h[2]);
|
|
tmp->dgst32[ 6] = h32_from_64_S (ctx384.h[3]);
|
|
tmp->dgst32[ 7] = l32_from_64_S (ctx384.h[3]);
|
|
tmp->dgst32[ 8] = h32_from_64_S (ctx384.h[4]);
|
|
tmp->dgst32[ 9] = l32_from_64_S (ctx384.h[4]);
|
|
tmp->dgst32[10] = h32_from_64_S (ctx384.h[5]);
|
|
tmp->dgst32[11] = l32_from_64_S (ctx384.h[5]);
|
|
tmp->dgst32[12] = 0;
|
|
tmp->dgst32[13] = 0;
|
|
tmp->dgst32[14] = 0;
|
|
tmp->dgst32[15] = 0;
|
|
|
|
tmp->dgst_len = 48;
|
|
}
|
|
else if (sum3 == 2)
|
|
{
|
|
sha512_ctx_t ctx512;
|
|
|
|
sha512_init (&ctx512);
|
|
|
|
for (int i = 0; i < 64; i++)
|
|
{
|
|
sha512_update_aes (&ctx512, w, pw_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
w0[0] = tmp->dgst32[ 0];
|
|
w0[1] = tmp->dgst32[ 1];
|
|
w0[2] = tmp->dgst32[ 2];
|
|
w0[3] = tmp->dgst32[ 3];
|
|
w1[0] = tmp->dgst32[ 4];
|
|
w1[1] = tmp->dgst32[ 5];
|
|
w1[2] = tmp->dgst32[ 6];
|
|
w1[3] = tmp->dgst32[ 7];
|
|
w2[0] = tmp->dgst32[ 8];
|
|
w2[1] = tmp->dgst32[ 9];
|
|
w2[2] = tmp->dgst32[10];
|
|
w2[3] = tmp->dgst32[11];
|
|
w3[0] = tmp->dgst32[12];
|
|
w3[1] = tmp->dgst32[13];
|
|
w3[2] = tmp->dgst32[14];
|
|
w3[3] = tmp->dgst32[15];
|
|
w4[0] = 0;
|
|
w4[1] = 0;
|
|
w4[2] = 0;
|
|
w4[3] = 0;
|
|
w5[0] = 0;
|
|
w5[1] = 0;
|
|
w5[2] = 0;
|
|
w5[3] = 0;
|
|
w6[0] = 0;
|
|
w6[1] = 0;
|
|
w6[2] = 0;
|
|
w6[3] = 0;
|
|
w7[0] = 0;
|
|
w7[1] = 0;
|
|
w7[2] = 0;
|
|
w7[3] = 0;
|
|
|
|
ex = sha512_update_aes_128 (&ctx512, w0, w1, w2, w3, w4, w5, w6, w7, tmp->dgst_len, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
ex = sha512_final_aes (&ctx512, ex, aes_ks, aes_iv, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
|
|
tmp->dgst32[ 0] = h32_from_64_S (ctx512.h[0]);
|
|
tmp->dgst32[ 1] = l32_from_64_S (ctx512.h[0]);
|
|
tmp->dgst32[ 2] = h32_from_64_S (ctx512.h[1]);
|
|
tmp->dgst32[ 3] = l32_from_64_S (ctx512.h[1]);
|
|
tmp->dgst32[ 4] = h32_from_64_S (ctx512.h[2]);
|
|
tmp->dgst32[ 5] = l32_from_64_S (ctx512.h[2]);
|
|
tmp->dgst32[ 6] = h32_from_64_S (ctx512.h[3]);
|
|
tmp->dgst32[ 7] = l32_from_64_S (ctx512.h[3]);
|
|
tmp->dgst32[ 8] = h32_from_64_S (ctx512.h[4]);
|
|
tmp->dgst32[ 9] = l32_from_64_S (ctx512.h[4]);
|
|
tmp->dgst32[10] = h32_from_64_S (ctx512.h[5]);
|
|
tmp->dgst32[11] = l32_from_64_S (ctx512.h[5]);
|
|
tmp->dgst32[12] = h32_from_64_S (ctx512.h[6]);
|
|
tmp->dgst32[13] = l32_from_64_S (ctx512.h[6]);
|
|
tmp->dgst32[14] = h32_from_64_S (ctx512.h[7]);
|
|
tmp->dgst32[15] = l32_from_64_S (ctx512.h[7]);
|
|
|
|
tmp->dgst_len = 64;
|
|
}
|
|
|
|
return ex;
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m10700_init (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t))
|
|
{
|
|
/**
|
|
* base
|
|
*/
|
|
|
|
const u64 gid = get_global_id (0);
|
|
|
|
if (gid >= GID_CNT) return;
|
|
|
|
sha256_ctx_t ctx;
|
|
|
|
sha256_init (&ctx);
|
|
|
|
sha256_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len);
|
|
|
|
sha256_update_global_swap (&ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len);
|
|
|
|
sha256_final (&ctx);
|
|
|
|
pdf17l8_tmp_t tmp;
|
|
|
|
tmp.dgst32[ 0] = ctx.h[0];
|
|
tmp.dgst32[ 1] = ctx.h[1];
|
|
tmp.dgst32[ 2] = ctx.h[2];
|
|
tmp.dgst32[ 3] = ctx.h[3];
|
|
tmp.dgst32[ 4] = ctx.h[4];
|
|
tmp.dgst32[ 5] = ctx.h[5];
|
|
tmp.dgst32[ 6] = ctx.h[6];
|
|
tmp.dgst32[ 7] = ctx.h[7];
|
|
tmp.dgst32[ 8] = 0;
|
|
tmp.dgst32[ 9] = 0;
|
|
tmp.dgst32[10] = 0;
|
|
tmp.dgst32[11] = 0;
|
|
tmp.dgst32[12] = 0;
|
|
tmp.dgst32[13] = 0;
|
|
tmp.dgst32[14] = 0;
|
|
tmp.dgst32[15] = 0;
|
|
|
|
tmp.dgst_len = 32;
|
|
|
|
tmps[gid] = tmp;
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m10700_loop (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t))
|
|
{
|
|
const u64 gid = get_global_id (0);
|
|
const u64 lid = get_local_id (0);
|
|
const u64 lsz = get_local_size (0);
|
|
|
|
/**
|
|
* aes shared
|
|
*/
|
|
|
|
#ifdef REAL_SHM
|
|
|
|
LOCAL_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_CNT) return;
|
|
|
|
/**
|
|
* base
|
|
*/
|
|
|
|
const u32 pw_len = pws[gid].pw_len;
|
|
|
|
u32 w[64] = { 0 };
|
|
|
|
for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1)
|
|
{
|
|
w[idx] = hc_swap32_S (pws[gid].i[idx]);
|
|
}
|
|
|
|
/**
|
|
* digest
|
|
*/
|
|
|
|
pdf17l8_tmp_t tmp = tmps[gid];
|
|
|
|
u32 ex = 0;
|
|
|
|
for (u32 i = 0, j = LOOP_POS; i < LOOP_CNT; i++, j++)
|
|
{
|
|
ex = do_round (w, pw_len, &tmp, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
|
|
if ((LOOP_POS + LOOP_CNT) == 64)
|
|
{
|
|
for (u32 i = 64; i < (ex & 0xff) + 32; i++)
|
|
{
|
|
ex = do_round (w, pw_len, &tmp, s_te0, s_te1, s_te2, s_te3, s_te4);
|
|
}
|
|
}
|
|
|
|
tmps[gid] = tmp;
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m10700_comp (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t))
|
|
{
|
|
/**
|
|
* modifier
|
|
*/
|
|
|
|
const u64 gid = get_global_id (0);
|
|
|
|
if (gid >= GID_CNT) return;
|
|
|
|
const u64 lid = get_local_id (0);
|
|
|
|
/**
|
|
* digest
|
|
*/
|
|
|
|
const u32 r0 = tmps[gid].dgst32[DGST_R0];
|
|
const u32 r1 = tmps[gid].dgst32[DGST_R1];
|
|
const u32 r2 = tmps[gid].dgst32[DGST_R2];
|
|
const u32 r3 = tmps[gid].dgst32[DGST_R3];
|
|
|
|
#define il_pos 0
|
|
|
|
#ifdef KERNEL_STATIC
|
|
#include COMPARE_M
|
|
#endif
|
|
}
|