size_t
__cdecl sub_42940(_DWORD *fun3,
BYTE
*user_name,
int
user_name_len,
char
*password)
{
v73 = __readgsdword(0x14u);
v4 = -64;
v5 = 0;
do
v5 = *((_WORD *)fun3 + (*((unsigned
__int8
*)fun3 + v4++ + 68) ^ HIBYTE(v5)) + 42) ^ (v5 << 8);
while
( v4 );
v62 = v5;
*((_WORD *)password + 1) = v5;
if
( user_name )
{
if
( user_name_len > 0 )
{
v6 = 0;
if
( (unsigned
int
)user_name_len < 0x10 )
goto
LABEL_33;
v6 = user_name_len & 0xFFFFFFF0;
v7 = 0;
si128 = _mm_load_si128((
const
__m128i *)(&(&off_1A25DC)[-11539] + 1));
v59 = _mm_load_si128((
const
__m128i *)(&off_1A25DC - 92307));
v9 = _mm_load_si128((
const
__m128i *)(&(&off_1A25DC)[-11538] + 1));
v10 = _mm_load_si128((
const
__m128i *)(&off_1A25DC - 92299));
v11 = _mm_load_si128((
const
__m128i *)(&(&off_1A25DC)[-11537] + 1));
do
{
v12 = _mm_loadu_si128((
const
__m128i *)&user_name[v7]);
v13 = _mm_and_si128(_mm_srli_epi16(v12, 4u), si128);
v14 = _mm_cmpeq_epi8(_mm_min_epu8(v12, v59), v12);
v15 = _mm_or_si128(_mm_andnot_si128(v14, _mm_add_epi8(v13, v10)), _mm_and_si128(_mm_or_si128(v13, v9), v14));
v16 = _mm_and_si128(v12, si128);
v17 = _mm_cmpeq_epi8(_mm_subs_epu8(v16, v11), (__m128i)0LL);
v18 = _mm_or_si128(_mm_andnot_si128(v17, _mm_add_epi8(v16, v10)), _mm_and_si128(_mm_or_si128(v16, v9), v17));
*(__m128i *)&key[2 * v7 + 16] = _mm_unpackhi_epi8(v15, v18);
*(__m128i *)&key[2 * v7] = _mm_unpacklo_epi8(v15, v18);
v7 += 16;
}
while
( v6 != v7 );
if
( v6 != user_name_len )
{
......
}
}
}
HMAC_CTX_init(ctx);
md = EVP_sha256();
HMAC_Init_ex(ctx, key, 32, md, 0);
HMAC_Update((
int
)ctx, (
int
)&v62, 2);
len = 0;
HMAC_Final((
int
)ctx, (
int
)hash, (
int
)&len);
v26 = -32;
key_hash_ = 0;
do
key_hash_ = *((_WORD *)fun3 + ((unsigned
__int8
)v71[v26++] ^ HIBYTE(key_hash_)) + 42) ^ (key_hash_ << 8);
while
( v26 );
key_hash = key_hash_;
uesrname_reverse = 0LL;
v28 = user_name;
if
( user_name_len > 0 )
{
v29 = 0;
if
( (unsigned
int
)user_name_len <= 0x1F )
goto
LABEL_21;
......
v28 = user_name;
if
( v29 != user_name_len )
{
LABEL_21:
v35 = user_name_len - v29;
uesrname_reverse_ = &ctx[v29 - 16];
do
*uesrname_reverse_++ = v28[--v35];
while
( v35 );
}
}
username_ = (
int
)v28;
memset
(dest, 0,
sizeof
(dest));
sub_425F0(v57, (
int
)hash, username_, 12, (
int
)&uesrname_reverse, 16, (
int
)&key_hash, 2, dest);
*(_WORD *)password = *(_WORD *)dest;
v38 = *(_QWORD *)&dest[2];
*(_QWORD *)(password + 12) = *(_QWORD *)&dest[10];
*(_QWORD *)(password + 4) = v38;
memset
(password_, 0, 0x400u);
v65 = *((_DWORD *)password + 4);
v39 = *(_QWORD *)password;
*(_QWORD *)&password_[8] = *((_QWORD *)password + 1);
*(_QWORD *)password_ = v39;
v40 = sub_43070(fun3, password_, 0x14u, src);
memset
(v72, 0, 256);
memset
(v71, 0,
sizeof
(v71));
for
( i = 0; i != 256; ++i )
{
v71[i] = i;
v72[i] = *((_BYTE *)fun3 + (i & 0x3F) + 4);
}
v42 = 0;
v43 = -256;
do
{
v44 = (unsigned
__int8
)v72[v43];
v45 = v44 + v42 + (unsigned
__int8
)v72[v43 + 256];
v45 %= 256;
v46 = v71[v45];
v71[v45] = v44;
v72[v43++] = v46;
v42 = v45;
}
while
( v43 );
v58 = v40;
if
( v40 > 0 )
{
v47 = 0;
v48 = 0;
src_ = src;
v50 = v58;
do
{
v51 = v47 + 1 - ((v47 + ((unsigned
int
)((v47 + 1) >> 31) >> 24) + 1) & 0xFFFFFF00);
v52 = (unsigned
__int8
)v71[v51];
v48 = (v52 + v48) % 256;
v53 = v50;
v54 = v71[v48];
v71[v48] = v52;
v71[v51] = v54;
*src_++ ^= v71[(unsigned
__int8
)(v71[v48] + v54)];
v50 = v53 - 1;
v55 = v53 == 1;
v47 = v51;
}
while
( !v55 );
}
memcpy
(password, src, v58);
return
v58;
}