mirror of
https://github.com/hashcat/hashcat.git
synced 2024-11-25 17:38:23 +00:00
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 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 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 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
|
|
}
|