#include "CryptoDXE.h"
//
// CryptoDXE - UEFI Module
// Total functions: 160
//
// Function: InternalZeroMem @ 0x1000 (0x11 bytes)
void *__fastcall InternalZeroMem(void *buf, unsigned __int64 count, char value)
{
memset(buf, value, count); /*0x100a*/
return buf; /*0x100f*/
}
// Function: InternalCopyMem @ 0x1020 (0x42 bytes)
char *__fastcall InternalCopyMem(char *dst, char *src, unsigned __int64 count)
{
char *dst_1; // rax
unsigned __int64 count_1; // rcx
char *dst_2; // rdi
char *src_1; // rsi
dst_1 = dst; /*0x1030*/
if ( src < dst && &src[count - 1] >= dst ) /*0x1038*/
{
src_1 = &src[count - 1]; /*0x1050*/
dst_2 = &dst[count - 1]; /*0x1053*/
}
else
{
count_1 = count; /*0x103a*/
count &= 7u; /*0x103d*/
count_1 >>= 3; /*0x1044*/
qmemcpy(dst, src, 8 * count_1); /*0x1048*/
src_1 = &src[8 * count_1]; /*0x1048*/
dst_2 = &dst[8 * count_1]; /*0x1048*/
}
qmemcpy(dst_2, src_1, count); /*0x105c*/
return dst_1; /*0x105f*/
}
// Function: InternalCompareMem @ 0x1090 (0x1d bytes)
unsigned __int64 __fastcall InternalCompareMem(_BYTE *Buffer1, _BYTE *Buffer2, __int64 Length)
{
bool v6; // zf
do /*0x109b*/
{
if ( !Length ) /*0x109b*/
break; /*0x109b*/
v6 = *Buffer1++ == *Buffer2++; /*0x109b*/
--Length; /*0x109b*/
}
while ( v6 ); /*0x109b*/
return (unsigned __int8)*(Buffer1 - 1) - (unsigned __int64)(unsigned __int8)*(Buffer2 - 1); /*0x10aa*/
}
// Function: _ModuleEntryPoint @ 0x10f0 (0x3b bytes)
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
signed __int64 v4; // rbx
CryptoDxeEntryInit((__int64)ImageHandle, (__int64)SystemTable); /*0x1100*/
v4 = CryptoDxeSaveKey((__int64)ImageHandle, (__int64)SystemTable); /*0x1110*/
if ( v4 < 0 ) /*0x1116*/
CryptoDxeDestructor(); /*0x1118*/
return v4; /*0x1125*/
}
// Function: CryptoDxeEntryInit @ 0x112c (0x24a bytes)
__int64 __fastcall CryptoDxeEntryInit(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
EFI_BOOT_SERVICES *BootServices; // r10
__int64 Status; // rcx
_QWORD *HeapAddr; // r8
const char *_nASSERT_EFI_ERROR_(Status___%r)_n; // r9
__int64 Status2; // rax
char src[24]; // [rsp+40h] [rbp-18h] BYREF
_QWORD *HeapAddr_1; // [rsp+60h] [rbp+8h] BYREF
::ImageHandle = ImageHandle; /*0x113d*/
if ( !ImageHandle ) /*0x1151*/
AssertReport( /*0x1160*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
51,
(__int64)"gImageHandle != ((void *) 0)");
::SystemTable = (__int64)SystemTable; /*0x1165*/
if ( !SystemTable ) /*0x116f*/
AssertReport( /*0x117e*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
57,
(__int64)"gST != ((void *) 0)");
::BootServices = (__int64)SystemTable->BootServices; /*0x1187*/
if ( !::BootServices ) /*0x1191*/
AssertReport( /*0x11a0*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
63,
(__int64)"gBS != ((void *) 0)");
RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x11a9*/
if ( !RuntimeServices ) /*0x11b3*/
AssertReport( /*0x11c6*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
47,
(__int64)"gRT != ((void *) 0)");
BootServices = SystemTable->BootServices; /*0x11d6*/
RuntimeServices_0 = (__int64)SystemTable->RuntimeServices; /*0x11dd*/
BootServices_0 = (__int64)BootServices; /*0x11f0*/
((void (__fastcall *)(__int64, __int64, __int64 (__fastcall *)()))BootServices->CreateEvent)(513, 8, CryptoDxeNotifyEvent); /*0x1202*/
(*(void (__fastcall **)(__int64, __int64, __int64 (__fastcall *)(), _QWORD, __int64 *))(BootServices_0 + 80))( /*0x122a*/
1610613250,
8,
EfiReleaseProtocol,
0,
&qword_16160);
AssertCpuDeadLoop(Status); /*0x122d*/
DebugPrint(64, "Runtime"); /*0x123e*/
DebugPrint(64, "AmiCryptoLib Constructor\n"); /*0x124c*/
LODWORD(HeapAddr) = (_DWORD)::HeapAddr; /*0x1251*/
_nASSERT_EFI_ERROR_(Status___%r)_n = "\nASSERT_EFI_ERROR (Status = %r)\n"; /*0x1258*/
nASSERT_EFI_ERROR__Status____r__n = (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n"; /*0x125e*/
if ( !::HeapAddr ) /*0x1268*/
{
Status2 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD **))(::BootServices + 64))( /*0x127c*/
6,
(unsigned int)"\nASSERT_EFI_ERROR (Status = %r)\n",
&HeapAddr_1);
HeapAddr = HeapAddr_1; /*0x127f*/
LODWORD(_nASSERT_EFI_ERROR_(Status___%r)_n) = nASSERT_EFI_ERROR__Status____r__n; /*0x1287*/
if ( Status2 < 0 ) /*0x128e*/
HeapAddr = 0; /*0x128e*/
HeapAddr_1 = HeapAddr; /*0x1292*/
::HeapAddr = HeapAddr; /*0x1297*/
}
DebugPrint(64, "RT Heap alloc (addr=%X, size=%x)\n", (_DWORD)HeapAddr, (_DWORD)_nASSERT_EFI_ERROR_(Status___%r)_n); /*0x12a8*/
if ( ::HeapAddr ) /*0x12b7*/
Assert(::HeapAddr, nASSERT_EFI_ERROR__Status____r__n); /*0x12c0*/
(*(void (__fastcall **)(char *, _QWORD))(RuntimeServices + 24))(src, 0); /*0x12d3*/
MemConfig_0(n50, src, 0x10u); /*0x12e8*/
DebugLogPrint( /*0x1339*/
2,
"EfiTime Now :(Year=%d Month=%d Day=%d Hour=%d Min=%d Sec=%d)",
*(unsigned __int16 *)n50,
(unsigned __int8)byte_160FA,
(unsigned __int8)byte_160FB,
(unsigned __int8)n0x17,
(unsigned __int8)n0x3B,
(unsigned __int8)n50a);
return (*(__int64 (__fastcall **)(__int64, __int64, __int64 (__fastcall *)(), _QWORD, __int64 *))(::BootServices + 80))( /*0x1370*/
1610613250,
8,
EfiFreePool,
0,
&qword_161A0);
}
// Function: CryptoDxeDestructor @ 0x1378 (0xb0 bytes)
__int64 CryptoDxeDestructor()
{
__int64 BootServices; // rax
DebugPrint(64, "Runtime"); /*0x138c*/
DebugPrint(64, "AmiCryptoLib Destructor\n"); /*0x139a*/
if ( HeapAddr ) /*0x13a7*/
{
DebugPrint(64, "\n===>\n!!! Heap Addr %X !!!\n<===\n", 0); /*0x13b5*/
AssertCpuDeadLoop_0(); /*0x13ba*/
}
if ( qword_161A0 ) /*0x13c9*/
{
BootServices = ::BootServices; /*0x13cb*/
if ( !::BootServices ) /*0x13d5*/
{
AssertReport("e:\\hs\\AmiCryptoPkg\\CryptoLib\\CryptLibInitRun.c", 176, "gBS != ((void *) 0)"); /*0x13ea*/
BootServices = ::BootServices; /*0x13f6*/
}
(*(void (**)(void))(BootServices + 112))(); /*0x13fd*/
}
(*(void (__fastcall **)(__int64))(BootServices_0 + 112))(qword_16158); /*0x140e*/
return (*(__int64 (__fastcall **)(__int64))(BootServices_0 + 112))(qword_16160);
}
// Function: CryptoDxeSaveKey @ 0x1428 (0x10a bytes)
__int64 __fastcall CryptoDxeSaveKey(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable, double a3)
{
__int64 Status; // rdi
char *KeyBuffer; // rbx
__int64 Status2; // rax
char *KeyBuffer_1; // [rsp+30h] [rbp+8h] BYREF
EFI_HANDLE DriverImageHandle; // [rsp+40h] [rbp+18h] BYREF
DriverImageHandle = ImageHandle; /*0x1439*/
if ( !SystemTable_0 ) /*0x1448*/
{
SystemTable_0 = (__int64)SystemTable; /*0x144a*/
BootServices_1 = (__int64)SystemTable->BootServices; /*0x1455*/
RuntimeServices_1 = (__int64)SystemTable->RuntimeServices; /*0x1460*/
}
::KeyBuffer = 0; /*0x146e*/
Status = HobConfig(SystemTable, (__int64)&qword_16110, a3); /*0x147d*/
if ( Status < 0 ) /*0x1483*/
goto LABEL_9; /*0x1483*/
KeyBuffer = ::KeyBuffer; /*0x1485*/
if ( ::KeyBuffer ) /*0x148f*/
{
Status2 = (*(__int64 (__fastcall **)(__int64, _QWORD, char **))(BootServices + 64))( /*0x14a8*/
6,
(unsigned int)n64,
&KeyBuffer_1);
KeyBuffer = KeyBuffer_1; /*0x14ac*/
if ( Status2 < 0 ) /*0x14b4*/
KeyBuffer = 0; /*0x14b4*/
KeyBuffer_1 = KeyBuffer; /*0x14b8*/
if ( KeyBuffer ) /*0x14c0*/
{
MemMove(KeyBuffer, ::KeyBuffer, (unsigned int)n64); /*0x14d3*/
::KeyBuffer = KeyBuffer; /*0x14d8*/
goto LABEL_10; /*0x14df*/
}
LABEL_9:
KeyBuffer = ::KeyBuffer; /*0x14e1*/
}
LABEL_10:
DebugPrint(64, "Save Key in DXE %r (addr %X)\n", Status, KeyBuffer); /*0x14e8*/
return (*(__int64 (__fastcall **)(EFI_HANDLE *, void *, _UNKNOWN **, _QWORD))(BootServices_1 + 328))( /*0x152c*/
&DriverImageHandle,
&unk_16050,
&off_160D0,
0);
}
// Function: CryptoAlgorithmSelector @ 0x1534 (0x131 bytes)
unsigned __int64 __fastcall CryptoAlgorithmSelector(
__int64 Key,
unsigned __int64 GuidTable,
__int64 InputData,
char *InputSize,
__int64 *ResultSize,
char *KeyBuffer)
{
if ( InternalCompareMemAligned(GuidTable, &GuidTable_, 0x10u) && InternalCompareMemAligned(GuidTable, &byte_16010, 0x10u) ) /*0x157e*/
{
if ( InternalCompareMemAligned(GuidTable, &byte_16030, 0x10u) && InternalCompareMemAligned(GuidTable, &byte_16090, 0x10u) ) /*0x15b0*/
{
if ( InternalCompareMemAligned(GuidTable, &byte_16080, 0x10u) ) /*0x15c7*/
{
if ( InternalCompareMemAligned(GuidTable, &byte_160B0, 0x10u) ) /*0x15f5*/
return 0x8000000000000003uLL; /*0x1620*/
Sha512(InputData, InputSize, (char *)ResultSize, KeyBuffer); /*0x160f*/
}
else
{
Sha384(InputData, InputSize, (char *)ResultSize, KeyBuffer); /*0x15e1*/
}
}
else
{
GetInfo_2(InputData, InputSize, (char *)ResultSize, KeyBuffer); /*0x1632*/
}
}
else
{
GetInfo(InputData, (char **)InputSize, (char *)ResultSize, KeyBuffer); /*0x1649*/
}
return 0; /*0x165f*/
}
// Function: CryptoDispatcher @ 0x1668 (0x6ab bytes)
unsigned __int64 __fastcall CryptoDispatcher(
__int64 Key,
unsigned __int8 *SourceData,
__int64 SourceSize,
unsigned __int8 *KeyBuffer,
__int64 SecondarySize,
__int64 *p_KeyBuffer,
__int64 *OutputSize,
unsigned __int8 OperationId)
{
double TempDouble; // xmm3_8
int Result; // edi
__int64 Info_1; // rsi
__int64 v13; // r8
int OperationId_1; // ebx
void **OutputSize_1; // r14
unsigned int **p_KeyBuffer_1; // r15
_QWORD *Context; // rax
unsigned int *KeyBuffer_8; // rdx
unsigned __int8 *KeyBuffer_7; // r14
__int64 SecondarySize_2; // rbx
__int64 *Ctx1; // rdi
unsigned __int64 *Ctx2; // rax
int Info_3; // eax
unsigned int *KeyBuffer_2; // rsi
unsigned __int64 KeyLen; // rbx
unsigned __int64 *CryptoCtx; // rax
__int64 EntryPtr; // rcx
unsigned __int64 Index; // r9
unsigned __int64 Index_1; // rdx
_DWORD *Entry; // rax
int KeyLen_1; // eax
char **p_KeyBuffer_2; // r14
__int64 *Outp... [16241 chars total]
// Function: CryptoSignatureVerifier @ 0x1d14 (0x206 bytes)
unsigned __int64 __fastcall CryptoSignatureVerifier(
__int64 Context,
unsigned __int64 HashAlgo,
unsigned __int64 PubKey,
unsigned __int8 *Signature,
__int64 SigLen,
char Flags)
{
double TempDouble; // xmm2_8
__int64 HashCtx; // rbx
unsigned int KeySize; // edi
__int64 Status; // rbx
int Info_0; // eax
char *CheckPtr; // rcx
char *CheckPtr_1; // rdx
char *DerStart; // rcx
if ( (Flags & 3) != 0 )
{
if ( HashAlgo )
{
if ( PubKey )
{
if ( Signature )
{
GetInfo_5(); /*0x1d5c*/
if ( !InternalCompareMemAligned(HashAlgo, &byte_160C0, 0x10u) )
{
HashCtx = BnBin2Bn(*(char **)(HashAlgo + 24), *(unsigned int *)(HashAlgo + 16), TempDouble); /*0x1d9a*/
if ( InternalCompareMemAligned(PubKey, &GuidTable_, 0x10u) )
KeySize = InternalCompareMemAligned(PubKey, &byte_16030, 0x10u) != 0 ? 32 : 20;
else
KeySize = 32; /*0x1da7*/
if ( !HashCtx ) /*0x1dcc*/
{
Status = -1; /*0x1dce*/
LABEL_32:
GetInfo_5(); /*0x1edb*/
return -(__int64)(Status != 0) & 0x800000000000001AuLL; /*0x1ef3*/
}
Info_0 = GetInfo_0(Signature, SigLen, KeyBuffer_0, (unsigned __int64 *)&SigLen, HashCtx); /*0x1df3*/
Status = Info_0; /*0x1df8*/
if ( Info_0 ) /*0x1dfd*/
goto LABEL_32; /*0x1dfd*/
if ( (Flags & 1) == 0 ) /*0x1e08*/
{
Status = (int)RsaPssVerify(*(unsigned int **)(PubKey + 24), KeySize, KeyBuffer_0, SigLen, 8u, 0x800u); /*0x1ed8*/
goto LABEL_32; /*0x1ed8*/
}
if ( (unsigned int)SigLen >= 0x1B /*0x1e3d*/
&& !KeyBuffer_0[0]
&& (unsigned __int8)(qword_161C1 - 1) <= 1u
&& BYTE1(qword_161C1) == 0xFF )
{
CheckPtr = (char *)&qword_161C1 + 2; /*0x1e44*/
CheckPtr_1 = &KeyBuffer_0[(unsigned int)SigLen]; /*0x1e53*/
while ( CheckPtr < CheckPtr_1 && *CheckPtr == ((_BYTE)qword_161C1 != 1) - 1 ) /*0x1e5b*/
++CheckPtr; /*0x1e5d*/
if ( CheckPtr - KeyBuffer_0 - 2 >= 8 && CheckPtr + 16 < CheckPtr_1 && !*CheckPtr ) /*0x1e7e*/
{
if ( KeySize != 32 ) /*0x1e87*/
{
DerStart = &KeyBuffer_0[(unsigned int)SigLen - (unsigned __int64)KeySize]; /*0x1e9b*/
goto LABEL_28; /*0x1e9b*/
}
if ( CheckPtr + 52 == CheckPtr_1 ) /*0x1e90*/
{
DerStart = CheckPtr + 20; /*0x1e92*/
LABEL_28:
LODWORD(Status) = MemConfig((unsigned __int64)DerStart, *(_QWORD *)(PubKey + 24), KeySize); /*0x1e9f*/
LABEL_30:
Status = (int)Status; /*0x1eb0*/
goto LABEL_32; /*0x1eb3*/
}
}
}
LODWORD(Status) = -1; /*0x1eac*/
goto LABEL_30; /*0x1eac*/
}
}
}
}
}
return 0x8000000000000002uLL; /*0x1f13*/
}
// Function: HobConfig @ 0x1f1c (0xd5 bytes)
unsigned __int64 __fastcall HobGetKey(EFI_SYSTEM_TABLE *SystemTable, __int64 a2, double a3)
{
unsigned __int64 v4; // rdi
_WORD *v5; // rsi
bool v6; // zf
_WORD *v7; // rbx
v4 = 0x800000000000000EuLL; /*0x1f38*/
v5 = (_WORD *)EfiConfigTableFind(SystemTable); /*0x1f47*/
if ( v5 ) /*0x1f4d*/
{
LABEL_2:
v6 = *v5 == 0xFFFF; /*0x1f59*/
v7 = v5; /*0x1f5d*/
while ( !v6 ) /*0x1f60*/
{
v7 = (_WORD *)((char *)v7 + (unsigned __int16)v7[1]); /*0x1f66*/
if ( *v7 == 4 ) /*0x1f6d*/
{
v5 = v7; /*0x1f86*/
if ( InternalCompareMemAligned(v7 + 4, &byte_160A0, 16) ) /*0x1f89*/
goto LABEL_2; /*0x1f91*/
*(_QWORD *)(a2 + 24) = *((_QWORD *)v7 + 5); /*0x1f9b*/
v4 = 0; /*0x1fa5*/
*(_DWORD *)(a2 + 16) = *((_DWORD *)v7 + 12); /*0x1fa7*/
ReadUnaligned128(a2, v7 + 12); /*0x1faa*/
DebugPrint( /*0x1fce*/
64,
"Get Key Hob %g\n(addr %X, len 0x%x) [%X...]\n",
a3,
*(_QWORD *)(a2 + 24),
*(_DWORD *)(a2 + 16),
**(_DWORD **)(a2 + 24));
return v4; /*0x1fce*/
}
v6 = *v7 == 0xFFFF; /*0x1f6f*/
}
}
return v4; /*0x1fea*/
}
// Function: RsaGetKey @ 0x1ff4 (0xd0 bytes)
unsigned __int64 __fastcall RsaGetKey(__int64 a1, __int64 a2, unsigned __int64 a3, unsigned __int64 n64)
{
char *KeyBuffer; // rcx
if ( !a3 || !a2 ) /*0x2013*/
return 0x8000000000000002uLL; /*0x20af*/
if ( InternalCompareMemAligned(a3, &byte_160A0, 0x10u) ) /*0x2029*/
return 0x8000000000000003uLL; /*0x203d*/
if ( !KeyBuffer || !(_DWORD)::n64 ) /*0x2051*/
return 0x800000000000000EuLL; /*0x20a3*/
*(_DWORD *)(a2 + 16) = ::n64; /*0x205a*/
ReadUnaligned128((__int64 *)a2, (__int64)&qword_16110); /*0x2060*/
KeyBuffer = *(char **)(a2 + 24); /*0x2065*/
if ( KeyBuffer ) /*0x206c*/
{
if ( n64 < (unsigned int)::n64 ) /*0x2078*/
return 0x8000000000000005uLL; /*0x2084*/
MemMove(KeyBuffer, KeyBuffer, (unsigned int)::n64); /*0x208d*/
}
else
{
*(_QWORD *)(a2 + 24) = KeyBuffer; /*0x209b*/
}
return 0; /*0x20be*/
}
// Function: HashVerify @ 0x20c4 (0x1de bytes)
__int64 __fastcall HashVerify(__int64 a1, unsigned __int64 a2, unsigned __int64 a3)
{
char **InputSize; // rsi
__int64 result; // rax
__int64 n8_1; // r15
char *KeyBuffer; // r14
char *ResultBuf_1; // r13
unsigned __int64 n8_2; // rdi
unsigned __int64 *HashCtx; // rax
int v12; // eax
int v13; // ebx
_BYTE ResultBuf[9]; // [rsp+30h] [rbp-40h] BYREF
__int64 v15; // [rsp+39h] [rbp-37h]
__int64 v16; // [rsp+41h] [rbp-2Fh]
int v17; // [rsp+49h] [rbp-27h]
__int16 v18; // [rsp+4Dh] [rbp-23h]
char v19; // [rsp+4Fh] [rbp-21h]
unsigned __int64 v20[2]; // [rsp+50h] [rbp-20h] BYREF
unsigned __int64 n8; // [rsp+60h] [rbp-10h]
unsigned __int64 KeyBuffer_2; // [rsp+68h] [rbp-8h]
__int64 p_n256; // [rsp+A8h] [rbp+38h] BYREF
char *KeyBuffer_1; // [rsp+B8h] [rbp+48h] BYREF
memset(ResultBuf, 0, sizeof(ResultBuf)); /*0x20e2*/
v15 = 0; /*0x20f0*/
v16 = 0; /*0x20f4*/
v17 = 0; /*0x20f8*/
v18 = 0; /*0x20fb*/
v19 = 0; /*0x20ff*/
if ( !a2 ) /*0x2105*/
return 0x8000000000000002uLL; /*0x2105*/
if ( !a3 ) /*0x210e*/
return 0x8000000000000002uLL; /*0x210e*/
InputSize = (char **)(a3 + 24); /*0x2114*/
if ( !*(_QWORD *)(a3 + 24) ) /*0x2118*/
return 0x8000000000000002uLL; /*0x227f*/
if ( InternalCompareMemAligned(a2, &byte_160A0, 0x10u) ) /*0x212f*/
return 0x8000000000000003uLL; /*0x2143*/
KeyBuffer_2 = 0; /*0x214b*/
LODWORD(n8) = 0; /*0x2152*/
result = RsaGetKey(0, (__int64)v20, a2, 0); /*0x2161*/
if ( result >= 0 ) /*0x2169*/
{
n8_1 = (unsigned int)n8; /*0x216f*/
KeyBuffer = (char *)KeyBuffer_2; /*0x217a*/
ResultBuf_1 = *InputSize; /*0x2184*/
n8_2 = (unsigned int)n8; /*0x218a*/
if ( InternalCompareMemAligned(a3, &byte_160C0, 0x10u) ) /*0x218d*/
return -(__int64)(InternalCompareMemAligned((unsigned __int64)KeyBuffer, ResultBuf_1, n8_2) != 0) & 0x800000000000001AuLL; /*0x21f6*/
if ( !InternalCompareMemAligned((unsigned __int64)v20, &byte_16040, 0x10u) ) /*0x21a6*/
{
p_n256 = *(unsigned int *)(a3 + 16); /*0x21bb*/
ResultBuf_1 = ResultBuf; /*0x21c2*/
GetInfo(1, InputSize, (char *)&p_n256, ResultBuf); /*0x21cb*/
n8_2 = 32; /*0x21d0*/
return -(__int64)(InternalCompareMemAligned((unsigned __int64)KeyBuffer, ResultBuf_1, n8_2) != 0) & 0x800000000000001AuLL; /*0x21d0*/
}
if ( InternalCompareMemAligned((unsigned __int64)v20, &byte_16060, 0x10u) ) /*0x220c*/
return -(__int64)(InternalCompareMemAligned((unsigned __int64)KeyBuffer, ResultBuf_1, n8_2) != 0) & 0x800000000000001AuLL; /*0x220c*/
KeyBuffer = KeyBuffer_0; /*0x2216*/
n8_2 = 256; /*0x221d*/
KeyBuffer_1 = KeyBuffer_0; /*0x2222*/
p_n256 = 256; /*0x2226*/
GetInfo_5(); /*0x222a*/
if ( KeyBuffer_2 && n8_1 ) /*0x2239*/
{
HashCtx = SataConfig_6((unsigned __int8 *)KeyBuffer_2, n8_1); /*0x2242*/
v12 = RsaParsePublicKey(HashCtx, (unsigned __int8 **)&KeyBuffer_1, &p_n256); /*0x2252*/
KeyBuffer = KeyBuffer_1; /*0x2257*/
v13 = v12; /*0x225b*/
n8_2 = p_n256; /*0x225d*/
}
else
{
v13 = -1; /*0x2263*/
}
GetInfo_5(); /*0x2266*/
if ( !v13 ) /*0x226d*/
return -(__int64)(InternalCompareMemAligned((unsigned __int64)KeyBuffer, ResultBuf_1, n8_2) != 0) & 0x800000000000001AuLL; /*0x226d*/
return 0x800000000000001AuLL; /*0x2273*/
}
return result; /*0x2296*/
}
// Function: ReadUnaligned128 @ 0x22a4 (0x83 bytes)
__int64 *__fastcall ReadUnaligned128(__int64 *a1, __int64 a2)
{
__int64 v4; // rsi
__int64 v5; // rsi
v4 = ReadUnaligned64(a2); /*0x22c1*/
if ( !a1 ) /*0x22c7*/
AssertReport("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 219, "Buffer != ((void *) 0)"); /*0x22dc*/
*a1 = v4; /*0x22e5*/
v5 = ReadUnaligned64(a2 + 8); /*0x22f1*/
if ( a1 == (__int64 *)-8LL ) /*0x22f7*/
AssertReport("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 219, "Buffer != ((void *) 0)"); /*0x230c*/
a1[1] = v5; /*0x2311*/
return a1; /*0x2321*/
}
// Function: GuidCompare @ 0x2328 (0x6e bytes)
bool __fastcall GuidCompare(__int64 Status, __int64 a2)
{
__int64 v3; // rdi
__int64 v4; // rbx
__int64 v5; // rbp
__int64 v6; // rax
v3 = ReadUnaligned64((__int64)byte_16070); /*0x234e*/
v4 = ReadUnaligned64(a2); /*0x235d*/
v5 = ReadUnaligned64((__int64)&unk_16078); /*0x2369*/
v6 = ReadUnaligned64(a2 + 8); /*0x236c*/
return v3 == v4 && v5 == v6; /*0x2390*/
}
// Function: DebugProtocolGet @ 0x2398 (0x86 bytes)
__int64 DebugProtocolGet()
{
__int64 result; // rax
unsigned __int64 n0x10; // rbx
__int64 v2; // rax
__int64 v3; // rcx
result = qword_16170; /*0x23a2*/
if ( !qword_16170 ) /*0x23ae*/
{
if ( BootServices_0 /*0x23dc*/
&& (n0x10 = (*(__int64 (__fastcall **)(__int64))(BootServices_0 + 24))(31),
(*(void (__fastcall **)(unsigned __int64))(BootServices_0 + 32))(n0x10),
n0x10 <= 0x10) )
{
v2 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_16000, 0, &qword_16170); /*0x23f5*/
v3 = qword_16170; /*0x23fb*/
if ( v2 < 0 ) /*0x2405*/
v3 = 0; /*0x2405*/
qword_16170 = v3; /*0x2409*/
return v3; /*0x2410*/
}
else
{
return 0; /*0x23bc*/
}
}
return result; /*0x2418*/
}
// Function: DebugPrint @ 0x2420 (0x80 bytes)
__int64 DebugPrint(__int64 a1, const char *a2, ...)
{
__int64 result; // rax
__int64 v4; // r8
__int64 (__fastcall **v5)(__int64, const char *, __int64 *); // r9
unsigned __int8 v6; // al
unsigned __int8 n3; // al
int n113; // edx
va_list va; // [rsp+40h] [rbp+18h] BYREF
va_start(va, a2);
result = DebugProtocolGet(); /*0x2437*/
v4 = 0; /*0x243c*/
v5 = (__int64 (__fastcall **)(__int64, const char *, __int64 *))result; /*0x243f*/
if ( result ) /*0x2445*/
{
v6 = __inbyte(0x70u); /*0x244b*/
__outbyte(0x70u, v6 & 0x80 | 0x4B); /*0x2450*/
n113 = 113; /*0x2451*/
n3 = __inbyte(0x71u); /*0x2455*/
LOBYTE(n113) = n3; /*0x2456*/
if ( n3 > 3u ) /*0x245a*/
{
n113 = 3; /*0x2463*/
if ( n113 ) /*0x2469*/
n113 = (unsigned __int8)n113; /*0x2469*/
}
result = (unsigned int)(n113 - 1); /*0x246c*/
if ( (unsigned __int8)(n113 - 1) <= 0xFDu ) /*0x2471*/
{
result = 2147483652LL; /*0x2476*/
v4 = 2147483718LL; /*0x247b*/
if ( (_BYTE)n113 == 1 ) /*0x2481*/
v4 = 2147483652LL; /*0x2481*/
}
if ( (v4 & a1) != 0 ) /*0x2488*/
return (*v5)(a1, a2, (__int64 *)va); /*0x2497*/
}
return result; /*0x249a*/
}
// Function: AssertReport @ 0x24a0 (0x3e bytes)
__int64 __fastcall AssertReport(__int64 a1, __int64 a2, __int64 a3)
{
__int64 result; // rax
result = DebugProtocolGet(); /*0x24b8*/
if ( result ) /*0x24c0*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(result + 8))(a1, a2, a3); /*0x24cb*/
return result; /*0x24d8*/
}
// Function: EfiReleaseProtocol @ 0x24ec (0x26 bytes)
__int64 EfiReleaseProtocol()
{
__int64 result; // rax
if ( qword_16170 ) /*0x24f8*/
return (*(__int64 (__fastcall **)(_QWORD, __int64 *))(RuntimeServices_0 + 64))(0, &qword_16170); /*0x250a*/
return result; /*0x250d*/
}
// Function: EfiAllocPool @ 0x2514 (0x31 bytes)
__int64 __fastcall EfiAllocPool(__int64 n256)
{
__int64 v1; // rax
__int64 v2; // rcx
__int64 v4; // [rsp+38h] [rbp+10h] BYREF
v1 = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *))(BootServices + 64))(4, n256, &v4); /*0x252c*/
v2 = v4; /*0x252f*/
if ( v1 < 0 ) /*0x2539*/
return 0; /*0x2539*/
return v2; /*0x2540*/
}
// Function: AssertCpuDeadLoop_0 @ 0x2548 (0x4b bytes)
__int64 AssertCpuDeadLoop_0()
{
__int64 result; // rax
result = (*(__int64 (__fastcall **)(_QWORD))(BootServices + 72))(HeapAddr); /*0x255a*/
if ( result < 0 ) /*0x2560*/
{
DebugPrint(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x2571*/
return AssertReport( /*0x2589*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
819,
(__int64)"!EFI_ERROR (Status)");
}
return result; /*0x258e*/
}
// Function: AssertCpuDeadLoop @ 0x2594 (0xd6 bytes)
__int64 __fastcall AssertCpuDeadLoop(__int64 Status)
{
__int64 result; // rax
__int64 SystemTable; // rdi
unsigned __int64 v3; // rbx
__int64 v4; // rsi
result = qword_16178; /*0x25a3*/
if ( !qword_16178 ) /*0x25ad*/
{
SystemTable = SystemTable; /*0x25b3*/
v3 = 0; /*0x25ba*/
qword_16178 = 0; /*0x25bc*/
if ( *(_QWORD *)(SystemTable + 104) ) /*0x25c3*/
{
v4 = 0; /*0x25c9*/
while ( !GuidCompare(Status, v4 + *(_QWORD *)(SystemTable + 112)) ) /*0x25d9*/
{
++v3; /*0x25db*/
v4 += 24; /*0x25de*/
if ( v3 >= *(_QWORD *)(SystemTable + 104) ) /*0x25e6*/
goto LABEL_6; /*0x25e6*/
}
result = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 * v3 + 16); /*0x265c*/
qword_16178 = result; /*0x2661*/
}
else
{
LABEL_6:
DebugPrint(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0x25e8*/
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0x2616*/
result = qword_16178; /*0x261b*/
}
if ( !result ) /*0x2625*/
{
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0x2638*/
return qword_16178; /*0x263d*/
}
}
return result; /*0x264e*/
}
// Function: InternalCompareMemAligned @ 0x266c (0x78 bytes)
__int64 __fastcall InternalCompareMemAligned(unsigned __int64 a1, _BYTE *a2, unsigned __int64 n8)
{
unsigned __int64 v3; // r10
unsigned __int64 n8_1; // r9
unsigned __int64 v5; // r8
v3 = a1 + n8; /*0x2672*/
if ( n8 >= 8 ) /*0x2679*/
{
n8_1 = a1 & 7; /*0x267e*/
if ( (a1 & 7) != 0 && n8_1 == ((unsigned __int8)a2 & 7) ) /*0x268d*/
{
v5 = 8 - n8_1; /*0x2692*/
if ( n8_1 != 8 ) /*0x2695*/
{
do /*0x26a7*/
{
if ( *(_BYTE *)a1 != *a2 ) /*0x269b*/
break; /*0x269b*/
++a1; /*0x269d*/
++a2; /*0x26a0*/
--v5; /*0x26a3*/
}
while ( v5 ); /*0x26a7*/
}
}
while ( a1 <= v3 - 8 && *(_QWORD *)a1 == *(_QWORD *)a2 ) /*0x26b5*/
{
a1 += 8LL; /*0x26b7*/
a2 += 8; /*0x26ba*/
}
}
while ( 1 ) /*0x26d0*/
{
if ( a1 >= v3 ) /*0x26d3*/
return 0; /*0x26d7*/
if ( *(_BYTE *)a1 != *a2 ) /*0x26c8*/
break; /*0x26c8*/
++a1; /*0x26ca*/
++a2; /*0x26cd*/
}
return *(char *)a1 - (char)*a2; /*0x26d7*/
}
// Function: EfiConfigTableFind @ 0x26e4 (0x4e bytes)
void *__fastcall EfiConfigTableFind(EFI_SYSTEM_TABLE *SystemTable)
{
UINTN NumberOfTableEntries; // rdi
EFI_CONFIGURATION_TABLE *ConfigurationTable; // rbx
NumberOfTableEntries = SystemTable->NumberOfTableEntries; /*0x26ee*/
ConfigurationTable = SystemTable->ConfigurationTable; /*0x26f2*/
if ( !NumberOfTableEntries ) /*0x26f9*/
return 0; /*0x271f*/
while ( InternalCompareMemAligned((unsigned __int64)ConfigurationTable, byte_16070, 0x10u) ) /*0x2713*/
{
++ConfigurationTable; /*0x2715*/
if ( !--NumberOfTableEntries ) /*0x271d*/
return 0; /*0x271d*/
}
return ConfigurationTable->VendorTable; /*0x2726*/
}
// Function: EfiFreePool @ 0x2734 (0x1b bytes)
__int64 EfiFreePool()
{
byte_16108 = 0; /*0x2744*/
return (*(__int64 (__fastcall **)(_QWORD, _QWORD *))(RuntimeServices + 64))(0, &HeapAddr);
}
// Function: BnBin2Bn @ 0x2750 (0x1ab bytes)
unsigned __int64 __fastcall BnBin2Bn(char *src, unsigned __int64 count, double TempDouble)
{
unsigned __int64 count_1; // rbx
char *src_1; // rdi
unsigned __int64 src_2; // rax
unsigned __int64 v7; // rbp
unsigned __int64 v8; // rax
__int64 v9; // rsi
char *src_3; // r15
int v11; // eax
__int64 v13; // rbx
unsigned __int8 *v14; // rsi
int n3; // r15d
int v16; // eax
count_1 = count; /*0x2768*/
if ( !src ) /*0x2771*/
return 0; /*0x2771*/
src_1 = src; /*0x277a*/
if ( *src < 0 ) /*0x277d*/
{
src_2 = MmgrAlloc(count + 1); /*0x2783*/
src_1 = (char *)src_2; /*0x2788*/
if ( !src_2 ) /*0x278e*/
return 0; /*0x278e*/
if ( count_1 ) /*0x2797*/
MemConfig_0((char *)(src_2 + 1), src, count_1); /*0x27a3*/
*src_1 = 0; /*0x27a8*/
LODWORD(count_1) = count_1 + 1; /*0x27ab*/
}
v7 = MmgrAlloc(0x18u); /*0x27b8*/
if ( v7 )
{
*(_QWORD *)(v7 + 8) = BnAllocNew(); /*0x27c9*/
v8 = BnAllocNew(); /*0x27cd*/
v9 = *(_QWORD *)(v7 + 8); /*0x27d2*/
*(_QWORD *)(v7 + 16) = v8; /*0x27d6*/
if ( v9 && v8 )
{
src_3 = src_1; /*0x27e8*/
if ( *(int *)(v9 + 4) >= 2 || !(unsigned int)BnResize(v9, 2) ) /*0x27f5*/
{
BnClear(v9); /*0x2801*/
while ( (int)count_1 > 0 ) /*0x282f*/
{
LODWORD(count_1) = count_1 - 1; /*0x2810*/
if ( (unsigned int)BnLshiftBits(v9, 8, v9) ) /*0x2812*/
goto LABEL_17; /*0x2819*/
v11 = (unsigned __int8)*src_3++; /*0x281b*/
**(_DWORD **)(v9 + 16) |= v11; /*0x2826*/
++*(_DWORD *)v9; /*0x2828*/
}
BnTrim(v9); /*0x2831*/
v13 = *(_QWORD *)(v7 + 16); /*0x2884*/
v14 = (unsigned __int8 *)&off_10090; /*0x2888*/
n3 = 3; /*0x288f*/
if ( *(int *)(v13 + 4) >= 2 || !(unsigned int)BnResize(*(_QWORD *)(v7 + 16), 2) ) /*0x28a2*/
{
BnClear(v13); /*0x28ae*/
while ( 1 ) /*0x28be*/
{
--n3; /*0x28be*/
if ( (unsigned int)BnLshiftBits(v13, 8, v13) ) /*0x28c1*/
break; /*0x28c1*/
v16 = *v14++; /*0x28ce*/
**(_DWORD **)(v13 + 16) |= v16; /*0x28d8*/
++*(_DWORD *)v13; /*0x28da*/
if ( n3 <= 0 ) /*0x28df*/
{
BnTrim(v13); /*0x28e4*/
return v7; /*0x28f3*/
}
}
}
}
LABEL_17:
DebugLogPrint(1, "BIGNUM: %a failed", TempDouble);
}
if ( src_1 != src ) /*0x2857*/
GetInfo_7((__int64)src_1); /*0x285c*/
BnFree(v7); /*0x2864*/
}
return 0; /*0x287a*/
}
// Function: SataConfig_9 @ 0x28fc (0x102 bytes)
__int64 __fastcall SataConfig_9(unsigned __int8 *a1, __int64 a2)
{
unsigned __int64 v4; // rax
__int64 v5; // rbx
__int64 v6; // rdi
unsigned __int64 v7; // rax
unsigned __int8 *v8; // rsi
unsigned __int8 *buf_; // rax
unsigned __int8 *v10; // rax
__int64 v11; // rcx
unsigned __int8 *buf; // [rsp+20h] [rbp-28h] BYREF
unsigned __int8 v14; // [rsp+29h] [rbp-1Fh]
int n16; // [rsp+2Ch] [rbp-1Ch]
int v16; // [rsp+30h] [rbp-18h]
v4 = MmgrAlloc(0x18u); /*0x291b*/
v5 = 0; /*0x2920*/
v6 = v4; /*0x2922*/
if ( v4 )
{
*(_DWORD *)v4 = 0; /*0x292e*/
*(_QWORD *)(v4 + 8) = BnAllocNew(); /*0x2935*/
v7 = BnAllocNew(); /*0x2939*/
*(_QWORD *)(v6 + 16) = v7; /*0x293e*/
if ( !*(_QWORD *)(v6 + 8) || !v7 ) /*0x294f*/
goto LABEL_12; /*0x294f*/
if ( (int)SataConfig_7(a1, a2, &buf) < 0 || v14 || n16 != 16 )
{
DebugLogPrint(1, "RSA: Expected SEQUENCE (public key) - found class %d tag 0x%x", v14, n16);
goto LABEL_12; /*0x29d9*/
}
v8 = &buf[v16]; /*0x2987*/
buf_ = BnDecodeInteger(buf, (__int64)v8, *(_QWORD *)(v6 + 8)); /*0x298d*/
v10 = BnDecodeInteger(buf_, (__int64)v8, *(_QWORD *)(v6 + 16)); /*0x299c*/
if ( !v10 ) /*0x29a4*/
{
LABEL_12:
BnFree(v6); /*0x29de*/
return v5; /*0x29e1*/
}
if ( v10 != v8 )
{
DebugHexdumpFlat(v11, (__int64)"RSA: Extra data in public key SEQUENCE", (__int64)v10, v8 - v10);
goto LABEL_12; /*0x29c0*/
}
return v6; /*0x29c2*/
}
return v5; /*0x29f8*/
}
// Function: Pkcs1VerifyPadding @ 0x2a00 (0x14a bytes)
__int64 __fastcall Pkcs1VerifyPadding(__int64 HashCtx, unsigned __int8 *Signature, void *va, _BYTE *buf, void **p_va)
{
void **p_va_1; // rsi
__int64 v7; // rcx
unsigned __int64 p_va_2; // rdi
unsigned __int8 v9; // al
_BYTE *i_2; // rdx
_BYTE *i_1; // rcx
_BYTE *i; // rax
char *src; // rdx
_BYTE *count; // rdi
p_va_1 = p_va; /*0x2a0f*/
p_va = (void **)*p_va; /*0x2a33*/
if ( (int)GetInfo_0(Signature, (int)va, buf, (unsigned __int64 *)&p_va, HashCtx) < 0 ) /*0x2a3f*/
return 0xFFFFFFFFLL; /*0x2a3f*/
p_va_2 = (unsigned __int64)p_va; /*0x2a45*/
DebugHexdumpFlat(v7, (__int64)"PKCS1: Sig Decrypted ", (__int64)buf, (unsigned __int64)p_va);
if ( p_va_2 < 0x1B || *buf || (v9 = buf[1], v9 > 1u) )
{
DebugLogPrint(2, "PKCS1: Invalid signature EB structure");
return 0xFFFFFFFFLL; /*0x2b32*/
}
i_2 = buf + 3; /*0x2a7a*/
if ( v9 )
{
if ( buf[2] != 0xFF )
{
DebugLogPrint(2, "PKCS1: Invalid signature PS (BT=01)");
return 0xFFFFFFFFLL; /*0x2ac1*/
}
i_1 = &buf[p_va_2]; /*0x2ac3*/
while ( i_2 < i_1 && *i_2 == 0xFF ) /*0x2acc*/
++i_2; /*0x2ace*/
}
else
{
if ( buf[2] )
{
DebugLogPrint(2, "PKCS1: Invalid signature PS (BT=00)");
return 0xFFFFFFFFLL; /*0x2b37*/
}
i_1 = &buf[p_va_2]; /*0x2a93*/
for ( i = buf + 4; i < i_1 && !*i_2 && !*i; ++i ) /*0x2a97*/
++i_2; /*0x2aa7*/
}
if ( i_2 - buf - 2 < 8 )
{
DebugLogPrint(2, "PKCS1: Too short signature padding");
return 0xFFFFFFFFLL; /*0x2aed*/
}
if ( i_2 + 16 >= i_1 || *i_2 )
{
DebugLogPrint(2, "PKCS1: Invalid signature EB structure (2)");
return 0xFFFFFFFFLL; /*0x2b24*/
}
src = i_2 + 1; /*0x2afd*/
count = (_BYTE *)(buf - src + p_va_2); /*0x2b06*/
if ( count ) /*0x2b09*/
MemConfig_0(buf, src, (unsigned __int64)count); /*0x2b11*/
*p_va_1 = count; /*0x2b16*/
return 0; /*0x2b44*/
}
// Function: Pkcs7ParseOctetString @ 0x2b4c (0xfe bytes)
__int64 __fastcall Pkcs7ParseOctetString(unsigned __int8 **p_src, __int64 a2, __int64 *a3, _QWORD *a4)
{
char *src_1; // rdi
char *dst; // rax
__int64 n16_1; // rcx
char *src; // [rsp+20h] [rbp-28h] BYREF
unsigned __int8 v12; // [rsp+29h] [rbp-1Fh]
int n4; // [rsp+2Ch] [rbp-1Ch]
unsigned __int64 n16; // [rsp+30h] [rbp-18h]
if ( !a3 || !a4 ) /*0x2b76*/
return 0xFFFFFFFFLL; /*0x2b76*/
if ( (int)SataConfig_7(*p_src, a2, (unsigned __int8 **)&src) < 0 || v12 || n4 != 4 )
{
DebugLogPrint(1, "PKCS7: Expected OCTETSTRING - found Class %d tag 0x%x", v12, n4);
return 0xFFFFFFFFLL; /*0x2c2c*/
}
if ( !(_DWORD)n16 ) /*0x2ba8*/
return 0xFFFFFFFFLL; /*0x2c31*/
src_1 = src; /*0x2bb1*/
GetInfo_7(*a3); /*0x2bb6*/
dst = (char *)MmgrAlloc((unsigned int)n16); /*0x2bbf*/
*a3 = (__int64)dst; /*0x2bc4*/
if ( !dst )
{
DebugLogPrint(1, "PKCS7: Failed to allocate memory for Output buff");
return 0xFFFFFFFFLL; /*0x2c1a*/
}
n16_1 = (unsigned int)n16; /*0x2bcc*/
if ( (_DWORD)n16 ) /*0x2bd5*/
{
MemConfig_0(dst, src_1, (unsigned int)n16); /*0x2bdd*/
n16_1 = (unsigned int)n16; /*0x2be2*/
}
*a4 = (unsigned int)n16_1; /*0x2bf0*/
DebugHexdumpFlat(n16_1, (__int64)"PKCS7: OCTET STRING", *a3, (unsigned int)n16_1);
*p_src = (unsigned __int8 *)&src_1[(unsigned int)n16]; /*0x2c02*/
return 0; /*0x2c43*/
}
// Function: Pkcs7ParseIssuerAndSerial @ 0x2c4c (0x10d bytes)
__int64 __fastcall Pkcs7ParseIssuerAndSerial(__int64 buf, unsigned __int8 **p_src, __int64 a3, double TempDouble)
{
unsigned __int8 *v6; // rdi
__int64 v7; // rcx
int v8; // eax
__int64 v9; // rcx
unsigned int n16_1; // eax
unsigned __int8 *bufa_1; // rdx
bool v12; // zf
unsigned __int8 *bufa; // [rsp+20h] [rbp-20h] BYREF
unsigned __int8 v15; // [rsp+29h] [rbp-17h]
int n2; // [rsp+2Ch] [rbp-14h]
unsigned __int64 n16; // [rsp+30h] [rbp-10h]
unsigned __int8 *p_srca; // [rsp+60h] [rbp+20h] BYREF
if ( !buf ) /*0x2c6a*/
return 0xFFFFFFFFLL; /*0x2c6a*/
p_srca = *p_src; /*0x2c77*/
v6 = &p_srca[a3]; /*0x2c7b*/
if ( (unsigned int)SataConfig_1(p_srca, a3, buf + 8, &p_srca) ) /*0x2c89*/
return 0xFFFFFFFFLL; /*0x2c90*/
X509DebugPrintDn(v7, (__int64)"PKCS7: Issuer", buf + 8, TempDouble);
v8 = SataConfig_7(p_srca, v6 - p_srca, &bufa); /*0x2cb4*/
LOBYTE(v9) = v15; /*0x2cbd*/
if ( v8 < 0 || v15 || n2 != 2 )
{
DebugLogPrint(1, "PKCS7: No INTEGER tag found for serialNumber; Class=%d tag=0x%x", v15, n2);
return 0xFFFFFFFFLL; /*0x2d43*/
}
n16_1 = n16; /*0x2cce*/
bufa_1 = bufa; /*0x2cd1*/
if ( (_DWORD)n16 ) /*0x2cd7*/
{
do /*0x2ceb*/
{
if ( *bufa_1 ) /*0x2cd9*/
break; /*0x2cdc*/
++bufa_1; /*0x2cde*/
v12 = n16_1-- == 1; /*0x2ce1*/
bufa = bufa_1; /*0x2ce4*/
LODWORD(n16) = n16_1; /*0x2ce8*/
}
while ( !v12 ); /*0x2ceb*/
}
if ( n16_1 ) /*0x2cf2*/
{
MemConfig_0((char *)(buf + 344), (char *)bufa_1, n16_1); /*0x2cfb*/
n16_1 = n16; /*0x2d00*/
}
*(_QWORD *)(buf + 368) = n16_1; /*0x2d14*/
DebugHexdumpFlat(v9, (__int64)"PKCS7: serialNumber", buf + 344, n16_1);
*p_src = &bufa[(unsigned int)n16]; /*0x2d27*/
return 0; /*0x2d50*/
}
// Function: Pkcs7ParseDigestAlgorithmId @ 0x2d5c (0x2e5 bytes)
__int64 __fastcall Pkcs7ParseDigestAlgorithmId(unsigned __int8 *src, __int64 a2, unsigned __int64 *buf, unsigned __int8 **p_src)
{
unsigned __int64 v8; // rbx
unsigned __int8 *bufa_1; // r14
unsigned __int8 *bufa_3; // rsi
int v11; // eax
unsigned __int8 *bufa_5; // rcx
unsigned __int8 *bufa_4; // rdx
__int64 v15; // rcx
__int64 v16; // rax
char *PKCS7:_Expected_SEQUENCE_(AlgorithmIdentifier)___found_Class_%d; // rdx
unsigned __int8 *bufa_2; // [rsp+20h] [rbp-40h] BYREF
unsigned __int8 *bufa; // [rsp+28h] [rbp-38h] BYREF
unsigned __int8 n2; // [rsp+31h] [rbp-2Fh]
int n16; // [rsp+34h] [rbp-2Ch]
unsigned int v22; // [rsp+38h] [rbp-28h]
unsigned __int8 *buf_1[4]; // [rsp+40h] [rbp-20h] BYREF
v8 = 0; /*0x2d94*/
if ( (int)SataConfig_7(src, a2, &bufa) < 0 || n2 || n16 != 16 )
{
DebugLogPrint(1, "PKCS7: Expected SEQUENCE (enc Digest AlgorithmIdentifier) - found Class %d tag 0x%x", n2, n16);
}
else
{
bufa_1 = bufa; /*0x2db1*/
bufa_3 = &bufa[v22]; /*0x2dbc*/
bufa_2 = bufa; /*0x2dbf*/
if ( bufa_3 <= &src[a2] )
{
*p_src = bufa_3; /*0x2dcf*/
if ( (int)SataConfig_7(bufa_1, bufa_3 - bufa_1, buf_1) < 0 ) /*0x2de7*/
{
v11 = -1; /*0x2dff*/
}
else
{
v11 = Asn1ParseOid(buf, &bufa_2, (__int64)buf_1); /*0x2df4*/
bufa_1 = bufa_2; /*0x2df9*/
}
if ( v11 ) /*0x2e03*/
return 0xFFFFFFFFLL; /*0x2e03*/
if ( bufa_1 < bufa_3 && ((unsigned int)SataConfig_7(bufa_1, bufa_3 - bufa_1, &bufa) || n2 || n16 != 5) )
{
if ( (int)SataConfig_7(bufa_1, a2, &bufa) < 0 || n2 || n16 != 16 )
{
PKCS7:_Expected_SEQUENCE_(AlgorithmIdentifier)___found_Class_%d = "PKCS7: Expected SEQUENCE (AlgorithmIdentifie"
"r) - found Class %d tag 0x%x";
goto LABEL_44; /*0x2fef*/
}
if ( (int)SataConfig_7(bufa, bufa_3 - bufa, &bufa) < 0 || n2 != 2 || n16 )
{
PKCS7:_Expected_SEQUENCE_(AlgorithmIdentifier)___found_Class_%d = "PKCS7: PSS Expected TAG[0] hashAlgo- found C"
"lass %d tag 0x%x";
goto LABEL_44; /*0x2fed*/
}
bufa_2 = bufa; /*0x2ea5*/
if ( (unsigned int)X509ParseAlgorithmIdentifier(bufa, bufa_3 - bufa, buf + 11, &bufa_2) ) /*0x2eb0*/
return 0xFFFFFFFFLL; /*0x2e07*/
if ( bufa_2 >= bufa_3 ) /*0x2ec4*/
return 0; /*0x2ec4*/
if ( (int)SataConfig_7(bufa_2, bufa_3 - bufa_2, &bufa) < 0 || n2 != 2 || n16 != 1 )
{
PKCS7:_Expected_SEQUENCE_(AlgorithmIdentifier)___found_Class_%d = "PKCS7: PSS Expected TAG[1] pkcs1-MGF- found "
"Class %d tag 0x%x";
goto LABEL_44; /*0x2fe4*/
}
bufa_5 = &bufa[v22]; /*0x2efc*/
if ( bufa_5 <= bufa_3 )
{
if ( (int)SataConfig_7(bufa_5, bufa_3 - bufa_5, &bufa) >= 0 && n2 == 2 && n16 == 2 )
{
if ( &bufa[v22] > bufa_3 || (int)SataConfig_7(bufa, bufa_3 - bufa, &bufa) < 0 ) /*0x2f5c*/
return 0xFFFFFFFFLL; /*0x2f5c*/
if ( !n2 && n16 == 2 )
{
if ( v22 > 1 )
{
DebugLogPrint(1, "PKCS7: PSS Unexpected saltlen field length %u (expected %u)", v22);
return 0xFFFFFFFFLL; /*0x2f8c*/
}
bufa_4 = bufa; /*0x2f8e*/
v15 = v22; /*0x2f92*/
if ( v22 ) /*0x2f97*/
{
do /*0x2faa*/
{
v16 = *bufa_4++; /*0x2f99*/
v8 = v16 | (v8 << 8); /*0x2fa3*/
--v15; /*0x2fa6*/
}
while ( v15 ); /*0x2faa*/
}
buf[22] = v8; /*0x2faf*/
DebugLogPrint(1, "PKCS7: PSS saltlen %d", v8);
return 0; /*0x2fc2*/
}
PKCS7:_Expected_SEQUENCE_(AlgorithmIdentifier)___found_Class_%d = "PKCS7: PSS No INTEGER tag found for versio"
"n field - found Class %d tag 0x%x";
}
else
{
PKCS7:_Expected_SEQUENCE_(AlgorithmIdentifier)___found_Class_%d = "PKCS7: PSS Expected TAG[2] saltlen- found "
"Class %d tag 0x%x";
}
LABEL_44:
DebugLogPrint(1, PKCS7:_Expected_SEQUENCE_(AlgorithmIdentifier)___found_Class_%d, n2); /*0x2ff6*/
return 0xFFFFFFFFLL; /*0x3000*/
}
}
return 0; /*0x2fc9*/
}
}
return 0xFFFFFFFFLL; /*0x3034*/
}
// Function: Pkcs7ParseSignerInfo @ 0x3044 (0x76b bytes)
__int64 __fastcall Pkcs7ParseSignerInfo(char **buf, __int64 a2, _DWORD *a3, double TempDouble)
{
__int64 v4; // r12
unsigned __int8 *v7; // rbx
unsigned __int8 *v8; // r14
void *buf_1; // rax
__int64 buf_2; // rdi
int v11; // eax
__int64 n16_1; // r9
unsigned __int8 *v13; // rbx
int v14; // r8d
unsigned __int8 *v15; // r15
unsigned __int8 *src_1; // r15
__int64 v17; // rbx
char *src_2; // rbx
__int64 v19; // rcx
char *dst; // rax
unsigned __int64 count; // r8
unsigned __int8 *bufa_1; // r12
bool i; // cf
unsigned __int8 *bufa_3; // r14
unsigned __int8 *bufa_4; // rbx
unsigned __int8 *bufa_2; // r15
__int64 v27; // rcx
int v28; // eax
__int64 v29; // rbx
int v30; // eax
__int64 v31; // rcx
__int64 v32; // rcx
unsigned __int8 *bufa_5; // rbx
unsigned __int8 *v34; // r14
int v35; // eax
char *PKCS7:_SignerInfo_did_not_start_with_a_valid_SEQUENCE___found_C; // rdx
__int64 n2_2; // r8
char *v38; // r14
unsigned __int8 *bufa; // [rsp+20... [12633 chars total]
// Function: SataConfig_4 @ 0x37b0 (0x22c bytes)
__int64 __fastcall SataConfig_4(unsigned __int8 *buf_, unsigned __int64 n0x100, _QWORD *buf, double TempDouble)
{
unsigned __int8 *v7; // rsi
unsigned __int8 *SourceData_1; // rdi
__int64 v9; // rcx
unsigned int v10; // ebx
int v11; // eax
unsigned __int64 n0x100a_1; // rdi
unsigned __int8 *SourceData_3; // rsi
__int64 v15; // r8
__int64 Info; // rax
unsigned __int8 *SourceData; // [rsp+20h] [rbp-59h] BYREF
unsigned __int8 n2; // [rsp+29h] [rbp-50h]
unsigned int n16; // [rsp+2Ch] [rbp-4Dh]
unsigned __int64 n0x100a; // [rsp+30h] [rbp-49h]
_BYTE buf_1[12]; // [rsp+40h] [rbp-39h] BYREF
int v22; // [rsp+4Ch] [rbp-2Dh]
int n4; // [rsp+50h] [rbp-29h]
int v24; // [rsp+54h] [rbp-25h]
int n311; // [rsp+58h] [rbp-21h]
int n3; // [rsp+5Ch] [rbp-1Dh]
int n3_1; // [rsp+60h] [rbp-19h]
int v28; // [rsp+64h] [rbp-15h]
unsigned __int64 n7; // [rsp+90h] [rbp+17h]
unsigned __int8 *bufa[4]; // [rsp+A0h] [rbp+27h] BYREF
unsigned __int8 *SourceData_2; // [rsp+E8h] [rbp+6Fh] BYREF
DebugLogPrint(1, "PKCS7: Check SignerInfo.TimeStamp, len=%x", n0x100);
if ( n0x100 < 0x100 ) /*0x37f7*/
return 0xFFFFFFFFLL; /*0x37f7*/
if ( (int)SataConfig_7(buf_, n0x100, &SourceData) < 0 || n2 != 2 || n16 != 1 )
{
DebugLogPrint(1, "PKCS7: Timestamp did not start with a valid SEQUENCE - found Class %d tag 0x%x", n2, n16);
return 0xFFFFFFFFLL; /*0x39b7*/
}
v7 = &SourceData[(unsigned int)n0x100a]; /*0x3836*/
if ( (int)SataConfig_7(SourceData, (unsigned int)n0x100a, &SourceData) < 0 || n2 || n16 != 16 )
{
DebugLogPrint(1, "PKCS7: Expected SEQUENCE (AttributeTypeAndValue) - found Class %d tag 0x%x", n2, n16);
return 0xFFFFFFFFLL; /*0x39bc*/
}
SourceData_1 = SourceData; /*0x3865*/
SourceData_2 = SourceData; /*0x3870*/
v10 = -1; /*0x387f*/
if ( (int)SataConfig_7(SourceData, v7 - SourceData, bufa) < 0 ) /*0x3884*/
{
v11 = -1; /*0x389d*/
}
else
{
v11 = Asn1ParseOid((unsigned __int64 *)buf_1, &SourceData_2, (__int64)bufa); /*0x3892*/
SourceData_1 = SourceData_2; /*0x3897*/
}
if ( !v11 )
{
OidDebugPrint(v9, (__int64)"PKCS7: Found OID", (__int64)buf_1, TempDouble);
if ( n7 >= 7
&& *(_DWORD *)buf_1 == 1
&& *(_DWORD *)&buf_1[4] == 3
&& *(_DWORD *)&buf_1[8] == 6
&& v22 == 1
&& n4 == 4
&& v24 == 1
&& n7 == 10
&& n311 == 311
&& n3 == 3
&& n3_1 == 3
&& v28 == 1 )
{
if ( (int)SataConfig_7(SourceData_1, v7 - SourceData_1, &SourceData) < 0 || n2 || n16 != 17 )
{
DebugLogPrint(1, "PKCS7: Expected SET (messageDigest) - found Class %d tag 0x%x", n2, n16);
}
else
{
n0x100a_1 = (unsigned int)n0x100a; /*0x392e*/
SourceData_3 = SourceData; /*0x3938*/
DebugLogPrint(1, "PKCS7: Found RFC6131 TimeStamp, len=%x", n0x100a);
if ( n0x100a_1 >= 0x100 ) /*0x394e*/
{
Info = SataGetInfo(SourceData_3, (unsigned int)n0x100a_1, v15, TempDouble); /*0x3959*/
if ( Info ) /*0x3961*/
{
buf[29] = Info; /*0x3967*/
v10 = 0; /*0x396e*/
buf[26] = *(_QWORD *)(Info + 208); /*0x3977*/
}
}
}
}
}
return v10; /*0x39d3*/
}
// Function: SataConfig_11 @ 0x39dc (0xd3 bytes)
__int64 __fastcall SataConfig_11(unsigned __int8 *buf_, __int64 a2, _QWORD *buf, double TempDouble)
{
unsigned __int8 *v5; // rsi
__int64 v6; // rdi
__int64 v7; // rax
__int64 v9; // rcx
__int64 v10; // rax
__int64 v11; // rcx
bool v12; // zf
_DWORD *v13; // rdx
unsigned int v14; // [rsp+30h] [rbp+8h] BYREF
unsigned __int8 *buf_a; // [rsp+38h] [rbp+10h] BYREF
buf_a = buf_; /*0x39ef*/
v5 = &buf_[a2]; /*0x39f3*/
LODWORD(v6) = -1; /*0x39f7*/
v14 = -1; /*0x39fe*/
v7 = Pkcs7ParseSignerInfo((char **)&buf_a, a2, &v14, TempDouble); /*0x3a05*/
if ( v14 ) /*0x3a10*/
return v14; /*0x3a14*/
v12 = buf[11] == 0; /*0x3a19*/
buf[28] = v7; /*0x3a1e*/
if ( !v12 && v7 && *(_QWORD *)(v7 + 464) )
{
v9 = buf[10]; /*0x3a36*/
v10 = v7 + 480; /*0x3a3a*/
if ( v9 && v9 == *(_QWORD *)(v10 + 80) ) /*0x3a49*/
{
v6 = (int)v9; /*0x3a4b*/
v11 = v6; /*0x3a4e*/
v12 = (_DWORD)v6 == 0; /*0x3a51*/
if ( (int)v6 <= 0 ) /*0x3a53*/
goto LABEL_13; /*0x3a53*/
v13 = (_DWORD *)(v10 + 4 * v6); /*0x3a58*/
do /*0x3a73*/
{
if ( *(_DWORD *)((char *)v13 + (_QWORD)buf - v10) != *v13 ) /*0x3a65*/
break; /*0x3a65*/
LODWORD(v6) = v6 - 1; /*0x3a67*/
--v11; /*0x3a69*/
--v13; /*0x3a6c*/
}
while ( v11 > 0 ); /*0x3a73*/
}
v12 = (_DWORD)v6 == 0; /*0x3a75*/
LABEL_13:
if ( !v12 )
DebugLogPrint(1, "PKCS7: Warning. SignerInfo.authAttributes.contenInfoand SignedData.contentInfo Types do not match");
}
SataConfig_4(buf_a, v5 - buf_a, buf, TempDouble); /*0x3a8a*/
return 0; /*0x3aa9*/
}
// Function: Pkcs7ParseAttributeTypeValue @ 0x3ab0 (0x24b bytes)
__int64 __fastcall Pkcs7ParseAttributeTypeValue(unsigned __int8 *buf_, __int64 a2, _QWORD *buf, double TempDouble)
{
unsigned __int8 *v4; // rdi
int v7; // eax
__int64 n16_2; // r9
unsigned __int8 n2_2; // cl
__int64 v10; // rax
unsigned __int8 *bufa_1; // rcx
int v12; // eax
int v13; // eax
__int64 n16_1; // r9
unsigned __int8 n2_3; // cl
int v16; // eax
unsigned __int8 *p_src_1; // rbx
int v18; // eax
int v19; // eax
unsigned __int8 *bufa; // [rsp+20h] [rbp-39h] BYREF
unsigned __int8 n2_1; // [rsp+29h] [rbp-30h]
unsigned int n16; // [rsp+2Ch] [rbp-2Dh]
__int64 v24; // [rsp+30h] [rbp-29h]
unsigned __int8 *buf_1[3]; // [rsp+38h] [rbp-21h] BYREF
unsigned __int64 n4[4]; // [rsp+50h] [rbp-9h] BYREF
unsigned int n2; // [rsp+70h] [rbp+17h]
__int64 n6; // [rsp+A0h] [rbp+47h]
unsigned __int8 *p_src; // [rsp+C0h] [rbp+67h] BYREF
v4 = &buf_[a2]; /*0x3acb*/
if ( (int)SataConfig_7(buf_, a2, &bufa) >= 0 && n2_1 == 2 )
{
v7 = SataConfig_7(bufa, v4 - bufa, &bufa); /*0x3b04*/
n16_2 = n16; /*0x3b09*/
n2_2 = n2_1; /*0x3b0d*/
if ( v7 < 0
|| n2_1
|| n16 != 16
|| (v10 = (unsigned int)v24,
bufa_1 = bufa,
buf[11] = bufa,
buf[12] = v10,
v12 = SataConfig_7(bufa_1, &bufa_1[v10] - buf_, &bufa),
n16_2 = n16,
n2_2 = n2_1,
v12 < 0)
|| n2_1
|| n16 != 16 )
{
DebugLogPrint(1, "PKCS7: Expected SEQUENCE (AttributeTypeAndValue) - found Class %d tag 0x%x", n2_2, n16_2);
}
else
{
v13 = SataConfig_7(&bufa[(unsigned int)v24], v4 - &bufa[(unsigned int)v24], &bufa); /*0x3b7b*/
n16_1 = n16; /*0x3b80*/
n2_3 = n2_1; /*0x3b84*/
if ( v13 < 0
|| n2_1
|| n16 != 16
|| (v16 = SataConfig_7(bufa, (unsigned int)v24, &bufa), n16_1 = n16, n2_3 = n2_1, v16 < 0)
|| n2_1
|| n16 != 16 )
{
DebugLogPrint(1, "PKCS7: Expected SEQUENCE (AlgorithmIdentifier) - found Class %d tag 0x%x", n2_3, n16_1);
}
else
{
p_src_1 = &bufa[(unsigned int)v24]; /*0x3bdd*/
if ( (int)SataConfig_7(bufa, (unsigned int)v24, buf_1) < 0 ) /*0x3be8*/
v18 = -1; /*0x3bfd*/
else
v18 = Asn1ParseOid(n4, &p_src, (__int64)buf_1); /*0x3bf6*/
if ( v18 )
{
DebugLogPrint(1, "PKCS7: Failed to parse digestAlgorithm");
}
else
{
if ( n6 == 6 ) /*0x3c1f*/
v19 = OidIsSha1(n4); /*0x3c25*/
else
v19 = 0; /*0x3c2c*/
if ( v19 || (unsigned int)OidIsNistSha((__int64)n4) && (n2 == 1 || n2 == 2 || n2 == 3) )
{
p_src = p_src_1; /*0x3c72*/
DebugLogPrint(1, "PKCS7: Decrypted Digest ");
return (unsigned int)-((unsigned int)Pkcs7ParseOctetString(&p_src, v4 - p_src_1, buf + 24, buf + 25) != 0); /*0x3ca1*/
}
OidDebugPrint(
n2,
(__int64)"PKCS7: digestAlgorithm SHA1/SHA256/SHA384/SHA512 is expected\n\tOID",
(__int64)n4,
TempDouble);
}
}
}
return 0xFFFFFFFFLL; /*0x3cc1*/
}
else
{
DebugLogPrint(
1,
"PKCS7: Expected ContentInfo.content:ASN1_CLASS_CONTEXT_SPECIFIC (AttributeTypeAndValue) - found Class %d tag 0x%x",
n2_1,
n16);
return 0; /*0x3ce0*/
}
}
// Function: Pkcs7ParseCertificate @ 0x3cfc (0x5d5 bytes)
__int64 __fastcall Pkcs7ParseCertificate(unsigned __int8 *buf_, unsigned __int64 n0x100, _QWORD *buf, double TempDouble)
{
void *buf_1; // rax
void *buf_3; // rsi
unsigned __int8 *v9; // r15
unsigned __int8 *src_1; // rcx
__int64 n13_1; // rax
char *v12; // rdi
int v13; // ebx
unsigned __int8 *p_src_1; // r14
__int64 v15; // rcx
int v16; // eax
int v18; // eax
__int64 n16_1; // r9
__int64 v20; // rcx
char *v21; // r14
int v22; // eax
__int64 v23; // rcx
__int64 v24; // rcx
__int64 v25; // rcx
int v26; // eax
unsigned int n13_2; // eax
unsigned __int8 *v28; // rcx
__int64 v29; // rcx
int v30; // eax
__int64 v31; // rcx
char *PKCS7:_No_INTEGER_tag_found_for_serialNumber__Class_%d_tag_0x%x; // rdx
char *src; // [rsp+20h] [rbp-69h] BYREF
unsigned __int8 n2; // [rsp+29h] [rbp-60h]
unsigned int n16; // [rsp+2Ch] [rbp-5Dh]
__int64 n13; // [rsp+30h] [rbp-59h]
_BYTE buf_2[12]; // [rsp+40h] [rbp-49h] BYREF
int v38; // [rsp+4Ch] [rbp-3Dh]
int n4;... [8794 chars total]
// Function: SataGetInfo @ 0x42d4 (0x819 bytes)
__int64 __fastcall SataGetInfo(unsigned __int8 *SourceData, __int64 n0x100, __int64 a3, double TempDouble)
{
void *buf_1; // rax
__int64 buf_11; // r15
unsigned __int8 *v8; // rsi
int v9; // eax
__int64 v10; // r9
__int64 v11; // rcx
unsigned __int8 *buf_2; // rdi
unsigned __int8 *v13; // r8
int v14; // eax
unsigned __int8 v15; // al
__int64 v16; // rdx
unsigned int n3; // r14d
unsigned __int8 *buf_6; // rcx
int v19; // eax
unsigned __int8 *buf_7; // r12
unsigned __int8 *v21; // r13
__int64 v22; // rcx
int v23; // eax
char *PKCS7:_Certificate_did_not_start_with_a_valid_SEQUENCE___found_; // rdx
__int64 v25; // r8
int v26; // eax
__int64 v27; // rcx
__int64 v28; // rcx
__int64 v29; // r13
unsigned __int8 *buf_9; // rcx
unsigned __int8 *buf_10; // rsi
unsigned __int8 *v32; // r13
__int64 v33; // r12
int v34; // eax
int v35; // eax
__int64 v36; // rcx
unsigned __int64 *v37; // r12
int v38; // eax
bool v39; // cf
char *P... [13337 chars total]
// Function: Pkcs7FindSignerCert @ 0x4af0 (0x102 bytes)
_QWORD *__fastcall Pkcs7FindSignerCert(__int64 Context, __int64 a2, __int64 a3, double TempDouble)
{
__int64 v6; // rbp
_QWORD *v7; // rdi
int v8; // esi
__int64 v9; // rcx
char *PKCS7:_Signing_certificate_found_; // rdx
if ( !Context ) /*0x4b0e*/
return 0; /*0x4b10*/
v6 = *(_QWORD *)(Context + 224); /*0x4b17*/
X509DebugPrintDn(Context, (__int64)"PKCS7: Sign certificate\n\tIssuer", v6 + 8, TempDouble);
v7 = *(_QWORD **)(Context + 216); /*0x4b2e*/
v8 = 0; /*0x4b35*/
if ( !v7 ) /*0x4b3e*/
goto LABEL_10; /*0x4b3e*/
do
{
DebugLogPrint(1, "PKCS7: %2x", v8);
X509DebugPrintDn(v9, (__int64)"\tIssuer", (__int64)(v7 + 17), TempDouble); /*0x4b67*/
if ( (unsigned int)X509NameCompare(v7 + 17, v6 + 8) )
{
DebugLogPrint(1, "PKCS7: Cert chain issuer name mismatch...");
}
else
{
if ( !MemConfig((unsigned __int64)v7 + 20, v6 + 344, *(_QWORD *)(v6 + 368)) ) /*0x4b9f*/
break; /*0x4b9f*/
DebugLogPrint(1, "PKCS7: Cert chain serial number mismatch...");
}
v7 = (_QWORD *)*v7; /*0x4bb0*/
++v8; /*0x4bb3*/
}
while ( v7 );
PKCS7:_Signing_certificate_found_ = "PKCS7: Signing certificate found!";
if ( !v7 )
LABEL_10:
PKCS7:_Signing_certificate_found_ = "PKCS7: Did not find certificate matching Signer Info parameters";
DebugLogPrint(1, PKCS7:_Signing_certificate_found_); /*0x4bd1*/
return v7; /*0x4be8*/
}
// Function: TcgGetInfo @ 0x4bf4 (0x515 bytes)
__int64 TcgGetInfo(_QWORD *Context, char a2, _QWORD *DeriveCtx, __int64 *p_KeyBuffer, ...)
{
double TempDouble; // xmm3_8
__int64 *p_KeyBuffer_1; // r12
__int64 v9; // rdx
__int64 v10; // r8
_DWORD *va_1; // r14
__int64 *DeriveCtx_5; // rax
__int64 *DeriveCtx_2; // r15
int v15; // eax
int n3; // ecx
int va_2; // ebx
__int64 DeriveCtx_1; // rsi
int i; // eax
__int64 v20; // rcx
int va_3; // r9d
__int64 n4; // rcx
void *va_4; // rax
__int64 v24; // rcx
__int64 v25; // rcx
int v26; // r13d
__int64 *DeriveCtx_4; // r13
_QWORD *DeriveCtx_3; // r12
__int64 v29; // rcx
char *PKCS7:_Found_trusted_certificate_match_to_a_leaf_cert; // rdx
char *PKCS7:_Invalid_certificate_signature_within_chain; // rdx
int v32; // [rsp+30h] [rbp-88h]
int i_1; // [rsp+34h] [rbp-84h]
__int64 v34; // [rsp+38h] [rbp-80h]
char ResultBuf[120]; // [rsp+40h] [rbp-78h] BYREF
void *va; // [rsp+E0h] [rbp+28h] BYREF
va_list vaa; // [rsp+E0h] [rbp+28h]
va_list va1;... [8400 chars total]
// Function: Pkcs7ParseDigestAlgorithm @ 0x510c (0xcb bytes)
__int64 __fastcall Pkcs7ParseDigestAlgorithm(__int64 n4, unsigned int *KeyBuffer, void **p_va)
{
int v3; // eax
_BYTE *v4; // rdx
__int64 v5; // rcx
_QWORD *v6; // r8
if ( p_va && KeyBuffer )
{
if ( *(_QWORD *)(n4 + 80) == 6 ) /*0x5127*/
v3 = OidIsSha1((_DWORD *)n4); /*0x5129*/
else
v3 = 0; /*0x5130*/
if ( v3 ) /*0x5134*/
{
*(_BYTE *)KeyBuffer = 0; /*0x5136*/
*p_va = (void *)20; /*0x5139*/
return 0; /*0x51bc*/
}
if ( (unsigned int)OidIsNistSha(n4) ) /*0x5142*/
{
switch ( *(_DWORD *)(v5 + 32) ) /*0x514f*/
{
case 1: /*0x514f*/
*v4 = 1; /*0x5151*/
*v6 = 32; /*0x5154*/
return 0; /*0x515b*/
case 2: /*0x514f*/
*v4 = 2; /*0x5167*/
*v6 = 48; /*0x516a*/
return 0; /*0x5171*/
case 3: /*0x514f*/
*v4 = 3; /*0x517d*/
*v6 = 64; /*0x5180*/
return 0; /*0x5187*/
}
}
if ( *(_QWORD *)(v5 + 80) > 4u /*0x51b8*/
&& *(_DWORD *)v5 == 1
&& *(_DWORD *)(v5 + 4) == 2
&& *(_DWORD *)(v5 + 8) == 840
&& *(_DWORD *)(v5 + 12) == 113549
&& *(_DWORD *)(v5 + 16) == 2 )
{
return 0; /*0x51b8*/
}
DebugLogPrint(1, "PKCS7: Unsupported digestAlgorithm");
}
return 0xFFFFFFFFLL; /*0x51d2*/
}
// Function: Pkcs7HashData @ 0x51d8 (0xd1 bytes)
__int64 __fastcall Pkcs7HashData(__int64 n4, char **InputSize, char *p_n256, char *ResultBuf, va_list va)
{
unsigned int v5; // ebx
v5 = 0; /*0x51e3*/
if ( (_BYTE)n4 ) /*0x51eb*/
{
if ( (unsigned __int8)n4 == 1 ) /*0x51f5*/
{
if ( *va == (void *)32 ) /*0x526b*/
{
GetInfo(1, InputSize, p_n256, ResultBuf); /*0x527e*/
}
else
{
v5 = -1; /*0x526d*/
*va = (void *)32; /*0x5270*/
}
}
else
{
if ( (unsigned __int8)n4 != 2 ) /*0x51fb*/
{
if ( (unsigned __int8)n4 == 3 ) /*0x5201*/
{
if ( *va == (void *)64 ) /*0x5232*/
{
Sha512(1, (char *)InputSize, p_n256, ResultBuf); /*0x5242*/
return v5; /*0x5247*/
}
*va = (void *)512; /*0x5234*/
}
else
{
if ( (unsigned __int8)n4 != 4 ) /*0x5207*/
{
v5 = -1; /*0x5209*/
*va = 0; /*0x520c*/
return v5; /*0x5210*/
}
if ( *va == (void *)16 ) /*0x5219*/
{
GetInfo_4(n4, InputSize, (unsigned int *)p_n256, ResultBuf); /*0x5227*/
return v5; /*0x522c*/
}
*va = (void *)16; /*0x521b*/
}
return (unsigned int)-1; /*0x5225*/
}
if ( *va == (void *)48 ) /*0x524d*/
{
Sha384(1, (char *)InputSize, p_n256, ResultBuf); /*0x5260*/
}
else
{
v5 = -1; /*0x524f*/
*va = (void *)48; /*0x5252*/
}
}
}
else if ( *va == (void *)20 ) /*0x5289*/
{
GetInfo_2(1, (char *)InputSize, p_n256, ResultBuf); /*0x529c*/
}
else
{
v5 = -1; /*0x528b*/
*va = (void *)20; /*0x528e*/
}
return v5; /*0x52a3*/
}
// Function: Pkcs7SignatureCheck @ 0x52ac (0xc1 bytes)
__int64 __fastcall Pkcs7SignatureCheck(_QWORD *Context, __int64 a2, unsigned int *ResultBuf, unsigned __int64 va)
{
__int64 v8; // r10
int n10; // eax
if ( !(unsigned int)OidIsRsa(Context[28] + 976LL) || *(_QWORD *)(v8 + 1056) != 7 || *(_DWORD *)(v8 + 996) != 1 ) /*0x52f9*/
goto LABEL_8; /*0x52f9*/
n10 = *(_DWORD *)(v8 + 1000); /*0x52fb*/
if ( n10 == 10 )
{
DebugLogPrint(1, "PKCS7: RSASSA-PSS signature algorithm");
return SataConfig_8(Context, a2, ResultBuf, va); /*0x5324*/
}
if ( n10 == 1 )
{
DebugLogPrint(1, "PKCS7: Rsa PKCS-1 signature algorithm");
return SataConfig_3(Context, a2, (unsigned __int64)ResultBuf, va); /*0x5342*/
}
else
{
LABEL_8:
DebugLogPrint(1, "PKCS7: Unrecognized signature algorithm");
return 0xFFFFFFFFLL; /*0x5355*/
}
}
// Function: SataConfig_3 @ 0x5370 (0x2a5 bytes)
__int64 __fastcall SataConfig_3(_QWORD *Context, __int64 a2, unsigned __int64 ResultBuf, __int64 va)
{
__int64 v7; // rbx
void *p_va_1; // r14
unsigned __int8 *buf_3; // rdi
void *p_va_2; // rbx
__int64 v11; // rcx
unsigned __int8 *v12; // rsi
int v13; // eax
unsigned __int64 v14; // rbx
int v15; // eax
__int64 v16; // rcx
__int64 n16_1; // rcx
unsigned __int8 *buf; // [rsp+30h] [rbp-59h] BYREF
_BYTE n16[15]; // [rsp+39h] [rbp-50h]
unsigned __int8 *buf_2[3]; // [rsp+48h] [rbp-41h] BYREF
char buf_1[96]; // [rsp+60h] [rbp-29h] BYREF
void *p_va; // [rsp+F0h] [rbp+67h] BYREF
if ( Context )
{
if ( a2 )
{
if ( ResultBuf )
{
v7 = SataConfig_9(*(unsigned __int8 **)(a2 + 904), *(_QWORD *)(a2 + 912)); /*0x53c8*/
if ( v7 )
{
p_va = *(void **)(Context[28] + 1168LL); /*0x53e5*/
p_va_1 = p_va; /*0x53db*/
buf_3 = (unsigned __int8 *)MmgrAlloc((unsigned __int64)p_va); /*0x53ee*/
if ( buf_3 )
{
if ( (int)Pkcs1VerifyPadding(v7, *(unsigned __int8 **)(Context[28] + 1160LL), p_va_1, buf_3, &p_va) >= 0 )
{
BnFree(v7); /*0x5452*/
p_va_2 = p_va; /*0x5457*/
DebugHexdumpFlat(v11, (__int64)"PKCS7: Encrypted Pkcs#1.1 Signature data", (__int64)buf_3, (unsigned __int64)p_va);
if ( (int)SataConfig_7(buf_3, (__int64)p_va_2, &buf) < 0 || n16[0] || *(_DWORD *)&n16[3] != 16 )
{
DebugLogPrint(
1,
"PKCS7: Expected SEQUENCE (DigestInfo) - found Class %d tag 0x%x",
n16[0],
*(unsigned int *)&n16[3]);
}
else if ( (int)SataConfig_7(buf, *(unsigned int *)&n16[7], &buf) < 0 || n16[0] || *(_DWORD *)&n16[3] != 16 )
{
DebugLogPrint(
1,
"PKCS7: Expected SEQUENCE (AlgorithmIdentifier) - found class %d tag 0x%x",
n16[0],
*(unsigned int *)&n16[3]);
}
else
{
v12 = &buf[*(unsigned int *)&n16[7]]; /*0x54d9*/
if ( (int)SataConfig_7(buf, *(unsigned int *)&n16[7], buf_2) < 0 ) /*0x54e4*/
v13 = -1; /*0x54f9*/
else
v13 = Asn1ParseOid((unsigned __int64 *)buf_1, &p_va, (__int64)buf_2); /*0x54f2*/
if ( v13 )
{
DebugLogPrint(1, "PKCS7: Failed to parse digestAlgorithm");
}
else
{
v14 = (unsigned __int64)p_va_2 + (_QWORD)buf_3; /*0x5516*/
v15 = SataConfig_7(v12, v14 - (_QWORD)v12, &buf); /*0x5526*/
LOBYTE(v16) = n16[0]; /*0x552f*/
if ( v15 < 0 || n16[0] || *(_DWORD *)&n16[3] != 4 )
{
DebugLogPrint(
1,
"PKCS7: Expected OCTETSTRING (Digest) - found Class %d tag 0x%x",
n16[0],
*(unsigned int *)&n16[3]);
}
else
{
DebugHexdumpFlat(v16, (__int64)"PKCS7: Decrypted Digest", (__int64)buf, *(unsigned int *)&n16[7]);
n16_1 = *(unsigned int *)&n16[7]; /*0x5560*/
if ( (unsigned __int64)&buf[*(unsigned int *)&n16[7]] >= v14 )
{
if ( *(unsigned int *)&n16[7] == va )
{
if ( !MemConfig((unsigned __int64)buf, ResultBuf, *(unsigned int *)&n16[7]) )
{
GetInfo_7((__int64)buf_3); /*0x5594*/
DebugLogPrint(1, "PKCS7: Certificate Digest matches with calculated hash");
return 0; /*0x55ac*/
}
n16_1 = *(unsigned int *)&n16[7]; /*0x55ae*/
}
DebugHexdumpFlat(n16_1, (__int64)"PKCS7: Calculated hash ", ResultBuf, (unsigned int)n16_1);
DebugLogPrint(1, "PKCS7: Certificate Digest does not match with calculated message hash");
}
else
{
DebugLogPrint(1, "PKCS7: Pkcs#1v1.5 Signature invalid");
}
}
}
}
}
else
{
DebugLogPrint(1, "PKCS7: Failed to decrypt signature");
BnFree(v7); /*0x543d*/
GetInfo_7((__int64)buf_3); /*0x5445*/
}
}
else
{
BnFree(v7); /*0x53f9*/
}
}
}
}
}
return 0xFFFFFFFFLL; /*0x5609*/
}
// Function: SataConfig_8 @ 0x5618 (0x18f bytes)
__int64 __fastcall SataConfig_8(_QWORD *Context, __int64 a2, unsigned int *ResultBuf, unsigned __int64 n8)
{
__int64 HashCtx; // rdi
int p_n0x1B_1; // ebp
void *buf; // rbx
int p_n0x1B_2; // edi
__int64 v12; // rcx
__int64 v13; // rcx
unsigned __int64 n8_1; // r8
unsigned __int64 p_n0x1B; // [rsp+50h] [rbp+8h] BYREF
if ( !Context ) /*0x563f*/
return 0xFFFFFFFFLL; /*0x563f*/
if ( !a2 ) /*0x5644*/
return 0xFFFFFFFFLL; /*0x5644*/
if ( !ResultBuf ) /*0x5649*/
return 0xFFFFFFFFLL; /*0x5649*/
HashCtx = SataConfig_9(*(unsigned __int8 **)(a2 + 904), *(_QWORD *)(a2 + 912)); /*0x565e*/
if ( !HashCtx ) /*0x5664*/
return 0xFFFFFFFFLL; /*0x5664*/
p_n0x1B = *(_QWORD *)(Context[28] + 1168LL); /*0x5677*/
p_n0x1B_1 = p_n0x1B; /*0x566d*/
buf = (void *)MmgrAlloc(p_n0x1B); /*0x5681*/
if ( !buf ) /*0x5687*/
{
BnFree(HashCtx); /*0x568c*/
return 0xFFFFFFFFLL; /*0x5691*/
}
if ( (int)GetInfo_0(*(unsigned __int8 **)(Context[28] + 1160LL), p_n0x1B_1, buf, &p_n0x1B, HashCtx) < 0 )
{
DebugLogPrint(1, "PKCS7: Failed to decrypt signature");
BnFree(HashCtx); /*0x56e8*/
LABEL_10:
GetInfo_7((__int64)buf); /*0x56ed*/
return 0xFFFFFFFFLL; /*0x56f5*/
}
BnFree(HashCtx); /*0x56fa*/
p_n0x1B_2 = p_n0x1B; /*0x56ff*/
DebugHexdumpFlat(v12, (__int64)"PKCS7: Encrypted PSS Signature data ", (__int64)buf, p_n0x1B);
DebugHexdumpFlat(v13, (__int64)"PKCS7: Calculated hash ", (__int64)ResultBuf, n8);
n8_1 = *(_QWORD *)(Context[28] + 1152LL); /*0x572f*/
if ( n8_1 > n8 )
{
DebugLogPrint(1, "PKCS7: PSS Saltlen exceed HashLen length %u (> %u)", n8_1, n8);
goto LABEL_10; /*0x574f*/
}
if ( (unsigned int)RsaPssVerify(ResultBuf, n8, (char *)buf, p_n0x1B_2, n8_1, 8 * p_n0x1B_2) )
{
DebugLogPrint(1, "PKCS7: Failed to verify PSS signature");
goto LABEL_10; /*0x5787*/
}
DebugLogPrint(1, "PKCS7: PSS Certificate Digest matches with calculated hash");
GetInfo_7((__int64)buf); /*0x579b*/
return 0; /*0x56a3*/
}
// Function: SataConfig_2 @ 0x57a8 (0x318 bytes)
__int64 __fastcall SataConfig_2(_QWORD *Context, __int64 Unused, unsigned int *KeyBuffer, void *va)
{
double TempDouble; // xmm3_8
void *p_va_1; // rsi
char KeyBuffera_1; // r13
__int64 v10; // rdx
__int64 v11; // r8
__int64 n4; // rcx
int v14; // eax
__int64 *v15; // r12
unsigned __int64 v16; // rdx
__int64 v17; // rcx
__int64 v18; // rcx
__int64 v19; // rax
unsigned __int64 v20; // rdx
__int64 v21; // rcx
__int64 v22; // rcx
unsigned int *ResultBuf_1; // r14
_QWORD *v24; // rax
char ResultBuf[64]; // [rsp+30h] [rbp-40h] BYREF
void *p_va; // [rsp+B0h] [rbp+40h] BYREF
__int64 KeyBuffera; // [rsp+B8h] [rbp+48h] BYREF
KeyBuffera = Unused; /*0x57ad*/
p_va_1 = 0; /*0x57c4*/
p_va = 0; /*0x57d0*/
KeyBuffera_1 = 0; /*0x57d4*/
LOBYTE(KeyBuffera) = 0; /*0x57dd*/
DebugLogPrint(1, "PKCS7: validate Authenticode encrypted certificate...");
if ( !Context ) /*0x57ec*/
return 0xFFFFFFFFLL; /*0x57f1*/
n4 = Context[28] + 376LL; /*0x5800*/
if ( Context[28] == -376 ) /*0x5807*/
{
v14 = -1; /*0x5820*/
}
else
{
v14 = Pkcs7ParseDigestAlgorithm(n4, (unsigned int *)&KeyBuffera, &p_va); /*0x5811*/
KeyBuffera_1 = KeyBuffera; /*0x5816*/
p_va_1 = p_va; /*0x581a*/
}
if ( v14 ) /*0x5824*/
return 0xFFFFFFFFLL; /*0x5824*/
v15 = Context + 11; /*0x582d*/
if ( Context[11] )
{
v16 = Context[24]; /*0x583c*/
if ( v16 && KeyBuffer && va )
{
if ( va == (void *)Context[25] )
{
if ( MemConfig((unsigned __int64)KeyBuffer, v16, (__int64)va) )
{
DebugHexdumpFlat(n4, (__int64)"PKCS7: contentInfo.Digest", Context[24], Context[25]);
DebugHexdumpFlat(v17, (__int64)"PKCS7: Input block ", (__int64)KeyBuffer, (unsigned __int64)va);
DebugLogPrint(1, "PKCS7: contentInfo.Digest does not match with calculated message hash");
return 0xFFFFFFFFLL; /*0x58b3*/
}
}
else
{
if ( va != (void *)Context[12] )
{
DebugLogPrint(1, "PKCS7: SpcIndirectData size not matching the size of input block");
return 0xFFFFFFFFLL; /*0x590d*/
}
if ( MemConfig((unsigned __int64)KeyBuffer, *v15, (__int64)va) )
{
DebugHexdumpFlat(n4, (__int64)"PKCS7: SpcIndirectData", *v15, Context[12]);
DebugHexdumpFlat(v18, (__int64)"PKCS7: Input block ", (__int64)KeyBuffer, (unsigned __int64)va);
DebugLogPrint(1, "PKCS7: SpcIndirectData does not match with input data");
return 0xFFFFFFFFLL; /*0x5904*/
}
}
}
LOBYTE(n4) = KeyBuffera_1; /*0x5923*/
if ( !(unsigned int)Pkcs7HashData(n4, (char **)Context + 11, (char *)Context + 96, ResultBuf, &p_va) ) /*0x5926*/
{
p_va_1 = p_va; /*0x5933*/
goto LABEL_22; /*0x5933*/
}
return 0xFFFFFFFFLL; /*0x5828*/
}
LABEL_22:
v19 = Context[28]; /*0x5937*/
if ( *(_QWORD *)(v19 + 464) )
{
v20 = *(_QWORD *)(v19 + 568); /*0x594c*/
if ( !v20 )
{
DebugLogPrint(1, "PKCS7: SignerInfo.authAttributes.messageDigest must be present in SignerInfo.authAttributes block");
return 0xFFFFFFFFLL; /*0x595f*/
}
if ( *v15 )
{
if ( MemConfig((unsigned __int64)ResultBuf, v20, (__int64)p_va_1) )
{
DebugHexdumpFlat(
n4,
(__int64)"PKCS7: AuthAttrib.messageDigest ",
*(_QWORD *)(Context[28] + 568LL),
*(_QWORD *)(Context[28] + 576LL));
DebugHexdumpFlat(v21, (__int64)"PKCS7: ContentInfo digest\t", (__int64)ResultBuf, (unsigned __int64)p_va_1);
DebugLogPrint(1, "PKCS7: SignerInfo.authAttributes.messageDigest does not match with contentInfo digest");
return 0xFFFFFFFFLL; /*0x59bb*/
}
}
else if ( KeyBuffer && va == p_va_1 && MemConfig((unsigned __int64)KeyBuffer, v20, (__int64)va) )
{
DebugHexdumpFlat(
n4,
(__int64)"PKCS7: AuthAttrib.messageDigest ",
*(_QWORD *)(Context[28] + 568LL),
*(_QWORD *)(Context[28] + 576LL));
DebugHexdumpFlat(v22, (__int64)"PKCS7: Input block\t\t", (__int64)KeyBuffer, (unsigned __int64)va);
DebugLogPrint(1, "PKCS7: SignerInfo.authAttributes.messageDigest does not match with input data");
return 0xFFFFFFFFLL; /*0x5a14*/
}
LOBYTE(n4) = KeyBuffera_1; /*0x5a2d*/
if ( (unsigned int)Pkcs7HashData(n4, (char **)(Context[28] + 464LL), (char *)(Context[28] + 472LL), ResultBuf, &p_va) ) /*0x5a3e*/
return 0xFFFFFFFFLL; /*0x5a45*/
p_va_1 = p_va; /*0x5a4b*/
}
if ( *v15 || *(_QWORD *)(Context[28] + 464LL) )
{
ResultBuf_1 = (unsigned int *)ResultBuf; /*0x5a82*/
}
else
{
if ( !KeyBuffer || va != p_va_1 )
{
DebugLogPrint(1, "PKCS7: Missing the Digest source");
return 0xFFFFFFFFLL; /*0x5a7d*/
}
ResultBuf_1 = KeyBuffer; /*0x5a71*/
}
v24 = Pkcs7FindSignerCert((__int64)Context, v10, v11, TempDouble); /*0x5a89*/
if ( !v24 ) /*0x5a91*/
return 0xFFFFFFFFLL; /*0x5a91*/
return Pkcs7SignatureCheck(Context, (__int64)v24, ResultBuf_1, (unsigned __int64)p_va_1); /*0x5ab0*/
}
// Function: Pkcs7ValidateTimestamp @ 0x5ac0 (0x16a bytes)
__int64 Pkcs7ValidateTimestamp(__int64 Unused2, _DWORD *p_n256, ...)
{
_QWORD *Context; // rdi
char KeyBuffer_1; // si
__int64 n4; // rcx
int v6; // eax
__int64 v7; // rcx
__int64 Unused; // rdx
char ResultBuf[64]; // [rsp+30h] [rbp-48h] BYREF
__int64 KeyBuffer; // [rsp+80h] [rbp+8h] BYREF
void *p_va; // [rsp+90h] [rbp+18h] BYREF
va_list p_vaa; // [rsp+90h] [rbp+18h]
va_list va1; // [rsp+98h] [rbp+20h] BYREF
va_start(va1, p_n256);
va_start(p_vaa, p_n256);
va_arg(va1, _QWORD); /*0x5ac0*/
KeyBuffer = Unused2; /*0x5acb*/
Context = Context; /*0x5ad5*/
p_va = 0; /*0x5adf*/
KeyBuffer_1 = 0; /*0x5aeb*/
LOBYTE(KeyBuffer) = 0; /*0x5af3*/
DebugLogPrint(1, "PKCS7: validate TimeStamp encrypted certificate...");
if ( Context && p_n256 )
{
if ( Context[29] && Context[26] )
{
DebugLogPrint(1, "PKCS7: tst TimeStamp certificate validate...");
n4 = Context[28] + 376LL; /*0x5b42*/
if ( Context[28] == -376 ) /*0x5b49*/
{
v6 = -1; /*0x5b6a*/
}
else
{
v6 = Pkcs7ParseDigestAlgorithm(n4, (unsigned int *)&KeyBuffer, p_vaa); /*0x5b5b*/
KeyBuffer_1 = KeyBuffer; /*0x5b60*/
}
if ( !v6 )
{
LOBYTE(n4) = KeyBuffer_1; /*0x5b8e*/
if ( !(unsigned int)Pkcs7HashData(
n4,
(char **)(Context[28] + 1160LL),
(char *)(Context[28] + 1168LL),
ResultBuf,
p_vaa) )
{
v7 = Context[26]; /*0x5ba8*/
if ( p_va == *(void **)(v7 + 576) /*0x5bcc*/
&& !MemConfig(*(_QWORD *)(v7 + 568), (unsigned __int64)ResultBuf, (__int64)p_va) )
{
*p_n256 = *(_DWORD *)(Context[26] + 584LL); /*0x5be9*/
return SataConfig_2((_QWORD *)Context[29], Unused, 0, 0); /*0x5bf8*/
}
DebugLogPrint(1, "PKCS7: TimeStamp messageDigest does not match with hash of signature in encryptedDigest");
}
}
}
else
{
DebugLogPrint(1, "PKCS7: TimeStamp certificate not detected...");
}
}
return 0xFFFFFFFFLL; /*0x5c24*/
}
// Function: RsaParsePublicKey @ 0x5c2c (0xd9 bytes)
__int64 __fastcall RsaParsePublicKey(_QWORD *HashCtx, unsigned __int8 **p_KeyBuffer, __int64 *p_n256)
{
__int64 v5; // rcx
unsigned __int8 *buf; // [rsp+20h] [rbp-28h] BYREF
unsigned __int8 v8; // [rsp+29h] [rbp-1Fh]
unsigned int n2; // [rsp+2Ch] [rbp-1Ch]
__int64 v10; // [rsp+30h] [rbp-18h]
if ( HashCtx && p_KeyBuffer && p_n256 )
{
if ( (int)SataConfig_7((unsigned __int8 *)HashCtx[113], HashCtx[114], &buf) < 0 || v8 || n2 != 16 )
{
DebugLogPrint(1, "RSA: Expected SEQUENCE (public key) - found Class %d tag 0x%x", v8, n2);
}
else if ( (int)SataConfig_7(buf, (unsigned int)v10, &buf) < 0 || v8 || n2 != 2 )
{
DebugLogPrint(1, "RSA: Expected INTEGER - found Class %d tag 0x%x", v8, n2);
}
else
{
v5 = (unsigned int)v10; /*0x5cb5*/
*p_KeyBuffer = buf; /*0x5cb9*/
*p_n256 = v5; /*0x5cbc*/
if ( **p_KeyBuffer ) /*0x5cc2*/
return 0; /*0x5cd7*/
if ( (v5 & 1) != 0 ) /*0x5cca*/
{
++*p_KeyBuffer; /*0x5ccf*/
--*p_n256; /*0x5cd2*/
return 0; /*0x5cd2*/
}
}
}
return 0xFFFFFFFFLL; /*0x5cff*/
}
// Function: GetInfo_8 @ 0x5d08 (0x8c bytes)
__int64 __fastcall GetInfo_8(_QWORD *Context, unsigned int **p_KeyBuffer, void **p_n256, _QWORD *a4, void **p_p_va)
{
__int64 result; // rax
int v10; // [rsp+40h] [rbp+8h] BYREF
result = 0; /*0x5d1d*/
v10 = 0; /*0x5d22*/
if ( !Context[32] ) /*0x5d2f*/
result = TcgGetInfo(Context, 0, 0, 0, &v10); /*0x5d48*/
*p_n256 = (void *)Context[33]; /*0x5d54*/
*p_p_va = (void *)Context[35]; /*0x5d63*/
if ( !(_DWORD)result ) /*0x5d68*/
{
*p_KeyBuffer = (unsigned int *)Context[32]; /*0x5d71*/
*a4 = Context[34]; /*0x5d7b*/
}
return result; /*0x5d8d*/
}
// Function: GetInfo_1 @ 0x5d94 (0x17c bytes)
__int64 __fastcall GetInfo_1(__int64 Dummy, char a2, char **p_KeyBuffer, _QWORD *p_n256)
{
double TempDouble; // xmm3_8
_QWORD *Context; // rdi
char v8; // r13
unsigned int v9; // ebx
__int64 *v11; // rdi
char *src; // rsi
char *src_1; // r14
unsigned int count_1; // ebp
int v15; // eax
__int64 v16; // rcx
__int64 count; // r13
char *dst; // rax
int v19; // eax
int v20; // [rsp+70h] [rbp+8h] BYREF
int v21; // [rsp+74h] [rbp+Ch]
char v22; // [rsp+78h] [rbp+10h]
v22 = a2; /*0x5d9b*/
v21 = HIDWORD(Dummy); /*0x5d9e*/
Context = Context; /*0x5db1*/
v20 = 0; /*0x5dbb*/
v8 = a2; /*0x5dc2*/
if ( !Context || !p_KeyBuffer || !p_n256 ) /*0x5dda*/
return 0xFFFFFFFFLL; /*0x5ef5*/
v9 = -1; /*0x5df9*/
if ( (unsigned int)TcgGetInfo(Context, 0, 0, 0, &v20) == -1 ) /*0x5dfe*/
return v9; /*0x5dfe*/
v11 = (__int64 *)Context[27]; /*0x5e07*/
src = 0; /*0x5e0e*/
src_1 = 0; /*0x5e10*/
count_1 = 1; /*0x5e13*/
v15 = 1; /*0x5e16*/
v20 = 1; /*0x5e18*/
if ( !v11 ) /*0x5e1f*/
return v9; /*0x5e1f*/
do
{
DebugLogPrint(1, "PKCS7: %2x: Chain Cert(%x)", v15, v11[1]);
X509DebugPrintDn(v16, (__int64)"\tSubject", (__int64)(v11 + 59), TempDouble); /*0x5e47*/
if ( v8 ) /*0x5e4f*/
{
if ( !v11[1] ) /*0x5e51*/
goto LABEL_9; /*0x5e56*/
}
else if ( v11[1] ) /*0x5e86*/
{
LABEL_9:
v15 = v20; /*0x5e58*/
goto LABEL_10; /*0x5e58*/
}
count = count_1; /*0x5e8d*/
src = src_1; /*0x5e90*/
count_1 += 12; /*0x5e93*/
dst = (char *)MmgrAlloc(count_1); /*0x5e98*/
src_1 = dst; /*0x5e9d*/
if ( !dst ) /*0x5ea3*/
goto LABEL_13; /*0x5ea3*/
if ( src ) /*0x5ea8*/
{
if ( (_DWORD)count ) /*0x5eb0*/
MemConfig_0(dst, src, (unsigned int)count); /*0x5eb8*/
GetInfo_7((__int64)src); /*0x5ec0*/
src = 0; /*0x5ec5*/
}
*(_DWORD *)&src_1[count] = *((_DWORD *)v11 + 264); /*0x5ecd*/
*(_QWORD *)&src_1[count + 4] = v11[131]; /*0x5ed9*/
v19 = v20; /*0x5ede*/
v8 = v22; /*0x5ee2*/
*src_1 = v20; /*0x5ee7*/
v15 = v19 + 1; /*0x5eea*/
v20 = v15; /*0x5eec*/
LABEL_10:
v11 = (__int64 *)*v11; /*0x5e5c*/
}
while ( v11 );
if ( src_1 ) /*0x5e67*/
{
v9 = 0; /*0x5e6b*/
*p_KeyBuffer = src_1; /*0x5e6d*/
*p_n256 = count_1; /*0x5e71*/
}
LABEL_13:
if ( src ) /*0x5e77*/
GetInfo_7((__int64)src); /*0x5e7c*/
return v9; /*0x5f00*/
}
// Function: GetInfo @ 0x5f10 (0x27a bytes)
void *__fastcall GetInfo(__int64 n3, char **InputSize, char *p_n256, _BYTE *ResultBuf)
{
unsigned int n64; // r10d
_BYTE *ResultBuf_1; // rdi
char **InputSize_1; // r14
__int64 n8; // rbx
__int64 n3_1; // r12
__int64 v9; // r13
unsigned int n0x40; // ebx
char *src; // rsi
unsigned int count; // edi
__int64 i; // rax
bool v14; // cf
_BYTE *v15; // rdx
int v16; // ecx
__int64 buf; // [rsp+20h] [rbp-49h] BYREF
int n1779033703; // [rsp+28h] [rbp-41h]
int v20; // [rsp+2Ch] [rbp-3Dh]
int n1013904242; // [rsp+30h] [rbp-39h]
int v22; // [rsp+34h] [rbp-35h]
int n1359893119; // [rsp+38h] [rbp-31h]
int v24; // [rsp+3Ch] [rbp-2Dh]
int n528734635; // [rsp+40h] [rbp-29h]
__int64 n1541459225; // [rsp+44h] [rbp-25h]
char dst[84]; // [rsp+4Ch] [rbp-1Dh] BYREF
n64 = 0; /*0x5f37*/
n1541459225 = 1541459225; /*0x5f3a*/
buf = 0; /*0x5f42*/
ResultBuf_1 = ResultBuf; /*0x5f46*/
n1779033703 = 1779033703; /*0x5f49*/
v20 = -1150833019; /*0x5f53*/
InputSize_1 = InputSize; /*0x5f5a*/
n1013904242 = 1013904242; /*0x5f5d*/
n8 = 8; /*0x5f64*/
v22 = -1521486534; /*0x5f68*/
n3_1 = n3; /*0x5f6f*/
n1359893119 = 1359893119; /*0x5f72*/
v24 = -1694144372; /*0x5f79*/
n528734635 = 528734635; /*0x5f80*/
if ( !n3 ) /*0x5f8a*/
{
LABEL_20:
buf += 8 * n64; /*0x6078*/
dst[n64] = 0x80; /*0x6085*/
i = (unsigned int)(HIDWORD(n1541459225) + 1); /*0x608d*/
HIDWORD(n1541459225) = i; /*0x608f*/
v14 = (unsigned int)i < 0x38; /*0x6092*/
if ( (unsigned int)i <= 0x38 ) /*0x6095*/
goto LABEL_27; /*0x6095*/
while ( (unsigned int)i < 0x40 ) /*0x60a9*/
{
dst[i] = 0; /*0x6099*/
i = (unsigned int)++HIDWORD(n1541459225); /*0x60a1*/
}
Sha256Transform(&buf, dst); /*0x60b3*/
for ( i = 0; ; i = (unsigned int)(HIDWORD(n1541459225) + 1) ) /*0x60b8*/
{
v14 = (unsigned int)i < 0x38; /*0x60c6*/
HIDWORD(n1541459225) = i; /*0x60c9*/
LABEL_27:
if ( !v14 ) /*0x60cc*/
break; /*0x60cc*/
dst[i] = 0; /*0x60bc*/
}
dst[56] = HIBYTE(buf); /*0x60dd*/
dst[57] = BYTE6(buf); /*0x60e7*/
dst[58] = BYTE5(buf); /*0x60f1*/
dst[59] = BYTE4(buf); /*0x60fb*/
dst[60] = BYTE3(buf); /*0x6105*/
dst[61] = BYTE2(buf); /*0x6113*/
dst[62] = BYTE1(buf); /*0x6119*/
dst[63] = buf; /*0x6120*/
Sha256Transform(&buf, dst); /*0x6123*/
v15 = ResultBuf_1 + 2; /*0x612f*/
do /*0x6159*/
{
v16 = *(_DWORD *)&v15[(char *)&buf + 6 - ResultBuf_1]; /*0x6133*/
*(v15 - 2) = HIBYTE(v16); /*0x613c*/
*(v15 - 1) = BYTE2(v16); /*0x6144*/
*v15 = BYTE1(v16); /*0x614c*/
v15[1] = v16; /*0x614e*/
v15 += 4; /*0x6151*/
--n8; /*0x6155*/
}
while ( n8 ); /*0x6159*/
return MemGetInfo(&buf, 0x70u); /*0x6159*/
}
v9 = p_n256 - (char *)InputSize; /*0x5f90*/
do /*0x6064*/
{
n0x40 = *(_DWORD *)((char *)InputSize_1 + v9); /*0x5f93*/
src = *InputSize_1; /*0x5f97*/
if ( n64 < 0x40 ) /*0x5f9e*/
{
while ( n0x40 ) /*0x5fa6*/
{
if ( n64 || n0x40 < 0x40 ) /*0x5fb4*/
{
count = 64 - n64; /*0x5ff1*/
if ( n0x40 < 64 - n64 ) /*0x5ff6*/
count = n0x40; /*0x5ff6*/
if ( count ) /*0x5ffe*/
{
MemConfig_0(&dst[n64], src, count); /*0x6010*/
n64 = HIDWORD(n1541459225); /*0x6015*/
}
n64 += count; /*0x6019*/
src += count; /*0x601c*/
n0x40 -= count; /*0x601f*/
HIDWORD(n1541459225) = n64; /*0x6021*/
if ( n64 == 64 ) /*0x6029*/
{
if ( (int)Sha256Transform(&buf, dst) < 0 ) /*0x603e*/
{
LABEL_16:
n64 = HIDWORD(n1541459225); /*0x6054*/
break; /*0x6054*/
}
buf += 512; /*0x6040*/
n64 = 0; /*0x6048*/
HIDWORD(n1541459225) = 0; /*0x604b*/
}
}
else
{
MemConfig_0(dst, src, 0x40u); /*0x5fc1*/
if ( (int)Sha256Transform(&buf, dst) < 0 ) /*0x5fd5*/
goto LABEL_16; /*0x5fd5*/
buf += 512; /*0x5fd7*/
src += 64; /*0x5fdf*/
n64 = HIDWORD(n1541459225); /*0x5fe3*/
n0x40 -= 64; /*0x5fe7*/
}
}
}
n8 = 8; /*0x6058*/
++InputSize_1; /*0x605d*/
--n3_1; /*0x6060*/
}
while ( n3_1 ); /*0x6064*/
if ( n64 < 0x40 ) /*0x606e*/
{
ResultBuf_1 = ResultBuf; /*0x6074*/
goto LABEL_20; /*0x6074*/
}
return MemGetInfo(&buf, 0x70u); /*0x617d*/
}
// Function: Sha256Transform @ 0x618c (0x1ea bytes)
__int64 __fastcall Sha256Transform(__int64 *p_buf, char *dst)
{
__int64 *v2; // r9
__int128 v4; // xmm1
char *v5; // r8
__int64 v6; // r10
__int64 n16; // rdx
int v8; // eax
int v9; // ecx
unsigned int *v10; // r10
__int64 n48; // r11
unsigned int v12; // ecx
unsigned int v13; // edx
unsigned int v14; // ecx
__int64 n64; // rdi
unsigned int v16; // esi
unsigned int v17; // r12d
unsigned int v18; // r11d
unsigned int v19; // r14d
unsigned int v20; // r13d
int v21; // r15d
int v22; // r10d
int v23; // r8d
unsigned int v24; // r8d
int v25; // edx
__int64 n8; // rdx
__int128 v28; // [rsp+0h] [rbp-100h] BYREF
__int128 v29; // [rsp+10h] [rbp-F0h]
_DWORD v30[14]; // [rsp+20h] [rbp-E0h] BYREF
char v31; // [rsp+58h] [rbp-A8h] BYREF
v2 = p_buf + 1; /*0x61af*/
v4 = *(_OWORD *)(p_buf + 3); /*0x61bf*/
v5 = dst + 2; /*0x61c4*/
v6 = (char *)v30 - dst; /*0x61c8*/
v28 = *(_OWORD *)(p_buf + 1); /*0x61cb*/
n16 = 16; /*0x61cf*/
v29 = v4; /*0x61d4*/
do /*0x6208*/
{
v8 = (unsigned __int8)*v5; /*0x61d9*/
v9 = (unsigned __int8)*(v5 - 1); /*0x61dd*/
v5 += 4; /*0x61e2*/
*(_DWORD *)&v5[v6 - 6] = (unsigned __int8)*(v5 - 3) | ((unsigned __int8)*(v5 - 6) << 24) | ((v8 | (v9 << 8)) << 8); /*0x61ff*/
--n16; /*0x6204*/
}
while ( n16 ); /*0x6208*/
v10 = (unsigned int *)&v31; /*0x620a*/
n48 = 48; /*0x620f*/
do /*0x6257*/
{
v12 = *(v10 - 13); /*0x6213*/
v13 = *v10++; /*0x621a*/
v10[1] = *(v10 - 6) /*0x624f*/
+ *(v10 - 15)
+ ((v13 >> 10) ^ __ROL4__(v13, 13) ^ __ROL4__(v13, 15))
+ ((v12 >> 3) ^ __ROR4__(v12, 7) ^ __ROL4__(v12, 14));
--n48; /*0x6253*/
}
while ( n48 ); /*0x6257*/
v14 = HIDWORD(v29); /*0x6259*/
n64 = 0; /*0x625d*/
v16 = DWORD2(v29); /*0x625f*/
v17 = DWORD1(v29); /*0x6263*/
v18 = v29; /*0x6268*/
v19 = HIDWORD(v28); /*0x626d*/
v20 = DWORD2(v28); /*0x6272*/
v21 = DWORD1(v28); /*0x6277*/
v22 = v28; /*0x627c*/
do /*0x630b*/
{
v23 = v30[n64] /*0x62bd*/
+ *(_DWORD *)((char *)&unk_123B0 + n64 * 4)
+ (v16 ^ v18 & (v16 ^ v17))
+ (__ROR4__(v18, 6) ^ __ROL4__(v18, 7) ^ __ROR4__(v18, 11));
++n64; /*0x62c2*/
v24 = v14 + v23; /*0x62c6*/
v14 = v16; /*0x62eb*/
v25 = v24 + (__ROR4__(v22, 2) ^ __ROL4__(v22, 10) ^ __ROR4__(v22, 13)) + (v22 & v21 | v20 & (v22 | v21)); /*0x62ed*/
v16 = v17; /*0x62ef*/
v17 = v18; /*0x62f2*/
v18 = v24 + v19; /*0x62f5*/
v19 = v20; /*0x62f8*/
v20 = v21; /*0x62fb*/
v21 = v22; /*0x62fe*/
v22 = v25; /*0x6301*/
}
while ( n64 < 64 ); /*0x630b*/
*(_QWORD *)&v28 = __PAIR64__(v21, v25); /*0x6319*/
*(_QWORD *)&v29 = __PAIR64__(v17, v18); /*0x631f*/
n8 = 8; /*0x6324*/
*((_QWORD *)&v29 + 1) = __PAIR64__(v14, v16); /*0x6329*/
*((_QWORD *)&v28 + 1) = __PAIR64__(v19, v20); /*0x633c*/
do /*0x6351*/
{
*(_DWORD *)v2 += *(_DWORD *)((char *)v2 + (char *)&v28 - (char *)p_buf - 8); /*0x6346*/
v2 = (__int64 *)((char *)v2 + 4); /*0x6349*/
--n8; /*0x634d*/
}
while ( n8 ); /*0x6351*/
return 0; /*0x6369*/
}
// Function: BnDecodeInteger @ 0x6378 (0x103 bytes)
unsigned __int8 *__fastcall BnDecodeInteger(unsigned __int8 *buf_, __int64 a2, __int64 a3)
{
double v3; // xmm2_8
int v5; // edi
unsigned __int8 *buf_1; // rsi
int v7; // eax
unsigned __int8 *buf; // [rsp+20h] [rbp-28h] BYREF
unsigned __int8 v10; // [rsp+29h] [rbp-1Fh]
int n2; // [rsp+2Ch] [rbp-1Ch]
int v12; // [rsp+30h] [rbp-18h]
if ( !buf_ ) /*0x638d*/
return 0; /*0x638d*/
if ( (int)SataConfig_7(buf_, a2 - (_QWORD)buf_, &buf) < 0 || v10 || n2 != 2 )
{
DebugLogPrint(1, "RSA: Expected INTEGER - found class %d tag 0x%x", v10, n2);
return 0; /*0x6464*/
}
v5 = v12; /*0x63c7*/
buf_1 = buf; /*0x63cb*/
if ( *(int *)(a3 + 4) < 2 && (unsigned int)BnResize(a3, 2) )
{
LABEL_12:
DebugLogPrint(1, "BIGNUM: %a failed", v3);
DebugLogPrint(1, "RSA: Failed to parse INTEGER");
return 0; /*0x6469*/
}
BnClear(a3); /*0x63e4*/
while ( v5 > 0 ) /*0x6411*/
{
--v5; /*0x63f3*/
if ( (unsigned int)BnLshiftBits(a3, 8, a3) ) /*0x63f5*/
goto LABEL_12; /*0x63fc*/
v7 = *buf_1++; /*0x63fe*/
**(_DWORD **)(a3 + 16) |= v7; /*0x6408*/
++*(_DWORD *)a3; /*0x640a*/
}
BnTrim(a3); /*0x6413*/
return &buf[v12]; /*0x6475*/
}
// Function: GetInfo_0 @ 0x647c (0x208 bytes)
__int64 __fastcall GetInfo_0(
unsigned __int8 *Signature,
int n0x1B,
void *buf,
unsigned __int64 *p_n0x1B,
__int64 HashCtx)
{
double v5; // xmm2_8
unsigned int v10; // ebp
unsigned __int64 v11; // rax
__int64 v12; // rbx
int v13; // eax
__int64 v14; // r10
int v15; // eax
__int64 v16; // rdx
__int64 v17; // rcx
int *v18; // rdx
int v20; // eax
int n0x1B_1; // ecx
unsigned __int64 count; // rdi
int v23; // eax
int v24; // eax
v10 = -1; /*0x64a0*/
v11 = BnAllocNew(); /*0x64a3*/
v12 = v11; /*0x64a8*/
if ( !v11 ) /*0x64ae*/
return v10; /*0x64ae*/
if ( *(int *)(v11 + 4) < 2 && (unsigned int)BnResize(v11, 2) ) /*0x64bf*/
goto LABEL_29; /*0x64c6*/
BnClear(v12); /*0x64cf*/
while ( n0x1B > 0 ) /*0x6500*/
{
--n0x1B; /*0x64de*/
if ( (unsigned int)BnLshiftBits(v12, 8, v12) ) /*0x64e0*/
goto LABEL_29; /*0x64e7*/
v13 = *Signature++; /*0x64ed*/
**(_DWORD **)(v12 + 16) |= v13; /*0x64f7*/
++*(_DWORD *)v12; /*0x64f9*/
}
BnTrim(v12); /*0x6502*/
v14 = *(_QWORD *)(HashCtx + 8); /*0x6516*/
v15 = *(_DWORD *)(v14 + 8); /*0x651a*/
if ( v15 == *(_DWORD *)(v12 + 8) )
{
if ( v15 == 1 ) /*0x6531*/
{
v16 = *(_QWORD *)(HashCtx + 8); /*0x6533*/
v17 = v12; /*0x6536*/
}
else
{
v16 = v12; /*0x653b*/
v17 = *(_QWORD *)(HashCtx + 8); /*0x653e*/
}
if ( (int)BnCmp(v17, v16) >= 0 ) /*0x6548*/
goto LABEL_15; /*0x6548*/
}
else if ( v15 != 1 )
{
LABEL_15:
v18 = *(int **)(HashCtx + 16); /*0x654e*/
if ( *(_DWORD *)(v14 + 8) != 1
&& v18[2] != 1
&& !(*(int *)v14 > 0 && (**(_BYTE **)(v14 + 16) & 1) != 0
? BnMul((int *)v12, v18, v14, (__int128 *)v12)
: (unsigned int)BnSqr((_DWORD *)v12, v18, (int *)v14, (__int128 *)v12)) )
{
v20 = BnNumBits(*(int **)(HashCtx + 8)); /*0x65a0*/
n0x1B_1 = v20 / 8 + ((v20 & 7) != 0); /*0x65bb*/
count = n0x1B_1; /*0x65bd*/
if ( n0x1B_1 > *p_n0x1B ) /*0x65c3*/
{
*p_n0x1B = n0x1B_1; /*0x65c5*/
goto LABEL_30; /*0x65c8*/
}
v23 = BnNumBits((int *)v12); /*0x65d0*/
if ( ((v23 & 7) != 0) + v23 / 8 > count ) /*0x65ef*/
goto LABEL_30; /*0x65ef*/
*p_n0x1B = count; /*0x65f1*/
if ( count ) /*0x65f7*/
MemGetInfo(buf, count); /*0x65ff*/
v24 = BnNumBits((int *)v12); /*0x6607*/
if ( !(unsigned int)BnToBytes(v12, (__int64)buf + count - (((v24 & 7) != 0) + v24 / 8)) ) /*0x662d*/
{
v10 = 0; /*0x6636*/
goto LABEL_30; /*0x6638*/
}
}
LABEL_29:
DebugLogPrint(1, "BIGNUM: %a failed", v5);
}
LABEL_30:
if ( *(_QWORD *)(v12 + 16) ) /*0x6652*/
BnFreeWords(v12); /*0x665c*/
GetInfo_7(v12); /*0x6664*/
return v10; /*0x667a*/
}
// Function: BnFree @ 0x6684 (0x65 bytes)
unsigned __int64 __fastcall BnFree(__int64 a1)
{
__int64 v1; // rbx
__int64 v3; // rbx
unsigned __int64 result; // rax
if ( a1 ) /*0x6687*/
{
v1 = *(_QWORD *)(a1 + 8); /*0x6693*/
if ( v1 ) /*0x669d*/
{
if ( *(_QWORD *)(v1 + 16) ) /*0x669f*/
BnFreeWords(*(_QWORD *)(a1 + 8)); /*0x66a9*/
GetInfo_7(v1); /*0x66b1*/
}
v3 = *(_QWORD *)(a1 + 16); /*0x66b6*/
if ( v3 ) /*0x66bd*/
{
if ( *(_QWORD *)(v3 + 16) ) /*0x66bf*/
BnFreeWords(*(_QWORD *)(a1 + 16)); /*0x66c9*/
GetInfo_7(v3); /*0x66d1*/
}
return GetInfo_7(a1); /*0x66d9*/
}
return result; /*0x66e8*/
}
// Function: AsciiStrTrim @ 0x66ec (0x64 bytes)
_BYTE *__fastcall AsciiStrTrim(_BYTE *i)
{
int v2; // r8d
_BYTE *i_1; // rax
char *j; // rdx
char n9; // cl
_BYTE *i_2; // rax
v2 = 1; /*0x66f2*/
i_1 = i; /*0x66f8*/
for ( j = i; *j; ++j ) /*0x6701*/
{
if ( !v2 || *j != 9 && *j != 32 ) /*0x6713*/
{
n9 = *j; /*0x6715*/
if ( *j == 32 || (v2 = 0, n9 == 9) ) /*0x6722*/
v2 = 1; /*0x6724*/
*i_1++ = n9; /*0x672a*/
}
}
*i_1 = 0; /*0x6737*/
i_2 = i_1 - 1; /*0x673a*/
if ( i_2 > i && (*i_2 == 32 || *i_2 == 9) ) /*0x674a*/
*i_2 = 0; /*0x674c*/
return i_2; /*0x674f*/
}
// Function: StrCompareTrim @ 0x6750 (0xb6 bytes)
__int64 __fastcall StrCompareTrim(char *i, char *i_1)
{
char *Info_9; // rbp
char *i_3; // rax
char *i_2; // rdi
unsigned int v8; // ebx
if ( i ) /*0x676d*/
{
if ( i_1 ) /*0x6780*/
{
Info_9 = GetInfo_9(i); /*0x678f*/
i_3 = GetInfo_9(i_1); /*0x6792*/
i_2 = i_3; /*0x6797*/
if ( Info_9 && i_3 ) /*0x67a2*/
{
AsciiStrTrim(Info_9); /*0x67a7*/
AsciiStrTrim(i_2); /*0x67af*/
v8 = AsciiStrCmpNoCase(Info_9, i_2); /*0x67c2*/
GetInfo_7((__int64)Info_9); /*0x67c5*/
GetInfo_7((__int64)i_2); /*0x67cd*/
return v8; /*0x67d2*/
}
else
{
GetInfo_7((__int64)Info_9); /*0x67d9*/
GetInfo_7((__int64)i_2); /*0x67e1*/
return AsciiStrCmpNoCase(i, i_1); /*0x67ec*/
}
}
else
{
return 1; /*0x6782*/
}
}
else if ( i_1 ) /*0x6772*/
{
return 0xFFFFFFFFLL; /*0x6774*/
}
else
{
return 0; /*0x6779*/
}
}
// Function: X509NameCompare @ 0x6808 (0xbe bytes)
__int64 __fastcall X509NameCompare(__int64 *a1, __int64 a2)
{
__int64 result; // rax
unsigned __int64 v5; // rax
unsigned __int64 v6; // rcx
unsigned __int64 v7; // rbp
char **p_i; // rsi
__int64 v9; // r14
int v10; // eax
if ( a1 ) /*0x682a*/
{
if ( !a2 ) /*0x683d*/
return 1; /*0x683d*/
v5 = a1[40]; /*0x6846*/
v6 = *(_QWORD *)(a2 + 320); /*0x684d*/
if ( v5 < v6 ) /*0x6857*/
return 0xFFFFFFFFLL; /*0x6857*/
if ( v5 <= v6 ) /*0x6859*/
{
v7 = 0; /*0x685b*/
if ( v5 ) /*0x6860*/
{
p_i = (char **)(a1 + 1); /*0x6865*/
v9 = a2 - (_QWORD)a1; /*0x6869*/
while ( 1 ) /*0x686c*/
{
v10 = *(_DWORD *)((char *)p_i + v9 - 8); /*0x686c*/
if ( *((_DWORD *)p_i - 2) < v10 || *((_DWORD *)p_i - 2) > v10 ) /*0x6876*/
break; /*0x6876*/
result = StrCompareTrim(*p_i, *(char **)((char *)p_i + v9)); /*0x687f*/
if ( (_DWORD)result ) /*0x6886*/
return result; /*0x6886*/
++v7; /*0x6888*/
p_i += 2; /*0x688b*/
if ( v7 >= a1[40] ) /*0x6896*/
return StrCompareTrim((char *)a1[41], *(char **)(a2 + 328)); /*0x6896*/
}
return 0xFFFFFFFFLL; /*0x6876*/
}
return StrCompareTrim((char *)a1[41], *(char **)(a2 + 328)); /*0x6898*/
}
else
{
return 1; /*0x683f*/
}
}
else
{
if ( a2 ) /*0x682f*/
return 0xFFFFFFFFLL; /*0x6834*/
return 0; /*0x6836*/
}
}
// Function: X509ParseAlgorithmIdentifier @ 0x68c8 (0xb8 bytes)
__int64 __fastcall X509ParseAlgorithmIdentifier(unsigned __int8 *a1, __int64 a2, unsigned __int64 *buf, unsigned __int8 **a4)
{
unsigned __int8 *buf__1; // rcx
unsigned __int8 *v9; // rdx
int v10; // eax
char v12[8]; // [rsp+20h] [rbp-48h] BYREF
unsigned __int8 *buf_; // [rsp+28h] [rbp-40h] BYREF
unsigned __int8 v14; // [rsp+31h] [rbp-37h]
int n16; // [rsp+34h] [rbp-34h]
int v16; // [rsp+38h] [rbp-30h]
unsigned __int8 *bufa[4]; // [rsp+40h] [rbp-28h] BYREF
if ( (int)SataConfig_7(a1, a2, &buf_) < 0 || v14 || n16 != 16 )
{
DebugLogPrint(1, "X509: Expected SEQUENCE (AlgorithmIdentifier) - found class %d tag 0x%x", v14, n16);
return 0xFFFFFFFFLL; /*0x6961*/
}
buf__1 = buf_; /*0x6913*/
v9 = &buf_[v16]; /*0x6918*/
if ( v9 > &a1[a2] ) /*0x691e*/
return 0xFFFFFFFFLL; /*0x6966*/
*a4 = v9; /*0x6920*/
if ( (int)SataConfig_7(buf__1, v9 - buf__1, bufa) < 0 ) /*0x6932*/
v10 = -1; /*0x6948*/
else
v10 = Asn1ParseOid(buf, v12, (__int64)bufa); /*0x6941*/
return (unsigned int)-(v10 != 0); /*0x697a*/
}
// Function: X509ParseSubjectPublicKeyInfo @ 0x6980 (0x130 bytes)
__int64 __fastcall X509ParseSubjectPublicKeyInfo(unsigned __int8 *src, __int64 a2, _QWORD *buf, unsigned __int8 **p_src)
{
unsigned __int8 *v4; // rsi
unsigned __int8 *bufa_1; // rcx
unsigned __int8 *v8; // rbx
int v9; // eax
__int64 v10; // rcx
int v11; // eax
unsigned __int8 *bufa_3; // rbx
unsigned __int64 n16_1; // r9
unsigned __int8 *bufa; // [rsp+20h] [rbp-20h] BYREF
unsigned __int8 v16; // [rsp+29h] [rbp-17h]
unsigned int n16; // [rsp+2Ch] [rbp-14h]
int v18; // [rsp+30h] [rbp-10h]
unsigned __int8 *bufa_2; // [rsp+60h] [rbp+20h] BYREF
v4 = &src[a2]; /*0x6995*/
if ( (int)SataConfig_7(src, a2, &bufa) < 0 || v16 || n16 != 16 )
{
DebugLogPrint(1, "X509: Expected SEQUENCE (SubjectPublicKeyInfo) - found class %d tag 0x%x", v16, n16);
return 0xFFFFFFFFLL; /*0x6a95*/
}
bufa_1 = bufa; /*0x69cf*/
v8 = &bufa[v18]; /*0x69d6*/
bufa_2 = bufa; /*0x69d9*/
if ( v8 > v4 ) /*0x69e0*/
return 0xFFFFFFFFLL; /*0x69e0*/
*p_src = v8; /*0x69e9*/
if ( (unsigned int)X509ParseAlgorithmIdentifier(bufa_1, v8 - bufa_1, buf + 102, &bufa_2) ) /*0x69fa*/
return 0xFFFFFFFFLL; /*0x6a01*/
v9 = SataConfig_7(bufa_2, v8 - bufa_2, &bufa); /*0x6a15*/
LOBYTE(v10) = v16; /*0x6a1e*/
if ( v9 < 0 || v16 || n16 != 3 )
{
DebugLogPrint(1, "X509: Expected BITSTRING (subjectPublicKey) - found class %d tag 0x%x", v16, n16);
return 0xFFFFFFFFLL; /*0x6a83*/
}
v11 = v18; /*0x6a2f*/
if ( !v18 ) /*0x6a35*/
return 0xFFFFFFFFLL; /*0x6a9a*/
bufa_3 = bufa; /*0x6a37*/
if ( *bufa != v16 )
{
DebugLogPrint(n16 - 2, "X509: BITSTRING - %d unused bits", *bufa);
v11 = v18; /*0x6a53*/
}
n16_1 = (unsigned int)(v11 - 1); /*0x6a5a*/
buf[113] = bufa_3 + 1; /*0x6a5e*/
buf[114] = n16_1; /*0x6a6c*/
DebugHexdumpFlat(v10, (__int64)"X509: subjectPublicKey", (__int64)(bufa_3 + 1), n16_1);
return 0; /*0x6aa7*/
}
// Function: SataConfig_1 @ 0x6ab0 (0x3eb bytes)
__int64 __fastcall SataConfig_1(unsigned __int8 *src, __int64 a2, __int64 a3, unsigned __int8 **p_src)
{
char *srca_1; // r15
unsigned __int8 *srca_2; // r12
unsigned __int8 *srca_3; // rsi
char *v11; // r14
int v12; // eax
__int64 v13; // rcx
int n2; // esi
char *dst; // rax
__int64 n0x20_2; // rcx
char *v17; // rax
char *v18; // r9
int n0x20_1; // ecx
char *srca_5; // rdx
__int64 v21; // rcx
char *srca; // [rsp+20h] [rbp-69h] BYREF
unsigned __int8 v24; // [rsp+29h] [rbp-60h]
unsigned int n16; // [rsp+2Ch] [rbp-5Dh]
unsigned __int64 n0x20; // [rsp+30h] [rbp-59h]
unsigned __int8 *srca_4; // [rsp+38h] [rbp-51h] BYREF
_BYTE buf_1[12]; // [rsp+40h] [rbp-49h] BYREF
int n19200300; // [rsp+4Ch] [rbp-3Dh]
int n100; // [rsp+50h] [rbp-39h]
int n9; // [rsp+54h] [rbp-35h]
int n25; // [rsp+58h] [rbp-31h]
__int64 n4; // [rsp+90h] [rbp+7h]
unsigned __int8 *buf[4]; // [rsp+A0h] [rbp+17h] BYREF
if ( (int)SataConfig_7(src, a2, (unsigned __int8 **)&srca) < 0 || v24 || n16 != 16 )
{
DebugLogPrint(1, "X509: Expected SEQUENCE (Name / RDNSequencer) - found class %d tag 0x%x", v24, n16);
return 0xFFFFFFFFLL; /*0x6e72*/
}
srca_1 = srca; /*0x6b0b*/
srca_2 = (unsigned __int8 *)&srca[(unsigned int)n0x20]; /*0x6b17*/
if ( srca_2 > &src[a2] ) /*0x6b1d*/
return 0xFFFFFFFFLL; /*0x6e77*/
*p_src = srca_2; /*0x6b23*/
if ( srca_1 >= (char *)srca_2 ) /*0x6b29*/
return 0; /*0x6e23*/
while ( (int)SataConfig_7((unsigned __int8 *)srca_1, srca_2 - (unsigned __int8 *)srca_1, (unsigned __int8 **)&srca) >= 0
&& !v24
&& n16 == 17 )
{
srca_1 = &srca[(unsigned int)n0x20]; /*0x6b74*/
if ( (int)SataConfig_7((unsigned __int8 *)srca, (unsigned int)n0x20, (unsigned __int8 **)&srca) < 0
|| v24
|| n16 != 16 )
{
DebugLogPrint(1, "X509: Expected SEQUENCE (AttributeTypeAndValue) - found class %d tag 0x%x", v24, n16);
return 0xFFFFFFFFLL; /*0x6e4a*/
}
srca_3 = (unsigned __int8 *)srca; /*0x6ba3*/
v11 = &srca[(unsigned int)n0x20]; /*0x6bb2*/
srca_4 = (unsigned __int8 *)srca; /*0x6bb5*/
if ( (int)SataConfig_7((unsigned __int8 *)srca, (unsigned int)n0x20, buf) < 0 ) /*0x6bc6*/
{
v12 = -1; /*0x6bdf*/
}
else
{
v12 = Asn1ParseOid((unsigned __int64 *)buf_1, &srca_4, (__int64)buf); /*0x6bd4*/
srca_3 = srca_4; /*0x6bd9*/
}
if ( v12 ) /*0x6be3*/
return 0xFFFFFFFFLL; /*0x6be3*/
if ( (int)SataConfig_7(srca_3, v11 - (char *)srca_3, (unsigned __int8 **)&srca) < 0 || v24 )
{
DebugLogPrint(1, "X509: Failed to parse AttributeValue");
return 0xFFFFFFFFLL; /*0x6e41*/
}
if ( n4 == 4 )
{
if ( *(_DWORD *)buf_1 != 2 || *(_DWORD *)&buf_1[4] != 5 || *(_DWORD *)&buf_1[8] != (_DWORD)n4 ) /*0x6c2f*/
goto LABEL_62; /*0x6c2f*/
switch ( n19200300 ) /*0x6c3b*/
{
case 3: /*0x6c3b*/
n2 = 2; /*0x6c88*/
break;
case 6: /*0x6c3b*/
n2 = 3; /*0x6c7e*/
break;
case 7: /*0x6c3b*/
n2 = 4; /*0x6c74*/
break;
case 8: /*0x6c3b*/
n2 = 5; /*0x6c6a*/
break;
case 10: /*0x6c3b*/
n2 = 6; /*0x6c60*/
break;
case 11: /*0x6c3b*/
n2 = n4 + 3; /*0x6c57*/
break;
default:
goto LABEL_62; /*0x6c51*/
}
LABEL_54:
if ( *(_QWORD *)(a3 + 320) == 20 )
{
DebugLogPrint(2, "X509: Too many Name attributes");
return 0xFFFFFFFFLL; /*0x6e31*/
}
v17 = (char *)MmgrAlloc((unsigned int)(n0x20 + 1)); /*0x6d8c*/
v18 = v17; /*0x6d91*/
if ( !v17 ) /*0x6d97*/
return 0xFFFFFFFFLL; /*0x6d97*/
n0x20_1 = n0x20; /*0x6d9d*/
srca_5 = srca; /*0x6da0*/
if ( (_DWORD)n0x20 ) /*0x6da6*/
{
do /*0x6dbd*/
{
--n0x20_1; /*0x6dab*/
if ( *srca_5 ) /*0x6da8*/
*v17++ = *srca_5; /*0x6db2*/
++srca_5; /*0x6db8*/
}
while ( n0x20_1 ); /*0x6dbd*/
n0x20_1 = n0x20; /*0x6dbf*/
}
v18[n0x20_1] = 0; /*0x6dc4*/
*(_DWORD *)(a3 + 16LL * *(_QWORD *)(a3 + 320)) = n2; /*0x6dd3*/
*(_QWORD *)(a3 + 16LL * (*(_QWORD *)(a3 + 320))++ + 8) = v18; /*0x6de2*/
goto LABEL_63; /*0x6dee*/
}
if ( n4 != 7 ) /*0x6c96*/
goto LABEL_62; /*0x6c96*/
if ( *(_DWORD *)buf_1 != 1 )
{
if ( *(_DWORD *)buf_1
|| *(_DWORD *)&buf_1[4] != 9
|| *(_DWORD *)&buf_1[8] != 2342
|| n19200300 != 19200300
|| n100 != 100
|| n9 != 1
|| n25 != 25 )
{
LABEL_62:
DebugHexdumpFlat(v13, (__int64)"X509: Unrecognized OID", (__int64)buf_1, 4 * n4);
DebugHexdumpAscii(v21, (__int64)"X509: Attribute Data", (unsigned __int8 *)srca, (unsigned int)n0x20);
goto LABEL_63; /*0x6e13*/
}
n2 = 1; /*0x6d77*/
goto LABEL_54; /*0x6d77*/
}
if ( *(_DWORD *)&buf_1[4] != 2 /*0x6ce1*/
|| *(_DWORD *)&buf_1[8] != 840
|| n19200300 != 113549
|| n100 != 1
|| n9 != 9
|| n25 != 1 )
{
goto LABEL_62; /*0x6ce1*/
}
GetInfo_7(*(_QWORD *)(a3 + 328)); /*0x6cee*/
dst = (char *)MmgrAlloc((unsigned int)(n0x20 + 1)); /*0x6cf8*/
*(_QWORD *)(a3 + 328) = dst; /*0x6cfd*/
if ( !dst ) /*0x6d07*/
return 0xFFFFFFFFLL; /*0x6d07*/
n0x20_2 = (unsigned int)n0x20; /*0x6d0d*/
if ( (_DWORD)n0x20 ) /*0x6d15*/
{
MemConfig_0(dst, srca, (unsigned int)n0x20); /*0x6d1e*/
n0x20_2 = (unsigned int)n0x20; /*0x6d23*/
}
*(_BYTE *)(n0x20_2 + *(_QWORD *)(a3 + 328)) = 0; /*0x6d2d*/
LABEL_63:
if ( srca_1 >= (char *)srca_2 ) /*0x6e1b*/
return 0; /*0x6e1b*/
}
DebugLogPrint(1, "X509: Expected SET (RelativeDistinguishedName) - found class %d tag 0x%x", v24, n16);
return 0xFFFFFFFFLL; /*0x6e8e*/
}
// Function: X509FormatDn @ 0x6e9c (0x16e bytes)
unsigned __int64 __fastcall X509FormatDn(__int64 EntryPtr, unsigned int *KeyBuffer, __int64 n256, double TempDouble)
{
unsigned __int64 v4; // r14
unsigned int *KeyBuffer_2; // rsi
unsigned int *KeyBuffer_1; // rbx
__int64 EntryPtr_1; // rdi
unsigned __int64 result; // rax
signed __int64 v11; // rcx
v4 = 0; /*0x6eb4*/
KeyBuffer_2 = (unsigned int *)((char *)KeyBuffer + n256); /*0x6eb7*/
KeyBuffer_1 = KeyBuffer; /*0x6ec1*/
if ( *(_QWORD *)(EntryPtr + 320) ) /*0x6ec4*/
{
EntryPtr_1 = EntryPtr; /*0x6ed1*/
while ( 1 ) /*0x6f65*/
{
result = AsciiSPrint( /*0x6f65*/
KeyBuffer_1,
(char *)KeyBuffer_2 - (char *)KeyBuffer_1,
"%a=%a, ",
TempDouble,
*(double *)(EntryPtr_1 + 8));
if ( (result & 0x80000000) != 0LL ) /*0x6f6c*/
break; /*0x6f6c*/
v11 = (int)result; /*0x6f6e*/
result = (char *)KeyBuffer_2 - (char *)KeyBuffer_1; /*0x6f74*/
if ( v11 >= (char *)KeyBuffer_2 - (char *)KeyBuffer_1 ) /*0x6f7a*/
break; /*0x6f7a*/
KeyBuffer_1 = (unsigned int *)((char *)KeyBuffer_1 + v11); /*0x6f7c*/
++v4; /*0x6f7f*/
EntryPtr_1 += 16; /*0x6f82*/
if ( v4 >= *(_QWORD *)(EntryPtr + 320) ) /*0x6f8d*/
goto LABEL_6; /*0x6f8d*/
}
}
else
{
LABEL_6:
result = (unsigned __int64)KeyBuffer + 1; /*0x6f93*/
if ( KeyBuffer_1 > (unsigned int *)((char *)KeyBuffer + 1) /*0x6fa6*/
&& *((_BYTE *)KeyBuffer_1 - 1) == 32
&& *((_BYTE *)KeyBuffer_1 - 2) == 44 )
{
*((_BYTE *)KeyBuffer_1 - 1) = 0; /*0x6fa8*/
KeyBuffer_1 = (unsigned int *)((char *)KeyBuffer_1 - 2); /*0x6fac*/
*(_BYTE *)KeyBuffer_1 = 0; /*0x6fb0*/
}
if ( *(_QWORD *)(EntryPtr + 328) ) /*0x6fb3*/
{
result = AsciiSPrint(KeyBuffer_1, (char *)KeyBuffer_2 - (char *)KeyBuffer_1, "/emailAddress=%a", TempDouble); /*0x6fd2*/
if ( (result & 0x80000000) == 0LL ) /*0x6fd9*/
{
result = (int)result; /*0x6fdb*/
if ( (int)result < (char *)KeyBuffer_2 - (char *)KeyBuffer_1 ) /*0x6fe0*/
KeyBuffer_1 = (unsigned int *)((char *)KeyBuffer_1 + (int)result); /*0x6fe2*/
}
}
}
if ( KeyBuffer_1 < KeyBuffer_2 ) /*0x6fe8*/
*(_BYTE *)KeyBuffer_1 = 0; /*0x6fea*/
*((_BYTE *)KeyBuffer_2 - 1) = 0; /*0x6ff7*/
return result; /*0x7000*/
}
// Function: X509ParseTime @ 0x700c (0x21c bytes)
__int64 __fastcall X509ParseTime(char *src, __int64 n13, unsigned int n16, _DWORD *a4)
{
unsigned __int64 n13_1; // rsi
const char *X509:_Unrecognized_UTCTime_format; // rdx
__int64 n2; // r15
__int64 count_4; // rdx
__int64 v10; // rcx
unsigned __int64 n13_2; // r9
const char *X509:_Failed_to_parse_UTCTime_year; // rdx
signed int n50a_1; // r14d
char *src_1; // r15
__int64 count_3; // rdx
__int64 count_2; // rdx
__int64 count_1; // rdx
__int64 count; // rdx
__int64 v20; // rcx
unsigned int n0x17; // [rsp+40h] [rbp-10h] BYREF
int v22; // [rsp+44h] [rbp-Ch] BYREF
int v23; // [rsp+48h] [rbp-8h] BYREF
unsigned int n0x3B; // [rsp+80h] [rbp+30h] BYREF
unsigned int n50a; // [rsp+90h] [rbp+40h] BYREF
n13_1 = n13; /*0x702b*/
if ( n16 == 23 )
{
if ( n13 != 13 || src[12] != 90 )
{
X509:_Unrecognized_UTCTime_format = "X509: Unrecognized UTCTime format";
goto LABEL_34; /*0x71fa*/
}
LOBYTE(n13) = 2; /*0x70a7*/
if ( (unsigned int)Asn1DecodeShort(src, n13, &n50a) == -1 )
{
n13_2 = 13; /*0x70b5*/
X509:_Failed_to_parse_UTCTime_year = "X509: Failed to parse UTCTime year";
goto LABEL_13; /*0x70b8*/
}
if ( (int)n50a >= 50 ) /*0x70d6*/
n50a_1 = n50a + 1900; /*0x70e1*/
else
n50a_1 = n50a + 2000; /*0x70d8*/
n2 = 2; /*0x70e8*/
goto LABEL_19; /*0x70e8*/
}
if ( n16 == 24 )
{
if ( src[n13 - 1] != 90 )
{
X509:_Unrecognized_UTCTime_format = "X509: Unrecognized GeneralizedTime format";
LABEL_34:
DebugHexdumpAscii((__int64)src, (__int64)X509:_Unrecognized_UTCTime_format, (unsigned __int8 *)src, n13_1); /*0x7201*/
return 0xFFFFFFFFLL; /*0x7207*/
}
n2 = 4; /*0x7064*/
LOBYTE(n13) = 4; /*0x706e*/
if ( (unsigned int)Asn1DecodeShort(src, n13, &n50a) == -1 )
{
n13_2 = n13_1; /*0x707d*/
X509:_Failed_to_parse_UTCTime_year = "X509: Failed to parse GeneralizedTime year";
goto LABEL_13; /*0x7087*/
}
n50a_1 = n50a; /*0x7089*/
LABEL_19:
src_1 = &src[n2]; /*0x70ee*/
LOBYTE(count_4) = 2; /*0x70f8*/
if ( (unsigned int)Asn1DecodeShort(src_1, count_4, &v23) == -1 )
{
n13_2 = n13_1; /*0x7103*/
X509:_Failed_to_parse_UTCTime_year = "X509: Failed to parse Time (month)";
}
else
{
LOBYTE(count_3) = 2; /*0x7113*/
if ( (unsigned int)Asn1DecodeShort(src_1 + 2, count_3, &v22) == -1 )
{
n13_2 = n13_1; /*0x7122*/
X509:_Failed_to_parse_UTCTime_year = "X509: Failed to parse Time (day)";
}
else
{
LOBYTE(count_2) = 2; /*0x7132*/
if ( (unsigned int)Asn1DecodeShort(src_1 + 4, count_2, &n0x17) == -1 )
{
n13_2 = n13_1; /*0x7141*/
X509:_Failed_to_parse_UTCTime_year = "X509: Failed to parse Time (hour)";
}
else
{
LOBYTE(count_1) = 2; /*0x7154*/
if ( (unsigned int)Asn1DecodeShort(src_1 + 6, count_1, &n0x3B) == -1 )
{
n13_2 = n13_1; /*0x7163*/
X509:_Failed_to_parse_UTCTime_year = "X509: Failed to parse Time (min)";
}
else
{
LOBYTE(count) = 2; /*0x7176*/
if ( (unsigned int)Asn1DecodeShort(src_1 + 8, count, &n50a) != -1 )
{
if ( (int)DateTimeToEpoch(n50a_1, v23, v22, n0x17, n0x3B, n50a, a4) < 0 )
{
DebugHexdumpAscii(v20, (__int64)"X509: Failed to convert Time", (unsigned __int8 *)src, n13_1);
if ( n50a_1 >= 1970 ) /*0x71d7*/
return 0xFFFFFFFFLL; /*0x71d7*/
DebugLogPrint(1, "X509: Year=%d before epoch - assume epoch as the time", n50a_1);
*a4 = 0; /*0x71f1*/
}
return 0; /*0x71f8*/
}
n13_2 = n13_1; /*0x7185*/
X509:_Failed_to_parse_UTCTime_year = "X509: Failed to parse Time (sec)";
}
}
}
}
LABEL_13:
DebugHexdumpAscii(v10, (__int64)X509:_Failed_to_parse_UTCTime_year, (unsigned __int8 *)src, n13_2); /*0x70bf*/
return 0xFFFFFFFFLL; /*0x70c9*/
}
DebugLogPrint(1, "X509: Expected UTCTime or GeneralizedTime - found tag 0x%x", n16);
return 0xFFFFFFFFLL; /*0x721c*/
}
// Function: X509ParseValidity @ 0x7228 (0x14e bytes)
__int64 __fastcall X509ParseValidity(unsigned __int8 *src, __int64 a2, _QWORD *buf, _QWORD *p_src)
{
unsigned __int8 *bufa_1; // rcx
__int64 n13_1; // rdx
__int64 v10; // rcx
const char *X509:_Failed_to_parse_notBefore_Time; // rdx
unsigned __int8 *bufa; // [rsp+20h] [rbp-20h] BYREF
unsigned __int8 v14; // [rsp+29h] [rbp-17h]
unsigned int n16; // [rsp+2Ch] [rbp-14h]
__int64 n13; // [rsp+30h] [rbp-10h]
if ( (int)SataConfig_7(src, a2, &bufa) < 0 || v14 || n16 != 16 )
{
DebugLogPrint(1, "X509: Expected SEQUENCE (Validity) - found class %d tag 0x%x", v14, n16);
}
else
{
bufa_1 = bufa; /*0x7279*/
n13_1 = (unsigned int)n13; /*0x727d*/
if ( (unsigned int)n13 <= (unsigned __int64)(a2 + src - bufa) )
{
*p_src = &bufa[(unsigned int)n13]; /*0x7297*/
if ( (int)SataConfig_7(bufa_1, n13_1, &bufa) < 0
|| v14
|| (int)X509ParseTime((char *)bufa, (unsigned int)n13, n16, (_DWORD *)buf + 202) < 0 )
{
X509:_Failed_to_parse_notBefore_Time = "X509: Failed to parse notBefore Time";
}
else
{
if ( (int)SataConfig_7(&bufa[(unsigned int)n13], *p_src - (_QWORD)&bufa[(unsigned int)n13], &bufa) >= 0
&& !v14
&& (int)X509ParseTime((char *)bufa, (unsigned int)n13, n16, (_DWORD *)buf + 203) >= 0 )
{
DebugLogPrint(0, "X509: Validity: notBefore: %lx notAfter: %lx", *((_DWORD *)buf + 202), *((_DWORD *)buf + 203));
return 0; /*0x7323*/
}
X509:_Failed_to_parse_notBefore_Time = "X509: Failed to parse notAfter Time";
}
DebugHexdumpAscii(v10, (__int64)X509:_Failed_to_parse_notBefore_Time, bufa, (unsigned int)n13); /*0x7334*/
}
}
return 0xFFFFFFFFLL; /*0x7370*/
}
// Function: X509ParseBasicConstraints @ 0x7378 (0x173 bytes)
__int64 __fastcall X509ParseBasicConstraints(_DWORD *buf, unsigned __int8 *buf_, __int64 n16)
{
int v4; // ebx
unsigned __int8 *v6; // r14
int n5_1; // r9d
unsigned __int8 *v8; // rcx
int v9; // r8d
__int64 v10; // rcx
unsigned __int8 *bufa_1; // rdx
int v12; // eax
int v13; // r8d
unsigned __int8 *bufa; // [rsp+20h] [rbp-20h] BYREF
unsigned __int8 v15; // [rsp+29h] [rbp-17h]
int n5; // [rsp+2Ch] [rbp-14h]
__int64 v17; // [rsp+30h] [rbp-10h]
v4 = 0; /*0x73ab*/
if ( (int)SataConfig_7(buf_, n16, &bufa) < 0 || v15 || n5 != 16 )
{
DebugLogPrint(1, "X509: Expected SEQUENCE in BasicConstraints; found %d tag 0x%x", v15);
return 0xFFFFFFFFLL; /*0x74ce*/
}
buf[256] |= 1u; /*0x73c8*/
if ( !(_DWORD)v17 ) /*0x73d2*/
return 0; /*0x73d6*/
v6 = &bufa[(unsigned int)v17]; /*0x73e6*/
if ( (int)SataConfig_7(bufa, (unsigned int)v17, &bufa) < 0 || v15 ) /*0x73f8*/
goto LABEL_16; /*0x73f8*/
n5_1 = n5; /*0x73fa*/
if ( n5 == 1 )
{
v8 = &bufa[(unsigned int)v17]; /*0x740b*/
v9 = *bufa; /*0x740e*/
buf[257] = v9; /*0x7412*/
if ( v8 >= v6 )
{
DebugLogPrint(n5_1, "X509: BasicConstraints - cA=%d", v9);
return 0; /*0x742d*/
}
if ( (int)SataConfig_7(v8, v6 - v8, &bufa) >= 0 && !v15 ) /*0x7447*/
{
n5_1 = n5; /*0x7449*/
goto LABEL_14; /*0x7449*/
}
LABEL_16:
DebugLogPrint(1, "X509: Failed to parse BasicConstraints");
return 0xFFFFFFFFLL; /*0x7471*/
}
LABEL_14:
if ( n5_1 == 2 )
{
v10 = (unsigned int)v17; /*0x7473*/
bufa_1 = bufa; /*0x7476*/
if ( (_DWORD)v17 ) /*0x747d*/
{
do /*0x748e*/
{
v12 = *bufa_1++; /*0x747f*/
v4 = v12 | (v4 << 8); /*0x7488*/
--v10; /*0x748a*/
}
while ( v10 ); /*0x748e*/
}
buf[256] |= 2u; /*0x7490*/
v13 = buf[257]; /*0x749e*/
buf[258] = v4; /*0x74ad*/
DebugLogPrint(1, "X509: BasicConstraints - cA=%d pathLenConstraint=%lx", v13, v4);
return 0; /*0x74b8*/
}
DebugLogPrint(1, "X509: Expected INTEGER in BasicConstraints; found class %d tag 0x%x", 0);
return 0xFFFFFFFFLL; /*0x74e5*/
}
// Function: X509ParseExtension @ 0x74ec (0xbb bytes)
__int64 __fastcall X509ParseExtension(_DWORD *buf, __int64 *a2, unsigned __int8 *buf_, __int64 n16)
{
double v4; // xmm2_8
int v7; // eax
unsigned int n2_1; // ecx
unsigned int v9; // ebx
int v10; // eax
unsigned __int8 *bufa; // [rsp+30h] [rbp-28h] BYREF
unsigned __int8 v12; // [rsp+39h] [rbp-1Fh]
int n3; // [rsp+3Ch] [rbp-1Ch]
unsigned __int64 n2; // [rsp+40h] [rbp-18h]
if ( *((_DWORD *)a2 + 3) == 15 )
{
v7 = SataConfig_7(buf_, n16, &bufa); /*0x752a*/
n2_1 = n2; /*0x752f*/
v9 = 0; /*0x7533*/
if ( v7 >= 0 && !v12 && n3 == 3 && (_DWORD)n2 )
{
buf[256] |= 4u; /*0x754f*/
v10 = BitStringToInt((__int64)bufa, n2_1, v4); /*0x755d*/
buf[259] = v10; /*0x7565*/
DebugLogPrint(1, "X509: KeyUsage 0x%lx", v10);
}
else
{
DebugLogPrint(1, "X509: Expected BIT STRING in KeyUsage; found %d tag 0x%x len %d", v12, n3, n2);
return (unsigned int)-1; /*0x7597*/
}
return v9; /*0x759a*/
}
else if ( *((_DWORD *)a2 + 3) == 19 ) /*0x7506*/
{
return X509ParseBasicConstraints(buf, buf_, n16); /*0x7518*/
}
else
{
return 1; /*0x7508*/
}
}
// Function: SataConfig_5 @ 0x75a8 (0x204 bytes)
__int64 __fastcall SataConfig_5(_DWORD *buf, unsigned __int8 *src, __int64 a3, unsigned __int8 **p_src)
{
double v4; // xmm3_8
int v7; // r14d
unsigned __int8 *bufa_1; // rbx
unsigned __int8 *bufa_2; // rcx
unsigned __int8 *v10; // rsi
int v11; // eax
__int64 result; // rax
int v13; // eax
__int64 v14; // rcx
int v15; // eax
__int64 v16; // rcx
__int64 v17; // r8
__int64 n16_1; // r9
unsigned __int8 *bufa; // [rsp+20h] [rbp-49h] BYREF
unsigned __int8 n3; // [rsp+29h] [rbp-40h]
unsigned int n4; // [rsp+2Ch] [rbp-3Dh]
unsigned __int64 n16; // [rsp+30h] [rbp-39h]
unsigned __int8 *buf_2[3]; // [rsp+38h] [rbp-31h] BYREF
unsigned __int64 buf_1[10]; // [rsp+50h] [rbp-19h] BYREF
unsigned __int64 n4_1; // [rsp+A0h] [rbp+37h]
unsigned __int8 *bufa_3; // [rsp+D8h] [rbp+6Fh] BYREF
v7 = 0; /*0x75dd*/
if ( (int)SataConfig_7(src, a3, &bufa) < 0 || n3 || n4 != 16 )
{
DebugLogPrint(1, "X509: Unexpected ASN.1 header in Extensions: class %d tag 0x%x; expected SEQUENCE", n3, n4);
return 0xFFFFFFFFLL; /*0x778c*/
}
else
{
bufa_1 = bufa; /*0x7606*/
bufa_2 = bufa; /*0x7611*/
v10 = &bufa[(unsigned int)n16]; /*0x7614*/
bufa_3 = bufa; /*0x7617*/
*p_src = v10; /*0x761e*/
if ( (int)SataConfig_7(bufa_2, v10 - bufa_2, buf_2) < 0 ) /*0x762e*/
{
v11 = -1; /*0x7647*/
}
else
{
v11 = Asn1ParseOid(buf_1, &bufa_3, (__int64)buf_2); /*0x763c*/
bufa_1 = bufa_3; /*0x7641*/
}
if ( v11 < 0 )
{
DebugLogPrint(1, "X509: Unexpected ASN.1 data for Extension (expected OID)");
return 0xFFFFFFFFLL; /*0x7660*/
}
v13 = SataConfig_7(bufa_1, v10 - bufa_1, &bufa); /*0x7672*/
LOBYTE(v14) = n3; /*0x7680*/
if ( v13 < 0 || n3 )
{
LABEL_14:
DebugLogPrint(
1,
"X509: Unexpected ASN.1 header in Extensions: class %d tag 0x%x; expected BOOLEAN or OCTET STRING",
n3,
n4);
return 0xFFFFFFFFLL; /*0x76a3*/
}
if ( n4 == 1 )
{
v7 = *bufa; /*0x76b8*/
v15 = SataConfig_7(bufa, v10 - bufa, &bufa); /*0x76bc*/
LOBYTE(v14) = n3; /*0x76c5*/
if ( v15 < 0 || n3 && n3 != 3 || n4 != 4 )
{
DebugLogPrint(1, "X509: Unexpected ASN.1 header in Extensions: class %d tag 0x%x; expected OCTET STRING", n3, n4);
return 0xFFFFFFFFLL; /*0x7772*/
}
}
else if ( n4 != 4 ) /*0x7694*/
{
goto LABEL_14; /*0x7694*/
}
OidDebugPrint(v14, (__int64)"X509: Extension: extnID=", (__int64)buf_1, v4);
DebugLogPrint(1, "X509: Extension: critical=%d", v7);
DebugHexdumpFlat(v16, (__int64)"X509: extnValue", (__int64)bufa, (unsigned int)n16);
n16_1 = (unsigned int)n16; /*0x7721*/
if ( n4_1 < 4 || LODWORD(buf_1[0]) != 2 || *(unsigned __int64 *)((char *)buf_1 + 4) != 0x1D00000005LL ) /*0x7731*/
goto LABEL_25; /*0x7731*/
result = X509ParseExtension(buf, (__int64 *)buf_1, bufa, (unsigned int)n16); /*0x7744*/
if ( (int)result < 0 ) /*0x774b*/
return result; /*0x774b*/
if ( (_DWORD)result == 1 )
{
LABEL_25:
if ( v7 )
DebugLogPrint(2, "X509: Unknown critical extension", v17, n16_1);
}
return 0; /*0x7767*/
}
}
// Function: SataConfig_0 @ 0x77ac (0x43e bytes)
__int64 __fastcall SataConfig_0(unsigned __int8 *buf, __int64 a2, _QWORD *buf_1, unsigned __int8 **p_buf)
{
double TempDouble; // xmm3_8
unsigned __int8 *bufa_1; // rcx
unsigned __int8 *p_src_2; // rdi
unsigned int n2_1; // r8d
unsigned __int8 *v10; // rcx
__int64 n16_2; // rcx
unsigned __int8 *bufa_2; // rdx
unsigned __int8 *p_src_1; // r14
bool v14; // zf
__int64 v15; // rcx
__int64 v16; // rcx
int n16_3; // r8d
unsigned __int8 *p_src_3; // rcx
unsigned __int8 *p_src_4; // rcx
int v21; // eax
__int64 v22; // rcx
unsigned __int8 *src_1; // rax
unsigned __int8 *src_2; // rbx
unsigned __int8 *p_src_5; // r8
unsigned __int8 *p_src; // [rsp+30h] [rbp-40h] BYREF
unsigned __int8 *bufa; // [rsp+38h] [rbp-38h] BYREF
unsigned __int8 n2; // [rsp+41h] [rbp-2Fh]
unsigned int n16_1; // [rsp+44h] [rbp-2Ch]
unsigned __int64 n16; // [rsp+48h] [rbp-28h]
unsigned __int8 *src; // [rsp+50h] [rbp-20h] BYREF
unsigned __int8 v32; // [rsp+59h] [rbp-17h]
unsigned int n16_4; // [rsp+5Ch] [rbp-14h]
int v34; // [rsp+60h] [rbp-10h]
if ( (int)SataConfig_7(buf, a2, &bufa) < 0 || n2 || n16_1 != 16 )
{
DebugLogPrint(1, "X509: tbsCertificate did not start with a valid SEQUENCE - found class %d tag 0x%x", n2, n16_1);
return 0xFFFFFFFFLL; /*0x7bc8*/
}
bufa_1 = bufa; /*0x77f7*/
p_src_2 = &bufa[(unsigned int)n16]; /*0x7802*/
*p_buf = p_src_2; /*0x7808*/
if ( (int)SataConfig_7(bufa_1, p_src_2 - bufa_1, &bufa) >= 0 )
{
if ( n2 != 2 ) /*0x7824*/
{
*((_DWORD *)buf_1 + 4) = 0; /*0x78bf*/
goto LABEL_17; /*0x78bf*/
}
if ( (int)SataConfig_7(bufa, p_src_2 - bufa, &bufa) >= 0 )
{
if ( n2 || n16_1 != 2 )
{
DebugLogPrint(1, "X509: No INTEGER tag found for version field - found class %d tag 0x%x", n2, n16_1);
return 0xFFFFFFFFLL; /*0x78ba*/
}
if ( (_DWORD)n16 != 1 )
{
DebugLogPrint(1, "X509: Unexpected version field length %lx (expected 1)");
return 0xFFFFFFFFLL; /*0x786d*/
}
n2_1 = *bufa; /*0x7876*/
v10 = bufa + 1; /*0x787a*/
*((_DWORD *)buf_1 + 4) = n2_1; /*0x787e*/
if ( n2_1 > 2 )
{
DebugLogPrint(1, "X509: Unsupported version %d");
return 0xFFFFFFFFLL; /*0x7892*/
}
if ( (int)SataConfig_7(v10, p_src_2 - v10, &bufa) < 0 ) /*0x78a5*/
return 0xFFFFFFFFLL; /*0x78a5*/
LABEL_17:
DebugLogPrint(0, "X509: Version X.509v%d", *((_DWORD *)buf_1 + 4) + 1);
n16_2 = (unsigned int)n16; /*0x78db*/
if ( n2 || n16_1 != 2 || (unsigned int)(n16 - 1) > 0x13 )
{
DebugLogPrint(1, "X509: No INTEGER tag found for serialNumber; class=%d tag=0x%x length=%u", n2, n16_1, n16);
return 0xFFFFFFFFLL; /*0x7bb6*/
}
bufa_2 = bufa; /*0x7900*/
p_src_1 = &bufa[(unsigned int)n16]; /*0x7904*/
p_src = p_src_1; /*0x7908*/
if ( (_DWORD)n16 ) /*0x790e*/
{
do /*0x7922*/
{
if ( *bufa_2 ) /*0x7910*/
break; /*0x7913*/
++bufa_2; /*0x7915*/
v14 = (_DWORD)n16_2 == 1; /*0x7918*/
n16_2 = (unsigned int)(n16_2 - 1); /*0x7918*/
bufa = bufa_2; /*0x791b*/
LODWORD(n16) = n16_2; /*0x791f*/
}
while ( !v14 ); /*0x7922*/
}
if ( (_DWORD)n16_2 ) /*0x7929*/
{
MemConfig_0((char *)buf_1 + 20, (char *)bufa_2, (unsigned int)n16_2); /*0x792f*/
n16_2 = (unsigned int)n16; /*0x7934*/
}
buf_1[5] = (unsigned int)n16_2; /*0x7945*/
DebugHexdumpFlat(n16_2, (__int64)"X509: serialNumber", (__int64)buf_1 + 20, (unsigned int)n16_2);
if ( (unsigned int)X509ParseAlgorithmIdentifier(p_src_1, p_src_2 - p_src_1, buf_1 + 6, &p_src) ) /*0x795f*/
return 0xFFFFFFFFLL; /*0x795f*/
if ( (unsigned int)SataConfig_1(p_src, p_src_2 - p_src, (__int64)(buf_1 + 17), &p_src) ) /*0x7984*/
return 0xFFFFFFFFLL; /*0x7984*/
X509DebugPrintDn(v15, (__int64)"X509: issuer", (__int64)(buf_1 + 17), TempDouble);
if ( (unsigned int)X509ParseValidity(p_src, p_src_2 - p_src, buf_1, &p_src) ) /*0x79b1*/
return 0xFFFFFFFFLL; /*0x79b1*/
if ( (unsigned int)SataConfig_1(p_src, p_src_2 - p_src, (__int64)(buf_1 + 59), &p_src) ) /*0x79d6*/
return 0xFFFFFFFFLL; /*0x79d6*/
X509DebugPrintDn(v16, (__int64)"X509: subject", (__int64)(buf_1 + 59), TempDouble);
if ( (unsigned int)X509ParseSubjectPublicKeyInfo(p_src, p_src_2 - p_src, buf_1, &p_src) ) /*0x7a03*/
return 0xFFFFFFFFLL; /*0x7a0a*/
if ( p_src == p_src_2 || !*((_DWORD *)buf_1 + 4) ) /*0x7a20*/
return 0; /*0x7a24*/
if ( (int)SataConfig_7(p_src, p_src_2 - p_src, &bufa) >= 0 && n2 == 2 )
{
n16_3 = n16_1; /*0x7a47*/
if ( n16_1 == 1 )
{
DebugLogPrint(1, "X509: issuerUniqueID");
p_src_3 = &bufa[(unsigned int)n16]; /*0x7a61*/
if ( p_src_3 == p_src_2 ) /*0x7a68*/
return 0; /*0x7a68*/
if ( (int)SataConfig_7(p_src_3, p_src_2 - p_src_3, &bufa) < 0 || n2 != 2 ) /*0x7a81*/
goto LABEL_47; /*0x7a81*/
n16_3 = n16_1; /*0x7a83*/
}
if ( n16_3 != 2 ) /*0x7a8b*/
goto LABEL_45; /*0x7a8b*/
DebugLogPrint(1, "X509: subjectUniqueID");
p_src_4 = &bufa[(unsigned int)n16]; /*0x7a9e*/
if ( p_src_4 == p_src_2 ) /*0x7aa5*/
return 0; /*0x7aa5*/
if ( (int)SataConfig_7(p_src_4, p_src_2 - p_src_4, &bufa) >= 0 && n2 == 2 )
{
n16_3 = n16_1; /*0x7ac4*/
LABEL_45:
if ( n16_3 == 3 )
{
if ( *((_DWORD *)buf_1 + 4) != 2 )
{
DebugLogPrint(1, "X509: X.509%d certificate and Extensions data which are only allowed for version 3");
return 0xFFFFFFFFLL; /*0x7b0c*/
}
v21 = SataConfig_7(bufa, (unsigned int)n16, &src); /*0x7b1c*/
LOBYTE(v22) = v32; /*0x7b25*/
if ( v21 < 0 || v32 || n16_4 != 16 )
{
DebugLogPrint(
1,
"X509: Unexpected ASN.1 data for Extensions: class %d tag 0x%x; expected SEQUENCE",
v32,
n16_4);
return 0xFFFFFFFFLL; /*0x7b9b*/
}
src_1 = src; /*0x7b36*/
p_src = src; /*0x7b3d*/
src_2 = &src[v34]; /*0x7b41*/
while ( src_1 < src_2 ) /*0x7b66*/
{
if ( (int)SataConfig_5(buf_1, src_1, src_2 - src_1, &p_src) < 0 ) /*0x7b5d*/
return 0xFFFFFFFFLL; /*0x7b5d*/
src_1 = p_src; /*0x7b5f*/
}
p_src_5 = &bufa[(unsigned int)n16]; /*0x7b6c*/
if ( p_src_5 < p_src_2 )
DebugHexdumpFlat(v22, (__int64)"X509: Ignored extra tbsCertificate data", (__int64)p_src_5, p_src_2 - p_src_5);
}
else
{
DebugLogPrint(1, "X509: Ignored unexpected Context-Specific tag %d in optional tbsCertificate fields", n16_3);
}
return 0; /*0x7a1b*/
}
}
LABEL_47:
DebugLogPrint(
1,
"X509: Expected Context-Specific tag to parse optional tbsCertificate field(s); parsed class %d tag 0x%x",
n2,
n16_1);
}
}
return 0xFFFFFFFFLL; /*0x7be5*/
}
// Function: OidIsRsa @ 0x7bec (0x37 bytes)
__int64 __fastcall OidIsRsa(__int64 a1)
{
__int64 result; // rax
if ( *(_QWORD *)(a1 + 80) <= 4u ) /*0x7bf1*/
return 0; /*0x7bf1*/
result = 1; /*0x7bfa*/
if ( *(_DWORD *)a1 != 1 /*0x7c1e*/
|| *(_DWORD *)(a1 + 4) != 2
|| *(_DWORD *)(a1 + 8) != 840
|| *(_DWORD *)(a1 + 12) != 113549
|| *(_DWORD *)(a1 + 16) != 1 )
{
return 0; /*0x7c20*/
}
return result; /*0x7c22*/
}
// Function: OidIsSha1 @ 0x7c24 (0x2a bytes)
__int64 __fastcall OidIsSha1(_DWORD *n4)
{
__int64 result; // rax
result = 1; /*0x7c24*/
if ( *n4 != 1 || n4[1] != 3 || n4[2] != 14 || n4[3] != 3 || n4[4] != 2 || n4[5] != 26 ) /*0x7c49*/
return 0; /*0x7c4b*/
return result; /*0x7c4d*/
}
// Function: OidIsNistSha @ 0x7c50 (0x40 bytes)
__int64 __fastcall OidIsNistSha(__int64 a1)
{
__int64 result; // rax
if ( *(_QWORD *)(a1 + 80) != 9 ) /*0x7c55*/
return 0; /*0x7c55*/
if ( *(_DWORD *)a1 != 2 ) /*0x7c5a*/
return 0; /*0x7c5a*/
if ( *(_DWORD *)(a1 + 4) != 16 ) /*0x7c60*/
return 0; /*0x7c60*/
if ( *(_DWORD *)(a1 + 8) != 840 ) /*0x7c69*/
return 0; /*0x7c69*/
result = 1; /*0x7c6b*/
if ( *(_DWORD *)(a1 + 12) != 1 /*0x7c8b*/
|| *(_DWORD *)(a1 + 16) != 101
|| *(_DWORD *)(a1 + 20) != 3
|| *(_DWORD *)(a1 + 24) != 4
|| *(_DWORD *)(a1 + 28) != 2 )
{
return 0; /*0x7c8d*/
}
return result; /*0x7c8f*/
}
// Function: SataConfig_6 @ 0x7c90 (0x1d7 bytes)
unsigned __int64 *__fastcall SataConfig_6(unsigned __int8 *a1, __int64 a2)
{
unsigned __int64 *buf_1; // rdi
unsigned __int8 *v5; // rbx
int v6; // eax
__int64 v7; // rcx
unsigned __int8 *buf_2; // rsi
unsigned __int64 v9; // r8
unsigned __int8 *p_buf_1; // rcx
__int64 v11; // rdx
int v12; // eax
__int64 v13; // rcx
unsigned __int8 *v14; // r8
unsigned __int64 n16; // r9
unsigned __int8 *buf; // [rsp+20h] [rbp-20h] BYREF
_BYTE v18[23]; // [rsp+29h] [rbp-17h]
unsigned __int8 *p_buf; // [rsp+70h] [rbp+30h] BYREF
buf_1 = (unsigned __int64 *)MmgrAlloc(0x440u); /*0x7cbc*/
MemGetInfo(buf_1, 0x440u); /*0x7cbf*/
if ( buf_1 )
{
buf_1[131] = (unsigned __int64)a1; /*0x7cd1*/
v5 = &a1[a2]; /*0x7cdb*/
v6 = SataConfig_7(a1, a2, &buf); /*0x7ce2*/
LOBYTE(v7) = v18[0]; /*0x7ceb*/
if ( v6 < 0 || v18[0] || *(_DWORD *)&v18[3] != 16 )
{
DebugLogPrint(
1,
"X509: Certificate did not start with a valid SEQUENCE - found class %d tag 0x%x",
v18[0],
*(unsigned int *)&v18[3]);
}
else
{
buf_2 = buf; /*0x7d08*/
p_buf = buf; /*0x7d12*/
buf_1[132] = (unsigned __int64)&buf[*(unsigned int *)&v18[7] - (_QWORD)a1]; /*0x7d19*/
v9 = (unsigned __int64)&buf_2[*(unsigned int *)&v18[7]]; /*0x7d23*/
if ( v9 <= (unsigned __int64)v5 )
{
if ( v9 < (unsigned __int64)v5 )
{
DebugHexdumpFlat(
v7,
(__int64)"X509: Ignoring extra data after DER encoded certificate",
v9,
&v5[-*(unsigned int *)&v18[7]] - buf_2);
v5 = &buf_2[*(unsigned int *)&v18[7]]; /*0x7d4a*/
}
buf_1[133] = (unsigned __int64)&buf_2[buf_1[131] - (_QWORD)a1]; /*0x7d67*/
if ( !(unsigned int)SataConfig_0(buf_2, v5 - buf_2, buf_1, &p_buf) )
{
p_buf_1 = p_buf; /*0x7d7e*/
v11 = v5 - p_buf; /*0x7d96*/
buf_1[134] = p_buf - buf_2; /*0x7d99*/
if ( !(unsigned int)X509ParseAlgorithmIdentifier(p_buf_1, v11, buf_1 + 115, &p_buf) )
{
v12 = SataConfig_7(p_buf, v5 - p_buf, &buf); /*0x7dbb*/
LOBYTE(v13) = v18[0]; /*0x7dc4*/
if ( v12 < 0 || v18[0] || *(_DWORD *)&v18[3] != 3 )
{
DebugLogPrint(
1,
"X509: Expected BITSTRING (signatureValue) - found class %d tag 0x%x",
v18[0],
*(unsigned int *)&v18[3]);
}
else if ( *(_DWORD *)&v18[7] )
{
if ( *buf == v18[0] )
{
v14 = buf + 1; /*0x7e0b*/
buf_1[126] = (unsigned __int64)(buf + 1); /*0x7e15*/
n16 = (unsigned int)(*(_DWORD *)&v18[7] - 1); /*0x7e20*/
buf_1[127] = n16; /*0x7e23*/
DebugHexdumpFlat(v13, (__int64)"X509: signature", (__int64)v14, n16);
return buf_1; /*0x7e32*/
}
DebugLogPrint(*(_DWORD *)&v18[3] - 2, "X509: Signature : BITSTRING - %d unused bits", *buf);
DebugLogPrint(
1,
"PKCS #1 v1.5 10.2.1: It is an error if the length in bits of the signature S is not a multiple of eight.");
}
}
}
}
}
}
return 0; /*0x7e5e*/
}
// Function: X509SignatureVerify @ 0x7e68 (0xb2 bytes)
__int64 __fastcall X509SignatureVerify(_QWORD *DeriveCtx, __int64 *a2)
{
__int64 v4; // rdx
if ( (unsigned int)OidIsRsa((__int64)(a2 + 6)) && *(_QWORD *)(v4 + 128) == 7 && *(_DWORD *)(v4 + 68) == 1 )
{
if ( *(_DWORD *)(v4 + 72) == 10 )
DebugLogPrint(1, "X509: RSASSA-PSS signature algorithm");
DebugLogPrint(1, "X509: Rsa PKCS-1 signature algorithm");
return SataConfig(DeriveCtx, (__int64)(a2 + 6), (unsigned __int8 *)a2[126], (void *)a2[127], a2[133], a2[134]); /*0x7eef*/
}
else
{
DebugLogPrint(1, "X509: Unrecognized signature algorithm");
return 0xFFFFFFFFLL; /*0x7f07*/
}
}
// Function: SataConfig @ 0x7f1c (0x49f bytes)
__int64 __fastcall SataConfig(
_QWORD *DeriveCtx,
__int64 a2,
unsigned __int8 *Signature,
void *va,
__int64 InputSize_,
__int64 n256)
{
__int64 v9; // rdx
__int64 v10; // r9
__int64 v11; // rbx
unsigned __int8 *buf_1; // rdi
char *p_va_1; // r12
__int64 v14; // rcx
unsigned __int8 *v15; // r15
int v16; // eax
int v18; // eax
char n2; // si
unsigned __int64 n5; // rdx
char *v21; // r14
int v22; // eax
__int64 v23; // rcx
__int64 n4_1; // rcx
unsigned __int8 *v25; // r8
unsigned __int8 *buf; // [rsp+30h] [rbp-D0h] BYREF
__int64 v27[2]; // [rsp+39h] [rbp-C7h]
unsigned __int64 n4; // [rsp+50h] [rbp-B0h] BYREF
int n840; // [rsp+58h] [rbp-A8h]
int n113549; // [rsp+5Ch] [rbp-A4h]
int n2_2; // [rsp+60h] [rbp-A0h]
int n5_1; // [rsp+64h] [rbp-9Ch]
int n2_1; // [rsp+70h] [rbp-90h]
__int64 n6; // [rsp+A0h] [rbp-60h]
unsigned __int8 *buf_2[4]; // [rsp+B0h] [rbp-50h] BYREF
char ResultBuf[64]; // [rs... [7112 chars total]
// Function: X509CertificateValidate @ 0x83bc (0x65 bytes)
__int64 __fastcall X509CertificateValidate(_QWORD *DeriveCtx)
{
int v1; // edx
v1 = *((_DWORD *)DeriveCtx + 256); /*0x83c0*/
if ( (v1 & 1) != 0 && !*((_DWORD *)DeriveCtx + 257) )
{
DebugLogPrint(1, "X509: Non-CA certificate used as an issuer");
return 0xFFFFFFFFLL; /*0x83ee*/
}
if ( *((_DWORD *)DeriveCtx + 4) == 2 && (DeriveCtx[128] & 1) == 0 )
{
DebugLogPrint(1, "X509: v3 CA certificate did not include BasicConstraints extension");
return 0xFFFFFFFFLL; /*0x8401*/
}
if ( (v1 & 4) != 0 && (*((_BYTE *)DeriveCtx + 1036) & 0x20) == 0 )
{
DebugLogPrint(1, "X509: Issuer certificate did not have keyCertSign bit in Key Usage");
return 0xFFFFFFFFLL; /*0x8418*/
}
return 0; /*0x841c*/
}
// Function: TcgConfig @ 0x8424 (0x23e bytes)
__int64 __fastcall TcgConfig(_QWORD *Ctx2, __int64 *Ctx1, _DWORD *p_p_va, double TempDouble)
{
int v4; // r12d
int v8; // eax
__int64 v9; // rcx
unsigned int v10; // ebp
unsigned int va_1; // ebx
__int64 v12; // r14
unsigned int va_2; // r9d
__int64 DeriveCtx; // rcx
_QWORD *Ctx2_1; // r14
__int64 v17; // [rsp+78h] [rbp+10h]
void *va; // [rsp+80h] [rbp+18h] BYREF
v4 = 0; /*0x8438*/
*p_p_va = 0; /*0x843e*/
DebugLogPrint(1, "X509: Validate certificate chain");
v8 = EpochTimeGet(&va); /*0x8463*/
v10 = 0; /*0x8468*/
if ( Ctx1 )
{
va_1 = (unsigned int)va; /*0x8473*/
v12 = v8; /*0x847b*/
v17 = v8; /*0x847e*/
do
{
X509DebugPrintDn(v9, (__int64)"X509: chain subject", (__int64)(Ctx1 + 59), TempDouble);
if ( !v4 )
{
if ( !v12 )
{
va_2 = *((_DWORD *)Ctx1 + 202); /*0x84a4*/
if ( va_1 < va_2 || va_1 > *((_DWORD *)Ctx1 + 203) )
DebugLogPrint(
2,
"X509: Certificate not valid (now=%x not_before=%x not_after=%x)",
va_1,
va_2,
*((_DWORD *)Ctx1 + 203));
}
if ( *Ctx1 )
{
if ( (unsigned int)X509NameCompare(Ctx1 + 17, *Ctx1 + 472) )
{
DebugLogPrint(1, "X509: Certificate chain issuer name mismatch");
*p_p_va = 5; /*0x8619*/
return 0xFFFFFFFFLL; /*0x8619*/
}
if ( (int)X509CertificateValidate((_QWORD *)*Ctx1) < 0 ) /*0x8503*/
goto LABEL_27; /*0x8503*/
DeriveCtx = *Ctx1; /*0x8509*/
if ( (*(_BYTE *)(*Ctx1 + 1024) & 2) != 0 && v10 > *(_DWORD *)(DeriveCtx + 1032) )
{
DebugLogPrint(
1,
"X509: pathLenConstraint not met (idx=%lx issuer pathLenConstraint=%lx)",
v10,
*(_DWORD *)(DeriveCtx + 1032));
LABEL_27:
*p_p_va = 1; /*0x8605*/
return 0xFFFFFFFFLL; /*0x8608*/
}
if ( (int)X509SignatureVerify((_QWORD *)DeriveCtx, Ctx1) < 0 )
{
DebugLogPrint(1, "X509: Invalid certificate signature within chain");
goto LABEL_27; /*0x8600*/
}
}
Ctx2_1 = Ctx2; /*0x8531*/
if ( Ctx2 )
{
do /*0x8556*/
{
if ( !(unsigned int)X509NameCompare(Ctx1 + 17, (__int64)(Ctx2_1 + 59)) ) /*0x8547*/
break; /*0x854e*/
Ctx2_1 = (_QWORD *)*Ctx2_1; /*0x8550*/
}
while ( Ctx2_1 ); /*0x8556*/
if ( Ctx2_1 )
{
DebugLogPrint(1, "X509: Found issuer from the list of trusted certificates");
X509CertificateValidate(Ctx2_1); /*0x8575*/
if ( (int)X509SignatureVerify(Ctx2_1, Ctx1) < 0 )
{
DebugLogPrint(1, "X509: Invalid certificate signature");
goto LABEL_27; /*0x862b*/
}
DebugLogPrint(1, "X509: Trusted certificate found to complete the chain");
*((_DWORD *)Ctx1 + 270) |= 4u; /*0x859c*/
v4 = 1; /*0x85a3*/
}
}
v12 = v17; /*0x85a6*/
}
Ctx1 = (__int64 *)*Ctx1; /*0x85ab*/
++v10; /*0x85ae*/
}
while ( Ctx1 );
if ( v4 ) /*0x85bd*/
goto LABEL_32; /*0x85bd*/
}
DebugLogPrint(1, "X509: Did not find any of the issuers from the list of trusted certificates");
if ( Ctx2 )
{
*p_p_va = 6; /*0x85d3*/
return 0xFFFFFFFFLL; /*0x861f*/
}
else
{
DebugLogPrint(1, "X509: Certificate chain validation disabled - ignore unknown CA issue");
LABEL_32:
DebugLogPrint(1, "X509: Certificate chain valid");
return 0; /*0x864b*/
}
}
// Function: GetInfo_2 @ 0x8664 (0x179 bytes)
void *__fastcall GetInfo_2(__int64 n3, char **InputSize, char *p_n256, _BYTE *ResultBuf)
{
unsigned int n0x14; // ebx
char **InputSize_1; // rdi
__int64 n3_1; // r14
__int64 v8; // rsi
unsigned int n8; // r8d
char *p_src; // r9
char v11; // cl
__int64 v12; // rax
unsigned __int64 v13; // r9
char v14; // al
char v15; // cl
unsigned __int64 v16; // rax
char buf_1[8]; // [rsp+20h] [rbp-60h] BYREF
int v19; // [rsp+28h] [rbp-58h]
int n271733878; // [rsp+2Ch] [rbp-54h]
int v21; // [rsp+30h] [rbp-50h]
__int64 buf_; // [rsp+34h] [rbp-4Ch] BYREF
_BYTE buf[68]; // [rsp+3Ch] [rbp-44h] BYREF
char src; // [rsp+B0h] [rbp+30h] BYREF
n0x14 = 0; /*0x8680*/
*(_DWORD *)buf_1 = 1732584193; /*0x8682*/
*(_DWORD *)&buf_1[4] = -271733879; /*0x8689*/
v19 = -1732584194; /*0x8693*/
n271733878 = 271733878; /*0x869d*/
InputSize_1 = InputSize; /*0x86a4*/
v21 = -1009589776; /*0x86a7*/
buf_ = 0; /*0x86b2*/
n3_1 = n3; /*0x86b6*/
if ( n3 ) /*0x86bc*/
{
v8 = p_n256 - (char *)InputSize; /*0x86be*/
do /*0x86d8*/
{
Sha1Update(buf_1, *InputSize_1, *(_DWORD *)((char *)InputSize_1 + v8)); /*0x86cc*/
++InputSize_1; /*0x86d1*/
--n3_1; /*0x86d4*/
}
while ( n3_1 ); /*0x86d8*/
}
n8 = 0; /*0x86da*/
p_src = &src; /*0x86dd*/
do /*0x8711*/
{
v11 = 8 * (3 - (n8 & 3)); /*0x86f2*/
v12 = -(__int64)(n8++ < 4); /*0x86f9*/
*p_src++ = *(_DWORD *)&buf[(v12 & 4) - 8] >> v11; /*0x8708*/
}
while ( n8 < 8 ); /*0x8711*/
Sha1Update(buf_1, (char *)buf_, 1u); /*0x8724*/
while ( (buf_ & 0x1F8) != 0x1C0 ) /*0x8750*/
Sha1Update(buf_1, (char *)&buf_[4], 1u); /*0x8740*/
Sha1Update(buf_1, &src, 8u); /*0x8759*/
v13 = 0; /*0x875e*/
do /*0x878b*/
{
v14 = n0x14++ & 3; /*0x8766*/
v15 = 3 - v14; /*0x876b*/
v16 = v13++ >> 2; /*0x8770*/
*ResultBuf++ = *(_DWORD *)&buf_1[4 * v16] >> (8 * v15); /*0x8782*/
}
while ( n0x14 < 0x14 ); /*0x878b*/
MemGetInfo(buf, 0x40u); /*0x8796*/
MemGetInfo(buf_1, 0x14u); /*0x87a4*/
MemGetInfo(&buf_, 8u); /*0x87b0*/
return MemGetInfo(&src, 8u); /*0x87d1*/
}
// Function: Sha1Transform @ 0x87e0 (0x1193 bytes)
void *__fastcall Sha1Transform(_DWORD *buf, char *src)
{
_DWORD *buf_1; // rdi
int v3; // ebx
int v4; // r11d
int v5; // r9d
int v6; // edx
int v7; // r10d
int v8; // r8d
int v9; // ecx
int v10; // r9d
int v11; // r11d
int v12; // ecx
int v13; // r10d
int v14; // edx
int v15; // ecx
int v16; // r11d
int v17; // r8d
int v18; // ecx
int v19; // edx
int v20; // r9d
int v21; // ecx
int v22; // r8d
int v23; // r10d
int v24; // r11d
int v25; // r9d
int v26; // ecx
int v27; // r10d
int v28; // edx
int v29; // ecx
int v30; // r11d
int v31; // r8d
int v32; // ecx
int v33; // edx
int v34; // ebx
int v35; // r9d
int v36; // r8d
int v37; // r9d
int v38; // r10d
int v39; // ebx
int v40; // r10d
int v41; // r11d
int v42; // r9d
int v43; // ecx
int v44; // r11d
int v45; // r10d
int v46; // edx
int v47; // ecx
int v48; // r11d
int v49; // r8d
int v50; // ecx
int v51; // edx
int v52; // r9d
int v53; // r1... [26588 chars total]
// Function: Sha1Update @ 0x9974 (0xd1 bytes)
char *__fastcall Sha1Update(char *buf, char *src, unsigned int n8)
{
unsigned int v3; // eax
int v7; // ecx
unsigned int v8; // r9d
char *n0x3F; // rax
int v10; // ebx
unsigned int i; // ebp
unsigned int count; // esi
v3 = *((_DWORD *)buf + 5); /*0x998d*/
v7 = (v3 >> 3) & 0x3F; /*0x999e*/
v8 = v3 + 8 * n8; /*0x99a1*/
*((_DWORD *)buf + 5) = v8; /*0x99ab*/
if ( v8 < 8 * n8 ) /*0x99b2*/
++*((_DWORD *)buf + 6); /*0x99b4*/
*((_DWORD *)buf + 6) += n8 >> 29; /*0x99bc*/
n0x3F = (char *)(v7 + n8); /*0x99bf*/
if ( (unsigned int)n0x3F <= 0x3F ) /*0x99c6*/
{
v10 = 0; /*0x9a0e*/
}
else
{
v10 = 64 - v7; /*0x99cd*/
MemConfig_0(&buf[v7 + 28], src, (unsigned int)(64 - v7)); /*0x99dd*/
n0x3F = (char *)Sha1Transform(buf, buf + 28); /*0x99e9*/
for ( i = v10 + 63; i < n8; i += 64 ) /*0x99ee*/
{
n0x3F = (char *)Sha1Transform(buf, &src[v10]); /*0x99fb*/
v10 += 64; /*0x9a00*/
}
v7 = 0; /*0x9a0a*/
}
count = n8 - v10; /*0x9a10*/
if ( count ) /*0x9a15*/
return MemConfig_0(&buf[v7 + 28], &src[v10], count); /*0x9a25*/
return n0x3F; /*0x9a3e*/
}
// Function: Sha384 @ 0x9a48 (0x120 bytes)
__int64 __fastcall Sha384(__int64 n3, char **InputSize, char *p_n256, char *ResultBuf)
{
__int64 n3_1; // r14
__int64 n0x80; // rax
char **InputSize_1; // rbx
__int64 v8; // rdi
__int64 v9[9]; // [rsp+20h] [rbp-E0h] BYREF
unsigned int n0x80_1; // [rsp+68h] [rbp-98h]
char ResultBufa[64]; // [rsp+F0h] [rbp-10h] BYREF
n3_1 = n3; /*0x9a67*/
n0x80 = 0; /*0x9a6a*/
v9[0] = 0; /*0x9a6c*/
v9[1] = 0xCBBB9D5DC1059ED8uLL; /*0x9a7b*/
v9[2] = 0x629A292A367CD507LL; /*0x9a8a*/
v9[3] = 0x9159015A3070DD17uLL; /*0x9a99*/
v9[4] = 0x152FECD8F70E5939LL; /*0x9aa8*/
v9[5] = 0x67332667FFC00B31LL; /*0x9ab7*/
v9[6] = 0x8EB44A8768581511uLL; /*0x9ac6*/
v9[7] = 0xDB0C2E0D64F98FA7uLL; /*0x9ad5*/
v9[8] = 0x47B5481DBEFA4FA4LL; /*0x9ae4*/
n0x80_1 = 0; /*0x9aec*/
InputSize_1 = InputSize; /*0x9af3*/
if ( n3 ) /*0x9af9*/
{
v8 = p_n256 - (char *)InputSize; /*0x9afb*/
do /*0x9b17*/
{
Sha512Update((__int64)v9, *InputSize_1, *(_DWORD *)((char *)InputSize_1 + v8)); /*0x9b0a*/
++InputSize_1; /*0x9b0f*/
--n3_1; /*0x9b13*/
}
while ( n3_1 ); /*0x9b17*/
n0x80 = n0x80_1; /*0x9b19*/
}
if ( ResultBuf && (unsigned int)n0x80 < 0x80 ) /*0x9b27*/
{
n0x80 = Sha512Final((__int64)v9, ResultBufa); /*0x9b32*/
if ( !(_DWORD)n0x80 ) /*0x9b39*/
return (__int64)MemConfig_0(ResultBuf, ResultBufa, 0x30u); /*0x9b46*/
}
return n0x80; /*0x9b63*/
}
// Function: MGF1Generate @ 0x9b68 (0x13b bytes)
__int64 __fastcall MGF1Generate(char *dst, unsigned int n32, _BYTE *ResultBuf, int count)
{
__int64 n32_1; // rsi
unsigned int n11; // ebx
char *ResultBuf_1; // rdi
unsigned int v10; // r15d
unsigned int v11; // eax
unsigned int n32_2; // ecx
__int64 v13; // rdx
__int64 p_n256[3]; // [rsp+20h] [rbp-30h] BYREF
__int64 InputSize[3]; // [rsp+38h] [rbp-18h] BYREF
n32_1 = n32; /*0x9b93*/
n11 = 0; /*0x9b9a*/
ResultBuf_1 = (char *)MmgrAlloc(n32); /*0x9b9c*/
if ( !ResultBuf_1 ) /*0x9ba2*/
return 13; /*0x9ba7*/
v10 = 0; /*0x9bac*/
LABEL_4:
if ( !count ) /*0x9bb2*/
goto LABEL_18; /*0x9bb2*/
ResultBuf_1[3] = v10; /*0x9bbb*/
*ResultBuf_1 = HIBYTE(v10); /*0x9bc7*/
ResultBuf_1[1] = BYTE2(v10); /*0x9bcf*/
v11 = v10++ >> 8; /*0x9bd5*/
ResultBuf_1[2] = v11; /*0x9bdb*/
InputSize[0] = (__int64)dst; /*0x9be2*/
p_n256[0] = n32_1; /*0x9be6*/
InputSize[1] = (__int64)ResultBuf_1; /*0x9bea*/
p_n256[1] = 4; /*0x9bee*/
switch ( (_DWORD)n32_1 ) /*0x9bf9*/
{
case 0x14: /*0x9bf9*/
GetInfo_2(2, (char **)InputSize, (char *)p_n256, ResultBuf_1); /*0x9c4b*/
LABEL_13:
n32_2 = 0; /*0x9c50*/
v13 = ResultBuf_1 - ResultBuf; /*0x9c55*/
while ( count ) /*0x9c5b*/
{
++n32_2; /*0x9c61*/
*ResultBuf = ResultBuf[v13]; /*0x9c63*/
--count; /*0x9c67*/
++ResultBuf; /*0x9c6a*/
if ( n32_2 >= (unsigned int)n32_1 ) /*0x9c6f*/
goto LABEL_4; /*0x9c6f*/
}
goto LABEL_18; /*0x9c5b*/
case 0x20: /*0x9bf9*/
GetInfo(2, (char **)InputSize, (char *)p_n256, ResultBuf_1); /*0x9c39*/
goto LABEL_13; /*0x9c3e*/
case 0x30: /*0x9bf9*/
Sha384(2, (char **)InputSize, (char *)p_n256, ResultBuf_1); /*0x9c27*/
goto LABEL_13; /*0x9c2c*/
case 0x40: /*0x9bf9*/
Sha512(2, (char **)InputSize, (char *)p_n256, ResultBuf_1); /*0x9c15*/
goto LABEL_13; /*0x9c1a*/
}
n11 = 11; /*0x9c76*/
LABEL_18:
GetInfo_7((__int64)ResultBuf_1); /*0x9c7b*/
return n11; /*0x9c96*/
}
// Function: RsaPssVerify @ 0x9ca4 (0x2ff bytes)
__int64 __fastcall RsaPssVerify(
unsigned int *ResultBuf,
unsigned int n32,
char *src,
int n0x1B,
unsigned int n8,
unsigned int n0x800)
{
unsigned int n8_1; // r12d
__int64 n32_1; // rsi
char *dst; // r14
_BYTE *ResultBuf_1; // rdi
unsigned __int64 dst_4; // rax
char *dst_1; // r15
char *src_1; // rcx
unsigned int n11; // ebx
int v15; // r13d
unsigned int count; // ebx
char v17; // cl
int v18; // r12d
__int64 count_2; // r8
char *dst_2; // rcx
__int64 v21; // rcx
unsigned int v22; // r13d
char *dst_3; // rax
unsigned __int64 v25; // [rsp+30h] [rbp-40h]
__int64 count_1; // [rsp+38h] [rbp-38h]
__int64 p_n256[3]; // [rsp+40h] [rbp-30h] BYREF
__int64 InputSize[3]; // [rsp+58h] [rbp-18h] BYREF
n8_1 = ((n0x800 & 7) != 0) + (n0x800 >> 3); /*0x9ce1*/
n32_1 = n32; /*0x9ce4*/
if ( n8 > n8_1 || n8_1 < n32 + n8 + 2 || n0x1B != n8_1 ) /*0x9d00*/
return 22; /*0x9f86*/
dst = (char *)MmgrAlloc(n8_1); /*0x9d11*/
ResultBuf_1 = (_BYTE *)MmgrAlloc(n8_1); /*0x9d1c*/
v25 = MmgrAlloc(n8_1); /*0x9d27*/
dst_4 = MmgrAlloc(n8_1); /*0x9d2b*/
dst_1 = (char *)dst_4; /*0x9d30*/
if ( dst )
{
if ( ResultBuf_1 && v25 && dst_4 )
{
src_1 = src; /*0x9d59*/
if ( src[n0x1B - 1] == -68 )
{
v15 = n8_1 - n32_1; /*0x9d74*/
count = n8_1 - n32_1 - 1; /*0x9d77*/
count_1 = count; /*0x9d7d*/
if ( n8_1 - (_DWORD)n32_1 != 1 ) /*0x9d83*/
{
MemConfig_0(dst, src, count); /*0x9d8e*/
src_1 = src; /*0x9d93*/
}
if ( (_DWORD)n32_1 ) /*0x9d9c*/
MemConfig_0(dst_1, &src_1[n8_1 - (unsigned int)n32_1 - 1], n32_1); /*0x9dab*/
v17 = 8 * n8_1 - n0x800 + 1; /*0x9dc3*/
v18 = 255 >> v17; /*0x9dc5*/
if ( ((unsigned __int8)~(255 >> v17) & (unsigned __int8)*src) == 0 )
{
n11 = MGF1Generate(dst_1, n32_1, ResultBuf_1, count); /*0x9de2*/
if ( n11 ) /*0x9de6*/
goto LABEL_35; /*0x9de6*/
if ( v15 != 1 ) /*0x9df2*/
{
count_2 = count_1; /*0x9df4*/
dst_2 = dst; /*0x9dfe*/
do /*0x9e0d*/
{
*dst_2 ^= dst_2[ResultBuf_1 - dst]; /*0x9e04*/
++dst_2; /*0x9e06*/
--count_2; /*0x9e09*/
}
while ( count_2 ); /*0x9e0d*/
}
v21 = 0; /*0x9e12*/
*dst &= v18; /*0x9e14*/
v22 = v15 - n8 - 2; /*0x9e1a*/
if ( v22 )
{
dst_3 = dst; /*0x9e20*/
while ( !*dst_3 ) /*0x9e26*/
{
v21 = (unsigned int)(v21 + 1); /*0x9e2c*/
++dst_3; /*0x9e2e*/
if ( (unsigned int)v21 >= v22 ) /*0x9e34*/
goto LABEL_23; /*0x9e34*/
}
}
else
{
LABEL_23:
if ( dst[v21] == 1 )
{
p_n256[2] = n8; /*0x9e4a*/
InputSize[2] = (__int64)&dst[(unsigned int)(v21 + 1)]; /*0x9e54*/
InputSize[0] = (__int64)ResultBuf_1; /*0x9e5b*/
p_n256[0] = 8; /*0x9e62*/
InputSize[1] = (__int64)ResultBuf; /*0x9e66*/
p_n256[1] = n32_1; /*0x9e6a*/
MemGetInfo(ResultBuf_1, 8u); /*0x9e6e*/
switch ( (_DWORD)n32_1 ) /*0x9e76*/
{
case 0x14: /*0x9e76*/
GetInfo_2(3, (char **)InputSize, (char *)p_n256, ResultBuf_1); /*0x9ee3*/
break;
case 0x20: /*0x9e76*/
GetInfo(3, (char **)InputSize, (char *)p_n256, ResultBuf_1); /*0x9ecc*/
break;
case 0x30: /*0x9e76*/
Sha384(3, (char **)InputSize, (char *)p_n256, ResultBuf_1); /*0x9eb5*/
break;
case 0x40: /*0x9e76*/
Sha512(3, (char **)InputSize, (char *)p_n256, ResultBuf_1); /*0x9e9e*/
break;
default:
n11 = 11; /*0x9e87*/
break;
}
DebugLogPrint(
1,
"PSS2: HashLen %X, err %d, Hash %X = %X",
n32_1,
n11,
*(_QWORD *)ResultBuf_1,
*(_QWORD *)dst_1);
if ( !n11 ) /*0x9f11*/
n11 = MemConfig((unsigned __int64)ResultBuf_1, (unsigned __int64)dst_1, n32_1) != 0; /*0x9f24*/
goto LABEL_35; /*0x9f24*/
}
}
}
}
n11 = 7; /*0x9d67*/
LABEL_35:
GetInfo_7((__int64)dst_1); /*0x9f27*/
GetInfo_7(v25); /*0x9f33*/
GetInfo_7((__int64)ResultBuf_1); /*0x9f3b*/
GetInfo_7((__int64)dst); /*0x9f43*/
return n11; /*0x9f4a*/
}
GetInfo_7((__int64)dst); /*0x9f4f*/
}
if ( ResultBuf_1 ) /*0x9f57*/
GetInfo_7((__int64)ResultBuf_1); /*0x9f5c*/
if ( v25 ) /*0x9f68*/
GetInfo_7(v25); /*0x9f6d*/
if ( dst_1 ) /*0x9f75*/
GetInfo_7((__int64)dst_1); /*0x9f7a*/
return 13; /*0x9f93*/
}
// Function: Sha512Transform @ 0x9fa4 (0x234 bytes)
__int64 __fastcall Sha512Transform(__int64 a1, __int64 a2)
{
_QWORD *v2; // rdi
__int64 n64; // rsi
unsigned __int8 *v6; // rdx
__int64 n16; // r9
__int64 v8; // rax
unsigned __int64 v9; // rcx
unsigned __int64 *v10; // r9
unsigned __int64 v11; // rcx
unsigned __int64 v12; // rdx
__int64 v13; // rcx
__int64 n80; // r11
__int64 v15; // rbx
__int64 v16; // r15
__int64 v17; // r10
__int64 v18; // r13
__int64 v19; // r12
__int64 v20; // rsi
__int64 v21; // r9
__int64 v22; // r8
__int64 v23; // r8
__int64 v24; // rdx
__int64 n8; // rdx
char KeyBuffer[8]; // [rsp+20h] [rbp-E0h] BYREF
__int64 v28; // [rsp+28h] [rbp-D8h]
__int64 v29; // [rsp+30h] [rbp-D0h]
__int64 v30; // [rsp+38h] [rbp-C8h]
__int64 v31; // [rsp+40h] [rbp-C0h]
__int64 v32; // [rsp+48h] [rbp-B8h]
__int64 v33; // [rsp+50h] [rbp-B0h]
__int64 v34; // [rsp+58h] [rbp-A8h]
_QWORD v35[14]; // [rsp+60h] [rbp-A0h] BYREF
char v36; // [rsp+D0h] [rbp-30h] BYREF
v2 = (_QWORD *)(a1 + 8); /*0x9fca*/
n64 = 64; /*0x9fd4*/
MemMove(KeyBuffer, (char *)(a1 + 8), 0x40u); /*0x9fe4*/
v6 = (unsigned __int8 *)(a2 + 2); /*0x9ff1*/
n16 = 16; /*0x9ff5*/
do /*0xa056*/
{
v8 = *v6; /*0xa008*/
v9 = (*(v6 - 1) | ((unsigned __int64)*(v6 - 2) << 8)) << 8; /*0xa00b*/
v6 += 8; /*0xa00f*/
*(_QWORD *)&v6[(_QWORD)v35 - a2 - 10] = *(v6 - 3) /*0xa04d*/
| ((*(v6 - 4)
| ((*(v6 - 5) | ((*(v6 - 6) | ((*(v6 - 7) | ((v8 | v9) << 8)) << 8)) << 8)) << 8)) << 8);
--n16; /*0xa052*/
}
while ( n16 ); /*0xa056*/
v10 = (unsigned __int64 *)&v36; /*0xa058*/
do /*0xa0a9*/
{
v11 = *(v10 - 13); /*0xa05c*/
v12 = *v10++; /*0xa060*/
v10[1] = *(v10 - 6) /*0xa0a1*/
+ *(v10 - 15)
+ ((v12 >> 6) ^ __ROL8__(v12, 3) ^ __ROR8__(v12, 19))
+ ((v11 >> 7) ^ __ROR8__(v11, 1) ^ __ROR8__(v11, 8));
--n64; /*0xa0a5*/
}
while ( n64 ); /*0xa0a9*/
v13 = v34; /*0xa0ab*/
n80 = 0; /*0xa0b0*/
v15 = v33; /*0xa0b3*/
v16 = v32; /*0xa0b8*/
v17 = v31; /*0xa0bd*/
v18 = v30; /*0xa0c2*/
v19 = v29; /*0xa0c7*/
v20 = v28; /*0xa0cc*/
v21 = *(_QWORD *)KeyBuffer; /*0xa0d1*/
do /*0xa168*/
{
v22 = v35[n80] /*0xa115*/
+ *(_QWORD *)((char *)&unk_13BB0 + n80 * 8)
+ (v15 ^ v17 & (v15 ^ v16))
+ (__ROR8__(v17, 14) ^ __ROR8__(v17, 18) ^ __ROL8__(v17, 23));
++n80; /*0xa11a*/
v23 = v13 + v22; /*0xa11e*/
v24 = (v21 & v20 | v19 & (v21 | v20)) + (__ROL8__(v21, 25) ^ __ROR8__(v21, 28) ^ __ROL8__(v21, 30)); /*0xa144*/
v13 = v15; /*0xa147*/
v15 = v16; /*0xa14a*/
v16 = v17; /*0xa14d*/
v17 = v23 + v18; /*0xa150*/
v18 = v19; /*0xa154*/
v19 = v20; /*0xa157*/
v20 = v21; /*0xa15a*/
v21 = v24 + v23; /*0xa15d*/
}
while ( n80 < 80 ); /*0xa168*/
v34 = v13; /*0xa16e*/
n8 = 8; /*0xa173*/
*(_QWORD *)KeyBuffer = v21; /*0xa17d*/
v31 = v17; /*0xa185*/
v33 = v15; /*0xa18a*/
v28 = v20; /*0xa18f*/
v32 = v16; /*0xa194*/
v29 = v19; /*0xa199*/
v30 = v18; /*0xa19e*/
do /*0xa1b3*/
{
*v2 += *(_QWORD *)&KeyBuffer[(_QWORD)v2 - a1 - 8]; /*0xa1a8*/
++v2; /*0xa1ab*/
--n8; /*0xa1af*/
}
while ( n8 ); /*0xa1b3*/
return 0; /*0xa1cb*/
}
// Function: Sha512Update @ 0xa1d8 (0xed bytes)
__int64 __fastcall Sha512Update(__int64 a1, char *src, unsigned int n0x80)
{
unsigned int n0x80_1; // esi
char *src_1; // rbp
__int64 result; // rax
bool i; // zf
unsigned int n0x80_2; // ebx
n0x80_1 = n0x80; /*0xa1f0*/
src_1 = src; /*0xa1f3*/
if ( !src || *(_DWORD *)(a1 + 72) > 0x80u ) /*0xa210*/
return 0xFFFFFFFFLL; /*0xa1fe*/
for ( i = n0x80 == 0; !i; i = n0x80_1 == 0 ) /*0xa212*/
{
if ( *(_DWORD *)(a1 + 72) || n0x80_1 < 0x80 ) /*0xa224*/
{
n0x80_2 = 128 - *(_DWORD *)(a1 + 72); /*0xa257*/
if ( n0x80_1 < n0x80_2 ) /*0xa25c*/
n0x80_2 = n0x80_1; /*0xa25c*/
if ( n0x80_2 ) /*0xa264*/
MemConfig_0((char *)(*(unsigned int *)(a1 + 72) + a1 + 76), src_1, n0x80_2); /*0xa276*/
*(_DWORD *)(a1 + 72) += n0x80_2; /*0xa27b*/
src_1 += n0x80_2; /*0xa27e*/
n0x80_1 -= n0x80_2; /*0xa281*/
if ( *(_DWORD *)(a1 + 72) == 128 ) /*0xa287*/
{
result = Sha512Transform(a1, a1 + 76); /*0xa290*/
if ( (_DWORD)result ) /*0xa297*/
return result; /*0xa297*/
*(_QWORD *)a1 += 1024LL; /*0xa299*/
*(_DWORD *)(a1 + 72) = 0; /*0xa2a0*/
}
}
else
{
MemConfig_0((char *)(a1 + 76), src_1, 0x80u); /*0xa230*/
result = Sha512Transform(a1, a1 + 76); /*0xa23c*/
if ( (_DWORD)result ) /*0xa243*/
return result; /*0xa243*/
*(_QWORD *)a1 += 1024LL; /*0xa245*/
src_1 += 128; /*0xa24c*/
n0x80_1 -= 128; /*0xa24f*/
}
}
return 0; /*0xa2bb*/
}
// Function: Sha512Final @ 0xa2c8 (0x123 bytes)
__int64 __fastcall Sha512Final(__int64 a1, _BYTE *ResultBuf)
{
__int64 v5; // rcx
__int64 n0x80; // rax
_BYTE *v7; // rcx
_BYTE *v8; // rdi
__int64 n8; // rdx
if ( !ResultBuf || *(_DWORD *)(a1 + 72) >= 0x80u ) /*0xa2ed*/
return 0xFFFFFFFFLL; /*0xa2dd*/
v5 = *(unsigned int *)(a1 + 72); /*0xa2ef*/
*(_QWORD *)a1 += 8LL * (unsigned int)v5; /*0xa2f8*/
*(_BYTE *)(v5 + a1 + 76) = 0x80; /*0xa2fb*/
n0x80 = (unsigned int)++*(_DWORD *)(a1 + 72); /*0xa302*/
if ( (unsigned int)n0x80 > 0x70 ) /*0xa308*/
{
while ( (unsigned int)n0x80 < 0x80 ) /*0xa319*/
{
*(_BYTE *)(n0x80 + a1 + 76) = 0; /*0xa30c*/
n0x80 = (unsigned int)++*(_DWORD *)(a1 + 72); /*0xa314*/
}
Sha512Transform(a1, a1 + 76); /*0xa322*/
*(_DWORD *)(a1 + 72) = 0; /*0xa327*/
}
while ( *(_DWORD *)(a1 + 72) < 0x78u ) /*0xa33c*/
*(_BYTE *)((unsigned int)(*(_DWORD *)(a1 + 72))++ + a1 + 76) = 0; /*0xa330*/
*(_BYTE *)(a1 + 196) = *(_BYTE *)(a1 + 7); /*0xa345*/
*(_BYTE *)(a1 + 197) = *(_BYTE *)(a1 + 6); /*0xa351*/
*(_BYTE *)(a1 + 198) = *(_BYTE *)(a1 + 5); /*0xa35a*/
*(_BYTE *)(a1 + 199) = *(_BYTE *)(a1 + 4); /*0xa363*/
*(_BYTE *)(a1 + 200) = *(_BYTE *)(a1 + 3); /*0xa36c*/
*(_BYTE *)(a1 + 201) = *(_BYTE *)(a1 + 2); /*0xa375*/
*(_BYTE *)(a1 + 202) = *(_BYTE *)(a1 + 1); /*0xa37e*/
*(_BYTE *)(a1 + 203) = *(_BYTE *)a1; /*0xa386*/
Sha512Transform(a1, a1 + 76); /*0xa38c*/
v7 = (_BYTE *)(a1 + 14); /*0xa391*/
v8 = &ResultBuf[-a1]; /*0xa395*/
n8 = 8; /*0xa398*/
do /*0xa3dc*/
{
v7[(_QWORD)v8 - 14] = v7[1]; /*0xa3a0*/
v7[(_QWORD)v8 - 13] = *v7; /*0xa3a6*/
v7[(_QWORD)v8 - 12] = *(v7 - 1); /*0xa3ad*/
v7[(_QWORD)v8 - 11] = *(v7 - 2); /*0xa3b4*/
v7[(_QWORD)v8 - 10] = *(v7 - 3); /*0xa3bb*/
v7[(_QWORD)v8 - 9] = *(v7 - 4); /*0xa3c2*/
v7[(_QWORD)v8 - 8] = *(v7 - 5); /*0xa3c9*/
v7[(_QWORD)v8 - 7] = *(v7 - 6); /*0xa3d0*/
v7 += 8; /*0xa3d4*/
--n8; /*0xa3d8*/
}
while ( n8 ); /*0xa3dc*/
return 0; /*0xa3e5*/
}
// Function: Sha512 @ 0xa3ec (0xef bytes)
__int64 __fastcall Sha512(__int64 n3, char **InputSize, char *p_n256, _BYTE *ResultBuf)
{
char **InputSize_1; // rbx
__int64 n3_1; // rsi
__int64 v7; // rdi
__int64 v9[9]; // [rsp+20h] [rbp-79h] BYREF
int v10; // [rsp+68h] [rbp-31h]
v10 = 0; /*0xa40b*/
v9[0] = 0; /*0xa419*/
v9[1] = 0x6A09E667F3BCC908LL; /*0xa421*/
v9[2] = 0xBB67AE8584CAA73BuLL; /*0xa42f*/
v9[3] = 0x3C6EF372FE94F82BLL; /*0xa43d*/
v9[4] = 0xA54FF53A5F1D36F1uLL; /*0xa44b*/
v9[5] = 0x510E527FADE682D1LL; /*0xa459*/
v9[6] = 0x9B05688C2B3E6C1FuLL; /*0xa467*/
v9[7] = 0x1F83D9ABFB41BD6BLL; /*0xa475*/
v9[8] = 0x5BE0CD19137E2179LL; /*0xa483*/
InputSize_1 = InputSize; /*0xa48a*/
n3_1 = n3; /*0xa48d*/
if ( n3 ) /*0xa493*/
{
v7 = p_n256 - (char *)InputSize; /*0xa495*/
do /*0xa4b0*/
{
Sha512Update((__int64)v9, *InputSize_1, *(_DWORD *)((char *)InputSize_1 + v7)); /*0xa4a3*/
++InputSize_1; /*0xa4a8*/
--n3_1; /*0xa4ac*/
}
while ( n3_1 ); /*0xa4b0*/
}
return Sha512Final((__int64)v9, ResultBuf); /*0xa4d6*/
}
// Function: MmgrAlloc @ 0xa4dc (0x108 bytes)
unsigned __int64 __fastcall MmgrAlloc(unsigned __int64 a1)
{
_QWORD *HeapAddr; // rbx
unsigned __int64 v3; // rcx
unsigned int n0xFF; // r9d
unsigned __int64 v5; // rdx
int v6; // r8d
_BYTE *v7; // r10
unsigned __int64 v9; // rdx
unsigned __int64 v10; // r8
HeapAddr = HeapAddr; /*0xa4e6*/
if ( HeapAddr ) /*0xa4f3*/
{
if ( !HeapAddr[2] ) /*0xa4f9*/
GetInfo_5(); /*0xa500*/
v3 = HeapAddr[2]; /*0xa505*/
n0xFF = (a1 >> 7) + ((a1 & 0x7F) != 0); /*0xa51b*/
if ( n0xFF <= 0xFF ) /*0xa525*/
{
v5 = HeapAddr[3]; /*0xa52b*/
v6 = 0; /*0xa52f*/
if ( v3 > v5 ) /*0xa535*/
{
LABEL_11:
DebugPrint(64, "====\nMMGR:Descriptor mem overflow %08X>%08X\n====", HeapAddr[2], HeapAddr[3]); /*0xa562*/
}
else
{
v7 = (_BYTE *)(v3 + 8); /*0xa537*/
do /*0xa55b*/
{
if ( !v7[1] && *v7 >= (unsigned __int8)n0xFF ) /*0xa545*/
{
*(_BYTE *)(v3 + 16LL * v6 + 9) = 1; /*0xa577*/
return *(_QWORD *)(v3 + 16LL * v6); /*0xa580*/
}
++v6; /*0xa547*/
v7 += 16; /*0xa54a*/
}
while ( v3 + 16LL * v6 <= v5 ); /*0xa55b*/
if ( v3 > v5 ) /*0xa560*/
goto LABEL_11; /*0xa560*/
v9 = *(_QWORD *)v3 + ((unsigned __int64)*(unsigned __int8 *)(v3 + 8) << 7); /*0xa58d*/
v10 = v9 + (n0xFF << 7); /*0xa594*/
if ( v9 != *(_QWORD *)v3 ) /*0xa59a*/
v3 -= 16LL; /*0xa59c*/
if ( HeapAddr[4] < v10 ) /*0xa5a4*/
HeapAddr[4] = v10; /*0xa5a6*/
if ( v10 < v3 ) /*0xa5ad*/
{
HeapAddr[2] = v3; /*0xa5af*/
*(_QWORD *)v3 = v9; /*0xa5b6*/
*(_BYTE *)(v3 + 8) = n0xFF; /*0xa5b9*/
*(_BYTE *)(v3 + 9) = 1; /*0xa5bd*/
return v9; /*0xa5c1*/
}
DebugPrint(64, "====>\nMMGR:Heap and Descriptor mem overlap %08X>%08X\n<====", v10, v3); /*0xa5d2*/
}
}
}
return 0; /*0xa5de*/
}
// Function: GetInfo_7 @ 0xa5e4 (0x91 bytes)
unsigned __int64 __fastcall GetInfo_7(__int64 a1)
{
unsigned __int64 count; // rax
_QWORD *HeapAddr; // rbx
int v3; // edi
unsigned __int64 count_2; // rcx
unsigned __int64 count_1; // r9
__int64 i; // rdx
void *buf; // r8
HeapAddr = HeapAddr; /*0xa5f3*/
v3 = 0; /*0xa5fa*/
if ( HeapAddr ) /*0xa602*/
{
if ( !HeapAddr[2] ) /*0xa604*/
count = (unsigned __int64)GetInfo_5(); /*0xa60a*/
count_2 = HeapAddr[2]; /*0xa60f*/
count_1 = HeapAddr[3]; /*0xa613*/
if ( count_2 <= count_1 ) /*0xa61a*/
{
for ( i = HeapAddr[2]; ; i += 16 ) /*0xa61c*/
{
if ( *(_BYTE *)(i + 9) == 1 ) /*0xa623*/
{
buf = *(void **)i; /*0xa625*/
if ( *(_QWORD *)i == a1 ) /*0xa62b*/
break; /*0xa62b*/
}
count = count_2 + 16LL * ++v3; /*0xa63a*/
if ( count > count_1 ) /*0xa640*/
return count; /*0xa640*/
}
*(_BYTE *)(count_2 + 16LL * v3 + 9) = 0; /*0xa64a*/
count = *(unsigned __int8 *)(count_2 + 16LL * v3 + 8) << 7; /*0xa654*/
if ( (_DWORD)count ) /*0xa65b*/
return (unsigned __int64)MemGetInfo(buf, (unsigned int)count); /*0xa660*/
}
}
return count; /*0xa66f*/
}
// Function: GetInfo_5 @ 0xa678 (0x10b bytes)
void *GetInfo_5()
{
_QWORD *HeapAddr; // rbx
void *result; // rax
__int64 v2; // r9
__int64 v3; // rax
__int64 v4; // r8
__int64 v5; // r8
unsigned __int64 count; // rdx
_QWORD *v7; // rcx
void *v8; // rax
__int64 i; // rcx
HeapAddr = HeapAddr; /*0xa682*/
if ( !HeapAddr ) /*0xa68c*/
return (void *)DebugPrint(64, "\n===>\n!!! Heap Addr %X !!!\n<===\n", 0); /*0xa69b*/
if ( HeapAddr[4] > *HeapAddr ) /*0xa6ac*/
{
DebugPrint(64, "\n===>\nMem Mgr Heap usage Statistics:\nHeap Size = %X\n", HeapAddr[3] - *HeapAddr); /*0xa6c7*/
v2 = HeapAddr[4]; /*0xa6cc*/
if ( v2 ) /*0xa6d3*/
v3 = v2 - *HeapAddr; /*0xa6dc*/
else
LODWORD(v3) = 0; /*0xa6d5*/
DebugPrint(64, "Heap Start= %08X\nHeap Used = %08X (sz %X)\n", *HeapAddr, v2, v3); /*0xa6f1*/
v4 = HeapAddr[2]; /*0xa6f6*/
if ( v4 ) /*0xa6fd*/
v5 = v4 - HeapAddr[4]; /*0xa709*/
else
v5 = HeapAddr[1] - 16LL; /*0xa703*/
DebugPrint(64, "Heap Free = %X\n\n", v5); /*0xa717*/
DebugPrint( /*0xa739*/
64,
"Desc Start= %08X\nDesc Used = %08X (sz %X)\n<===\n",
HeapAddr[3],
HeapAddr[2],
HeapAddr[3] - HeapAddr[2]);
}
count = HeapAddr[1]; /*0xa73e*/
if ( count ) /*0xa745*/
MemGetInfo((void *)*HeapAddr, count); /*0xa74a*/
v7 = (_QWORD *)HeapAddr[3]; /*0xa74f*/
v8 = (void *)*HeapAddr; /*0xa753*/
HeapAddr[2] = v7; /*0xa756*/
*v7 = v8; /*0xa75a*/
for ( i = 0; i < 2; ++i ) /*0xa75d*/
*(_BYTE *)(i + HeapAddr[2] + 8) = 0; /*0xa763*/
result = (void *)*HeapAddr; /*0xa771*/
HeapAddr[4] = *HeapAddr; /*0xa774*/
return result; /*0xa77d*/
}
// Function: Assert @ 0xa784 (0x93 bytes)
__int64 __fastcall Assert(_QWORD *HeapAddr, __int64 _nASSERT_EFI_ERROR_(Status___%r)_n)
{
if ( !HeapAddr ) /*0xa794*/
return DebugPrint(64, "\n===>\n!!! Heap Addr %X !!!\n<===\n", 0); /*0xa7a3*/
HeapAddr[2] = 0; /*0xa7aa*/
HeapAddr[1] = _nASSERT_EFI_ERROR_(Status___%r)_n - 40; /*0xa7b7*/
*HeapAddr = HeapAddr + 5; /*0xa7bf*/
HeapAddr[4] = HeapAddr + 5; /*0xa7c5*/
HeapAddr[3] = (char *)HeapAddr + _nASSERT_EFI_ERROR_(Status___%r)_n - 16; /*0xa7c9*/
DebugPrint( /*0xa7df*/
64,
"\n===>\nMem Mgr Init:\nHeap Start= %08X(sz %X)\n",
(_DWORD)HeapAddr + 40,
_nASSERT_EFI_ERROR_(Status___%r)_n - 56);
DebugPrint(64, "Heap End = %08X\n", HeapAddr[3]); /*0xa7f1*/
return DebugPrint(64, "Desc Start= %08X(sz %X)\n<===\n", HeapAddr[3], 16); /*0xa811*/
}
// Function: DateTimeToEpoch @ 0xa818 (0x1e8 bytes)
__int64 __fastcall DateTimeToEpoch(
int n50,
int a2,
int a3,
unsigned int n0x17,
unsigned int n0x3B,
unsigned int n50a,
_DWORD *a7)
{
double v7; // xmm3_8
unsigned int v11; // esi
__int64 v12; // r13
int n1970; // r8d
int n365; // eax
__int64 n14; // rcx
v11 = -1; /*0xa858*/
*a7 = 0; /*0xa863*/
v12 = a2; /*0xa866*/
DebugLogPrint(2, "Year=%d Month=%d Day=%d Hour=%d Min=%d Sec=%d", n50, a2, a3, n0x17, n0x3B, n50a); /*0xa87d*/
n1970 = 1970; /*0xa882*/
if ( n50 >= 1970 /*0xa8c3*/
&& (unsigned int)(v12 - 1) <= 0xB
&& (unsigned int)(a3 - 1) <= 0x1E
&& n0x17 <= 0x17
&& n0x3B <= 0x3B
&& n50a <= 0x3C )
{
*a7 = 0; /*0xa8c9*/
if ( n50 != 1970 ) /*0xa8db*/
{
do /*0xa93d*/
{
if ( n1970 % 4 || n1970 == 100 * (n1970 / 100) && n1970 != 400 * (n1970 / 400) ) /*0xa921*/
n365 = 365; /*0xa92a*/
else
n365 = 366; /*0xa923*/
++n1970; /*0xa935*/
*a7 += 86400 * n365; /*0xa938*/
}
while ( n1970 != n50 ); /*0xa93d*/
}
if ( (n50 & 3) != 0 || n50 == 100 * (n50 / 100) && n50 != 400 * (n50 / 400) ) /*0xa97e*/
n14 = 0; /*0xa987*/
else
n14 = 14; /*0xa980*/
*a7 += n50a + 60 * (n0x3B + 60 * (n0x17 + 24 * (a3 + dword_14080[n14 + v12] - 1))); /*0xa9b4*/
v11 = 0; /*0xa9b6*/
}
DebugLogPrint(2, "%x %a", *a7, v7); /*0xa9db*/
return v11; /*0xa9f3*/
}
// Function: EpochTimeGet @ 0xaa00 (0x74 bytes)
__int64 __fastcall EpochTimeGet(_DWORD *va)
{
__int64 result; // rax
int v3; // ecx
int v4; // [rsp+50h] [rbp+8h] BYREF
DebugLogPrint(2, "Time Now:"); /*0xaa15*/
result = DateTimeToEpoch( /*0xaa5a*/
(unsigned __int16)n50,
(unsigned __int8)byte_160FA,
(unsigned __int8)byte_160FB,
(unsigned __int8)n0x17,
(unsigned __int8)n0x3B,
(unsigned __int8)n50a,
&v4);
v3 = v4; /*0xaa5f*/
*va = v4; /*0xaa63*/
va[1] = 1000000 * v3; /*0xaa6b*/
return result; /*0xaa6e*/
}
// Function: DebugLogPrint @ 0xaa74 (0x73 bytes)
_UNKNOWN **DebugLogPrint(int n5, char *%a, ...)
{
_UNKNOWN **result; // rax
char KeyBuffer[264]; // [rsp+10h] [rbp-108h] BYREF
_UNKNOWN *retaddr; // [rsp+118h] [rbp+0h] BYREF
va_list va; // [rsp+130h] [rbp+18h] BYREF
va_start(va, %a);
if ( %a ) /*0xaa77*/
{
result = &retaddr; /*0xaa79*/
if ( byte_16108 ) /*0xaa99*/
{
FormatString((unsigned __int64)KeyBuffer, 0x100u, 0, (unsigned __int8 *)%a, (unsigned __int16 **)va); /*0xaab4*/
result = (_UNKNOWN **)DebugPrint(64, KeyBuffer); /*0xaac3*/
if ( n5 != 5 ) /*0xaacb*/
return (_UNKNOWN **)DebugPrint(64, "\n"); /*0xaad9*/
}
}
return result; /*0xaae6*/
}
// Function: DebugHexdumpFlat @ 0xaae8 (0xc3 bytes)
_UNKNOWN **__fastcall DebugHexdumpFlat(__int64 a1, __int64 a2, __int64 a3, unsigned __int64 n16)
{
double v4; // xmm2_8
unsigned __int64 n16_2; // rbx
unsigned __int64 n16_1; // rsi
_UNKNOWN **result; // rax
n16_2 = 0; /*0xab03*/
if ( byte_16108 ) /*0xab0d*/
{
n16_1 = n16; /*0xab13*/
if ( byte_16108 == 1 ) /*0xab19*/
n16_1 = 16; /*0xab1b*/
DebugLogPrint(5, "%a - hexdump(len=%x):", v4, n16); /*0xab2d*/
if ( a3 ) /*0xab35*/
{
if ( n16 ) /*0xab4a*/
{
do /*0xab6d*/
{
if ( n16_2 >= n16_1 ) /*0xab4f*/
break; /*0xab4f*/
DebugLogPrint(5, " %02x", *(unsigned __int8 *)(n16_2 + a3)); /*0xab62*/
++n16_2; /*0xab67*/
}
while ( n16_2 < n16 ); /*0xab6d*/
}
if ( n16 > n16_1 ) /*0xab72*/
DebugLogPrint(5, "...>>>"); /*0xab80*/
}
else
{
DebugLogPrint(0, " [NULL]"); /*0xab40*/
}
return DebugLogPrint(5, "\n"); /*0xab91*/
}
return result; /*0xaba5*/
}
// Function: DebugHexdumpAscii @ 0xabac (0x12e bytes)
_UNKNOWN **__fastcall DebugHexdumpAscii(__int64 a1, __int64 a2, unsigned __int8 *a3, unsigned __int64 n0x20)
{
double v4; // xmm2_8
_UNKNOWN **result; // rax
unsigned __int64 n0x20_1; // rsi
unsigned __int8 *v7; // rbp
unsigned __int64 n0x20_2; // rdi
unsigned __int64 i; // r14
unsigned __int8 *v10; // r14
unsigned __int64 n0x20_3; // r15
_UNKNOWN *retaddr; // [rsp+38h] [rbp+0h] BYREF
result = &retaddr; /*0xabac*/
n0x20_1 = n0x20; /*0xabd0*/
v7 = a3; /*0xabd3*/
if ( byte_16108 )
{
if ( a3 )
{
for ( result = DebugLogPrint(5, "%a - hexdump_ascii(len=%x):\n", v4, n0x20); n0x20_1; n0x20_1 -= n0x20_2 )
{
n0x20_2 = n0x20_1; /*0xac24*/
if ( n0x20_1 > 0x20 ) /*0xac29*/
n0x20_2 = 32; /*0xac29*/
DebugLogPrint(5, "\tHEX :"); /*0xac2d*/
for ( i = 0; i < n0x20_2; ++i ) /*0xac32*/
DebugLogPrint(5, " %02x", v7[i]); /*0xac48*/
DebugLogPrint(5, "\n\tASCII: ");
v10 = v7; /*0xac68*/
n0x20_3 = n0x20_2; /*0xac6b*/
do /*0xac9f*/
{
if ( (unsigned __int8)(*v10 - 32) > 0x5Eu ) /*0xac78*/
DebugLogPrint(5, "_"); /*0xac93*/
else
DebugLogPrint(5, "%c", *v10); /*0xac85*/
++v10; /*0xac98*/
--n0x20_3; /*0xac9b*/
}
while ( n0x20_3 ); /*0xac9f*/
result = DebugLogPrint(5, "\n"); /*0xacaa*/
v7 += n0x20_2; /*0xacaf*/
}
}
else
{
return DebugLogPrint(5, "%a - hexdump_ascii(len=%x): [NULL]\n", v4, n0x20);
}
}
return result; /*0xaccf*/
}
// Function: OidDebugPrint @ 0xacdc (0xc2 bytes)
_UNKNOWN **__fastcall OidDebugPrint(__int64 a1, __int64 a2, __int64 a3, double a4)
{
double v4; // xmm2_8
unsigned __int64 v5; // rbx
unsigned int *i; // rdi
int v8; // eax
__int64 v10; // [rsp+30h] [rbp-88h] BYREF
char v11; // [rsp+AFh] [rbp-9h]
_BYTE v12[8]; // [rsp+B0h] [rbp-8h] BYREF
v5 = 0; /*0xacf3*/
LOBYTE(v10) = 0; /*0xacf5*/
for ( i = (unsigned int *)&v10; v5 < *(_QWORD *)(a3 + 80); ++v5 ) /*0xad05*/
{
v8 = AsciiSPrint(i, v12 - (_BYTE *)i, "%a%d", a4, *(_DWORD *)(a3 + 4 * v5)); /*0xad3c*/
if ( v8 < 0 ) /*0xad43*/
break; /*0xad43*/
if ( v8 >= v12 - (_BYTE *)i ) /*0xad56*/
break; /*0xad56*/
i = (unsigned int *)((char *)i + v8); /*0xad58*/
}
v11 = 0; /*0xad69*/
return DebugLogPrint(2, "%a: %a", v4, a4);
}
// Function: X509DebugPrintDn @ 0xada0 (0x41 bytes)
_UNKNOWN **__fastcall X509DebugPrintDn(__int64 a1, __int64 a2, __int64 EntryPtr, double TempDouble)
{
double v4; // xmm2_8
unsigned int KeyBuffer[34]; // [rsp+20h] [rbp-88h] BYREF
X509FormatDn(EntryPtr, KeyBuffer, 128, TempDouble); /*0xadba*/
return DebugLogPrint(2, "%a: %a", v4, TempDouble);
}
// Function: BnAdd @ 0xade4 (0x110 bytes)
__int64 __fastcall BnAdd(int *a1, int *a2, int *a3)
{
int *v5; // rsi
int *v6; // r13
int *v7; // rax
__int64 j_2; // r15
int v9; // ebx
int j_3; // r12d
int v11; // ebp
__int64 result; // rax
int v13; // edx
int j_1; // ecx
int *v15; // r9
_DWORD *v16; // r8
_DWORD *i; // r10
int v18; // eax
unsigned int v19; // ebx
__int64 j; // r8
unsigned int v21; // ebx
v5 = a1; /*0xae08*/
if ( *a1 <= *a2 ) /*0xae0d*/
{
v6 = a2; /*0xae17*/
v7 = a1; /*0xae1a*/
a1 = a2; /*0xae1d*/
}
else
{
v6 = a1; /*0xae0f*/
v7 = a2; /*0xae12*/
}
j_2 = *a1; /*0xae20*/
v9 = 0; /*0xae23*/
j_3 = *v7; /*0xae25*/
v11 = j_2 + 1; /*0xae28*/
if ( a3[1] >= (int)j_2 + 1 || (result = BnResize((__int64)a3, v11), !(_DWORD)result) ) /*0xae3e*/
{
v13 = *a3; /*0xae44*/
j_1 = 0; /*0xae47*/
v15 = (int *)*((_QWORD *)a3 + 2); /*0xae49*/
*a3 = v11; /*0xae53*/
v16 = (_DWORD *)*((_QWORD *)v5 + 2); /*0xae56*/
for ( i = (_DWORD *)*((_QWORD *)a2 + 2); j_1 < j_3; v9 = v19 >> 28 ) /*0xae61*/
{
++j_1; /*0xae66*/
v18 = *v16++ + *i++; /*0xae68*/
v19 = v9 + v18; /*0xae75*/
*v15++ = v19 & 0xFFFFFFF; /*0xae7a*/
}
if ( j_3 != (_DWORD)j_2 ) /*0xae8c*/
{
for ( j = j_1; j < j_2; ++j ) /*0xae8e*/
{
v21 = *(_DWORD *)(*((_QWORD *)v6 + 2) + 4 * j) + v9; /*0xae97*/
*v15 = v21; /*0xae9b*/
*v15++ &= 0xFFFFFFFu; /*0xae9e*/
v9 = v21 >> 28; /*0xaea5*/
}
}
*v15 = v9; /*0xaeb0*/
if ( *a3 < v13 ) /*0xaeb6*/
MemSet(v15 + 1, 0, 4LL * (unsigned int)(v13 - *a3)); /*0xaec8*/
BnTrim((__int64)a3); /*0xaed0*/
return 0; /*0xaed5*/
}
return result; /*0xaee6*/
}
// Function: BnSub @ 0xaef4 (0xe5 bytes)
__int64 __fastcall BnSub(int *a1, unsigned int *a2, int *a3)
{
int v3; // esi
unsigned int v4; // ebx
__int64 v6; // rbp
__int64 result; // rax
int v10; // edx
int v11; // r8d
int *v12; // rcx
_DWORD *v13; // r10
char *v14; // r9
__int64 v15; // r11
int v16; // eax
int v17; // eax
unsigned int v18; // ebx
signed __int64 v19; // r9
__int64 v20; // r8
unsigned int v21; // eax
v3 = *a1; /*0xaf0c*/
v4 = 0; /*0xaf0e*/
v6 = *a2; /*0xaf13*/
if ( a3[1] >= *a1 || (result = BnResize(a3), !(_DWORD)result) ) /*0xaf2d*/
{
v10 = *a3; /*0xaf33*/
v11 = 0; /*0xaf35*/
v12 = (int *)*((_QWORD *)a3 + 2); /*0xaf38*/
*a3 = v3; /*0xaf3c*/
v13 = (_DWORD *)*((_QWORD *)a2 + 2); /*0xaf3e*/
v14 = (char *)*((_QWORD *)a1 + 2); /*0xaf48*/
if ( (int)v6 > 0 ) /*0xaf4e*/
{
v11 = v6; /*0xaf50*/
v15 = v6; /*0xaf53*/
do /*0xaf78*/
{
v16 = *(_DWORD *)v14; /*0xaf56*/
v14 += 4; /*0xaf59*/
v17 = v16 - *v13++; /*0xaf5d*/
v18 = v17 - v4; /*0xaf66*/
*v12++ = v18 & 0xFFFFFFF; /*0xaf6b*/
v4 = v18 >> 31; /*0xaf71*/
--v15; /*0xaf74*/
}
while ( v15 ); /*0xaf78*/
}
if ( v11 < v3 ) /*0xaf7d*/
{
v19 = v14 - (char *)v12; /*0xaf7f*/
v20 = (unsigned int)(v3 - v11); /*0xaf85*/
do /*0xafa0*/
{
v21 = *(int *)((char *)v12 + v19) - v4; /*0xaf8c*/
*v12 = v21; /*0xaf8e*/
*v12++ &= 0xFFFFFFFu; /*0xaf92*/
v4 = v21 >> 31; /*0xaf99*/
--v20; /*0xaf9c*/
}
while ( v20 ); /*0xafa0*/
}
if ( *a3 < v10 ) /*0xafa4*/
MemSet(v12, 0, 4LL * (unsigned int)(v10 - *a3)); /*0xafb1*/
BnTrim(a3); /*0xafb9*/
return 0; /*0xafbe*/
}
return result; /*0xafcf*/
}
// Function: BnAlloc @ 0xafdc (0x9e bytes)
__int64 __fastcall BnAlloc(_DWORD *a1)
{
int *buf; // rax
int *buf_1; // rdi
int n32; // esi
__int64 n128; // rcx
buf = (int *)MmgrAlloc(0x80u); /*0xaffd*/
buf_1 = a1 + 4; /*0xb002*/
*((_QWORD *)a1 + 2) = buf; /*0xb006*/
if ( !buf ) /*0xb00c*/
return 4294967294LL; /*0xb00e*/
n32 = 0; /*0xb015*/
if ( buf > buf_1 || buf + 31 < buf_1 ) /*0xb023*/
{
n32 = 32; /*0xb02d*/
MemSet(buf, 0, 0x80u); /*0xb032*/
}
if ( n32 < 32LL ) /*0xb03e*/
{
n128 = 4LL * n32; /*0xb040*/
do /*0xb052*/
{
*(_DWORD *)(n128 + *(_QWORD *)buf_1) = 0; /*0xb047*/
n128 += 4; /*0xb04b*/
}
while ( n128 < 128 ); /*0xb052*/
}
*a1 = 0; /*0xb054*/
a1[2] = 0; /*0xb057*/
a1[1] = 32; /*0xb05d*/
return 0; /*0xb073*/
}
// Function: BnFreeWords @ 0xb07c (0x42 bytes)
unsigned __int64 __fastcall BnFreeWords(__int64 a1)
{
int v2; // ecx
__int64 v3; // rdx
unsigned __int64 result; // rax
v2 = 0; /*0xb085*/
if ( *(int *)a1 > 0 ) /*0xb089*/
{
v3 = 0; /*0xb08b*/
do /*0xb09d*/
{
++v2; /*0xb091*/
*(_DWORD *)(v3 + *(_QWORD *)(a1 + 16)) = 0; /*0xb093*/
v3 += 4; /*0xb097*/
}
while ( v2 < *(_DWORD *)a1 ); /*0xb09d*/
}
result = GetInfo_7(*(_QWORD *)(a1 + 16)); /*0xb0a3*/
*(_QWORD *)(a1 + 16) = 0; /*0xb0a8*/
*(_DWORD *)a1 = 0; /*0xb0ad*/
*(_DWORD *)(a1 + 4) = 0; /*0xb0b0*/
*(_DWORD *)(a1 + 8) = 0; /*0xb0b4*/
return result; /*0xb0b8*/
}
// Function: BnAddOrSub @ 0xb0c0 (0x65 bytes)
__int64 __fastcall BnAddOrSub(int *a1, int *a2, int *a3)
{
int v3; // edi
int v4; // esi
int *v7; // r10
int *v8; // r11
unsigned int *v9; // rdx
int *v10; // rcx
v3 = a1[2]; /*0xb0cf*/
v4 = a2[2]; /*0xb0d5*/
if ( v3 == v4 ) /*0xb0e0*/
{
a3[2] = v3; /*0xb0e2*/
return BnAdd(a1, a2, a3); /*0xb0e6*/
}
else
{
if ( (unsigned int)BnCmp(a1, a2) == -1 ) /*0xb0f8*/
{
v7[2] = v4; /*0xb0fa*/
v9 = (unsigned int *)a1; /*0xb0fe*/
v10 = v8; /*0xb101*/
}
else
{
v7[2] = v3; /*0xb106*/
v9 = (unsigned int *)v8; /*0xb10a*/
v10 = a1; /*0xb10d*/
}
return BnSub(v10, v9, v7); /*0xb110*/
}
}
// Function: BnSubOrAdd @ 0xb128 (0x60 bytes)
__int64 __fastcall BnSubOrAdd(int *a1, int *a2, int *a3)
{
int v3; // edi
int *v6; // r10
int *v7; // r11
unsigned int *v8; // rdx
int *v9; // rcx
v3 = a1[2]; /*0xb132*/
if ( v3 == a2[2] ) /*0xb141*/
{
if ( (unsigned int)BnCmp(a1, a2) == -1 ) /*0xb159*/
{
v8 = (unsigned int *)a1; /*0xb169*/
v9 = v7; /*0xb16e*/
v6[2] = v3 == 0; /*0xb174*/
}
else
{
v6[2] = v3; /*0xb15b*/
v8 = (unsigned int *)v7; /*0xb15f*/
v9 = a1; /*0xb162*/
}
return BnSub(v9, v8, v6); /*0xb178*/
}
else
{
a3[2] = v3; /*0xb143*/
return BnAdd(a1, a2, a3); /*0xb147*/
}
}
// Function: BnMulDispatch @ 0xb188 (0x72 bytes)
__int64 __fastcall BnMulDispatch(int *a1, int *a2, int *a3)
{
int v3; // ebx
BOOL v5; // esi
int n512; // r9d
int *v7; // rax
__int64 result; // rax
v3 = 0; /*0xb19a*/
v5 = a1[2] != a2[2]; /*0xb1aa*/
n512 = *a2 + *a1 + 1; /*0xb1b2*/
if ( n512 >= 512 ) /*0xb1bc*/
goto LABEL_6; /*0xb1bc*/
v7 = a2; /*0xb1c1*/
if ( *a1 < *a2 ) /*0xb1c4*/
v7 = a1; /*0xb1c4*/
if ( *v7 > 256 ) /*0xb1ce*/
LABEL_6:
result = BnMulSimple(a1, (__int64)a2, (__int64)a3, n512); /*0xb1dd*/
else
result = GetInfo_3(a1, (__int64)a2, (__int64)a3, n512); /*0xb1d3*/
if ( *a3 > 0 ) /*0xb1e4*/
v3 = v5; /*0xb1e4*/
a3[2] = v3; /*0xb1ec*/
return result; /*0xb1f4*/
}
// Function: BnMulMod @ 0xb1fc (0x7e bytes)
__int64 __fastcall BnMulMod(int *a1, int *a2, __int64 a3, __int64 a4)
{
__int64 result; // rax
unsigned int v9; // ebx
int v10[4]; // [rsp+20h] [rbp-28h] BYREF
__int64 v11; // [rsp+30h] [rbp-18h]
result = BnAlloc((__int64)v10); /*0xb220*/
if ( !(_DWORD)result ) /*0xb227*/
{
v9 = BnMulDispatch(a1, a2, v10); /*0xb239*/
if ( !v9 ) /*0xb23d*/
v9 = BnModMulAdd(v10, a3, a4); /*0xb24f*/
if ( v11 ) /*0xb257*/
BnFreeWords((__int64)v10); /*0xb25e*/
return v9; /*0xb263*/
}
return result; /*0xb274*/
}
// Function: BnModMulAdd @ 0xb27c (0xbf bytes)
__int64 __fastcall BnModMulAdd(_DWORD *a1, int *a2, __int64 a3)
{
__int64 result; // rax
unsigned int v7; // esi
unsigned int v8; // ebx
__int128 v9; // xmm0
__int64 v10; // xmm1_8
__int64 v11; // xmm3_8
__int128 v12; // [rsp+20h] [rbp-20h] BYREF
__int64 v13; // [rsp+30h] [rbp-10h]
result = BnAlloc((__int64)&v12); /*0xb2a0*/
if ( !(_DWORD)result ) /*0xb2a7*/
{
v7 = BnModMul(a1, a2, 0, &v12); /*0xb2bb*/
if ( v7 ) /*0xb2bf*/
{
if ( v13 ) /*0xb2c6*/
BnFreeWords((__int64)&v12); /*0xb2cc*/
return v7; /*0xb2d1*/
}
else
{
if ( DWORD2(v12) == a2[2] ) /*0xb2db*/
{
v9 = *(_OWORD *)a3; /*0xb2f0*/
v8 = 0; /*0xb2f3*/
v10 = *(_QWORD *)(a3 + 16); /*0xb2f5*/
v11 = v13; /*0xb2fe*/
*(_OWORD *)a3 = v12; /*0xb303*/
*(_QWORD *)(a3 + 16) = v11; /*0xb306*/
v12 = v9; /*0xb30b*/
v13 = v10; /*0xb30f*/
}
else
{
v8 = BnAddOrSub(a2, (int *)&v12, (int *)a3); /*0xb2ec*/
}
if ( v13 ) /*0xb319*/
BnFreeWords((__int64)&v12); /*0xb31f*/
return v8; /*0xb324*/
}
}
return result; /*0xb335*/
}
// Function: BnCmp @ 0xb33c (0x53 bytes)
__int64 __fastcall BnCmp(__int64 a1, __int64 a2)
{
int v2; // r8d
__int64 v6; // rcx
unsigned int *v7; // rdx
__int64 v8; // r9
int v9; // eax
__int64 v10; // r9
unsigned int v11; // ecx
v2 = *(_DWORD *)a1; /*0xb33c*/
if ( *(_DWORD *)a1 > *(_DWORD *)a2 ) /*0xb348*/
return 1; /*0xb34f*/
if ( v2 < *(_DWORD *)a2 ) /*0xb350*/
return 0xFFFFFFFFLL; /*0xb352*/
v6 = v2 - 1; /*0xb35a*/
v7 = (unsigned int *)(*(_QWORD *)(a1 + 16) + 4 * v6); /*0xb361*/
v8 = *(_QWORD *)(a2 + 16) + 4 * v6; /*0xb369*/
v9 = 0; /*0xb36d*/
if ( v2 > 0 ) /*0xb372*/
{
v10 = v8 - (_QWORD)v7; /*0xb374*/
while ( 1 ) /*0xb377*/
{
v11 = *(unsigned int *)((char *)v7 + v10); /*0xb377*/
if ( *v7 > v11 ) /*0xb37d*/
break; /*0xb37d*/
if ( *v7 < v11 ) /*0xb37f*/
return 0xFFFFFFFFLL; /*0xb37f*/
++v9; /*0xb381*/
--v7; /*0xb383*/
if ( v9 >= v2 ) /*0xb38a*/
return 0; /*0xb38a*/
}
return 1; /*0xb37d*/
}
return 0; /*0xb34f*/
}
// Function: BnToBytes @ 0xb390 (0xe8 bytes)
__int64 __fastcall BnToBytes(__int64 a1, __int64 a2)
{
__int64 result; // rax
int v5; // edi
_BYTE *v6; // r14
unsigned int v7; // esi
_BYTE *v8; // rdx
__int64 v9; // r8
char v10; // cl
_DWORD v11[4]; // [rsp+20h] [rbp-28h] BYREF
_BYTE *v12; // [rsp+30h] [rbp-18h]
result = BnAlloc((__int64)v11); /*0xb3af*/
if ( !(_DWORD)result ) /*0xb3b6*/
{
result = BnCopy(a1, v11); /*0xb3c4*/
if ( !(_DWORD)result ) /*0xb3cb*/
{
v5 = 0; /*0xb3cd*/
if ( v11[0] ) /*0xb3d3*/
{
v6 = (_BYTE *)a2; /*0xb3d5*/
while ( 1 ) /*0xb3e5*/
{
++v5; /*0xb3e5*/
*v6++ = *v12; /*0xb3e9*/
v7 = BnRshiftBits((__int64)v11, 8, (__int64)v11, 0); /*0xb3fd*/
if ( v7 ) /*0xb401*/
break; /*0xb401*/
if ( !v11[0] ) /*0xb407*/
goto LABEL_7; /*0xb407*/
}
if ( v12 ) /*0xb468*/
BnFreeWords((__int64)v11); /*0xb46f*/
return v7; /*0xb474*/
}
else
{
LABEL_7:
if ( v5 - 1 > 0 ) /*0xb411*/
{
v8 = (_BYTE *)(v5 - 1 + a2); /*0xb416*/
v9 = -a2; /*0xb41a*/
do /*0xb436*/
{
v10 = *(_BYTE *)a2; /*0xb41f*/
*(_BYTE *)a2++ = *v8; /*0xb421*/
*v8-- = v10; /*0xb426*/
}
while ( v9 + a2 < (__int64)&v8[v9] ); /*0xb436*/
}
if ( v12 ) /*0xb43e*/
BnFreeWords((__int64)v11); /*0xb445*/
return 0; /*0xb44a*/
}
}
}
return result; /*0xb45b*/
}
// Function: BnRshiftBits @ 0xb478 (0x1a4 bytes)
__int64 __fastcall BnRshiftBits(_DWORD *a1, int n28, __int64 a3, __int128 *a4)
{
unsigned int v8; // r9d
__int64 result; // rax
unsigned int v10; // r15d
unsigned int v11; // r14d
int v12; // edi
int v13; // r11d
int v14; // r10d
int *i; // r9
int v16; // eax
__int128 v17; // xmm0
__int64 v18; // xmm1_8
__int64 v19; // xmm3_8
__int128 v20; // [rsp+20h] [rbp-20h] BYREF
__int64 v21; // [rsp+30h] [rbp-10h]
if ( n28 > 0 ) /*0xb4a0*/
{
result = BnAlloc((__int64)&v20); /*0xb4c6*/
if ( !(_DWORD)result ) /*0xb4cd*/
{
if ( a4 && (v10 = BnMaskBits(a1, n28, (__int64)&v20)) != 0 ) /*0xb4eb*/
{
if ( v21 ) /*0xb4f2*/
BnFreeWords((__int64)&v20); /*0xb4f8*/
return v10; /*0xb4fd*/
}
else
{
v11 = BnCopy((__int64)a1, a3); /*0xb510*/
if ( v11 ) /*0xb515*/
{
if ( v21 ) /*0xb51c*/
BnFreeWords((__int64)&v20); /*0xb522*/
return v11; /*0xb527*/
}
else
{
if ( n28 >= 28 && n28 / 28 > 0 ) /*0xb553*/
BnRshiftWords(a3, n28 / 28); /*0xb558*/
v12 = n28 % 28; /*0xb571*/
if ( v12 ) /*0xb573*/
{
v13 = 0; /*0xb58d*/
v14 = *(_DWORD *)a3 - 1; /*0xb590*/
for ( i = (int *)(*(_QWORD *)(a3 + 16) + 4LL * v14); v14 >= 0; --i ) /*0xb59b*/
{
v16 = (v13 << (28 - v12)) | ((unsigned int)*i >> v12); /*0xb5af*/
v13 = ((1 << v12) - 1) & *i; /*0xb5b2*/
--v14; /*0xb5b5*/
*i = v16; /*0xb5b9*/
}
}
BnTrim(a3); /*0xb5c5*/
if ( a4 ) /*0xb5cd*/
{
v17 = *a4; /*0xb5cf*/
v18 = *((_QWORD *)a4 + 2); /*0xb5d2*/
v19 = v21; /*0xb5db*/
*a4 = v20; /*0xb5e0*/
*((_QWORD *)a4 + 2) = v19; /*0xb5e3*/
v20 = v17; /*0xb5e8*/
v21 = v18; /*0xb5ec*/
}
if ( v21 ) /*0xb5f6*/
BnFreeWords((__int64)&v20); /*0xb5fc*/
return 0; /*0xb601*/
}
}
}
}
else
{
v8 = BnCopy((__int64)a1, a3); /*0xb4aa*/
if ( a4 ) /*0xb4b0*/
BnClear((__int64)a4); /*0xb4b5*/
return v8; /*0xb4ba*/
}
return result; /*0xb612*/
}
// Function: BnClear @ 0xb61c (0x26 bytes)
_DWORD *__fastcall BnClear(__int64 a1)
{
_DWORD *result; // rax
int v2; // edx
result = *(_DWORD **)(a1 + 16); /*0xb61c*/
v2 = 0; /*0xb623*/
*(_DWORD *)(a1 + 8) = 0; /*0xb626*/
for ( *(_DWORD *)a1 = 0; v2 < *(_DWORD *)(a1 + 4); ++result ) /*0xb631*/
{
*result = 0; /*0xb633*/
++v2; /*0xb636*/
}
return result; /*0xb641*/
}
// Function: BnCopy @ 0xb644 (0x6f bytes)
__int64 __fastcall BnCopy(__int64 a1, __int64 a2)
{
__int64 result; // rax
_DWORD *v5; // r8
int v6; // ecx
_DWORD *i; // rdx
if ( a1 == a2 ) /*0xb657*/
return 0; /*0xb6a6*/
if ( *(_DWORD *)(a2 + 4) >= *(_DWORD *)a1 || (result = BnResize(a2), !(_DWORD)result) ) /*0xb66a*/
{
v5 = *(_DWORD **)(a1 + 16); /*0xb66c*/
v6 = 0; /*0xb670*/
for ( i = *(_DWORD **)(a2 + 16); v6 < *(_DWORD *)a1; ++i ) /*0xb678*/
{
++v6; /*0xb67d*/
*i = *v5++; /*0xb67f*/
}
while ( v6 < *(_DWORD *)a2 ) /*0xb69a*/
{
*i++ = 0; /*0xb68f*/
++v6; /*0xb696*/
}
*(_DWORD *)a2 = *(_DWORD *)a1; /*0xb69e*/
*(_DWORD *)(a2 + 8) = *(_DWORD *)(a1 + 8); /*0xb6a3*/
return 0; /*0xb6a3*/
}
return result; /*0xb6ad*/
}
// Function: BnRshiftWords @ 0xb6b4 (0x4e bytes)
unsigned __int64 __fastcall BnRshiftWords(__int64 a1, int n512)
{
__int64 n512_1; // r9
_DWORD *v3; // r8
int v4; // edx
_DWORD *v5; // r11
unsigned __int64 result; // rax
n512_1 = n512; /*0xb6b7*/
if ( *(_DWORD *)a1 <= n512 ) /*0xb6bd*/
return (unsigned __int64)BnClear(a1); /*0xb6bd*/
v3 = *(_DWORD **)(a1 + 16); /*0xb6c3*/
v4 = 0; /*0xb6c7*/
v5 = &v3[n512_1]; /*0xb6cc*/
if ( *(_DWORD *)a1 - (int)n512_1 > 0 ) /*0xb6d3*/
{
do /*0xb6ec*/
{
++v4; /*0xb6d8*/
*v3++ = *v5++; /*0xb6da*/
result = (unsigned int)(*(_DWORD *)a1 - n512_1); /*0xb6e7*/
}
while ( v4 < (int)result ); /*0xb6ec*/
}
while ( v4 < *(_DWORD *)a1 ) /*0xb6fc*/
{
*v3++ = 0; /*0xb6f0*/
++v4; /*0xb6f8*/
}
*(_DWORD *)a1 -= n512_1; /*0xb6fe*/
return result; /*0xb701*/
}
// Function: BnTrim @ 0xb704 (0x29 bytes)
__int64 __fastcall BnTrim(__int64 a1)
{
bool v1; // zf
__int64 v2; // rdx
__int64 result; // rax
v1 = *(_DWORD *)a1 == 0; /*0xb707*/
if ( *(int *)a1 > 0 ) /*0xb70a*/
{
v2 = *(_QWORD *)(a1 + 16); /*0xb70c*/
do /*0xb721*/
{
result = *(_DWORD *)a1 - 1; /*0xb714*/
if ( *(_DWORD *)(v2 + 4 * result) ) /*0xb716*/
break; /*0xb71a*/
--*(_DWORD *)a1; /*0xb71c*/
}
while ( *(int *)a1 > 0 ); /*0xb721*/
v1 = *(_DWORD *)a1 == 0; /*0xb723*/
}
if ( v1 ) /*0xb726*/
*(_DWORD *)(a1 + 8) = 0; /*0xb728*/
return result; /*0xb72c*/
}
// Function: BnResize @ 0xb730 (0xeb bytes)
__int64 __fastcall BnResize(__int64 a1, int a2)
{
__int64 v3; // r14
int v4; // edi
unsigned __int64 v5; // rsi
unsigned __int64 v7; // rax
__int64 v8; // rcx
__int64 v9; // rdx
if ( *(_DWORD *)(a1 + 4) >= a2 ) /*0xb751*/
return 0; /*0xb751*/
v3 = *(_QWORD *)(a1 + 16); /*0xb76d*/
v4 = 64 - a2 % 32 + a2; /*0xb779*/
if ( v3 ) /*0xb785*/
{
if ( 4LL * v4 ) /*0xb77e*/
{
v7 = MmgrAlloc(4LL * v4); /*0xb7b0*/
v5 = v7; /*0xb7b5*/
if ( v7 ) /*0xb7bb*/
{
MemConfig_0(v7, v3, 4LL * v4); /*0xb7c6*/
GetInfo_7(v3); /*0xb7ce*/
goto LABEL_7; /*0xb7d3*/
}
}
else
{
GetInfo_7(*(_QWORD *)(a1 + 16)); /*0xb79c*/
}
v5 = 0; /*0xb7a1*/
}
else
{
v5 = MmgrAlloc(4LL * v4); /*0xb78f*/
}
LABEL_7:
if ( !v5 ) /*0xb7a6*/
return 4294967294LL; /*0xb7ab*/
v8 = *(int *)(a1 + 4); /*0xb7d5*/
*(_QWORD *)(a1 + 16) = v5; /*0xb7d9*/
*(_DWORD *)(a1 + 4) = v4; /*0xb7dd*/
if ( (int)v8 < v4 ) /*0xb7e2*/
{
v9 = 4 * v8; /*0xb7e7*/
do /*0xb7fc*/
{
LODWORD(v8) = v8 + 1; /*0xb7ef*/
*(_DWORD *)(v9 + *(_QWORD *)(a1 + 16)) = 0; /*0xb7f1*/
v9 += 4; /*0xb7f5*/
}
while ( (int)v8 < *(_DWORD *)(a1 + 4) ); /*0xb7fc*/
}
return 0; /*0xb814*/
}
// Function: BnLshiftBits @ 0xb81c (0xf5 bytes)
__int64 __fastcall BnLshiftBits(__int64 a1, int n28, __int64 a3)
{
__int64 result; // rax
int v6; // edx
int v7; // esi
int *v8; // r9
int v9; // r11d
int v10; // r10d
int v11; // edx
int v12; // eax
if ( a1 == a3 || (result = BnCopy(a1, a3), !(_DWORD)result) ) /*0xb844*/
{
v6 = n28 / 28 + *(_DWORD *)a3 + 1; /*0xb862*/
if ( *(_DWORD *)(a3 + 4) >= v6 || (result = BnResize(a3, v6), !(_DWORD)result) ) /*0xb873*/
{
if ( n28 < 28 || (result = BnGrowWords((int *)a3, n28 / 28), !(_DWORD)result) ) /*0xb88e*/
{
v7 = n28 % 28; /*0xb893*/
if ( v7 ) /*0xb895*/
{
v8 = *(int **)(a3 + 16); /*0xb897*/
v9 = 0; /*0xb8ad*/
v10 = 0; /*0xb8b0*/
if ( *(int *)a3 > 0 ) /*0xb8b6*/
{
do /*0xb8e0*/
{
++v10; /*0xb8bf*/
v11 = ((1 << v7) - 1) & ((unsigned int)*v8 >> (28 - v7)); /*0xb8c8*/
v12 = v9 | (*v8 << v7); /*0xb8cb*/
v9 = v11; /*0xb8ce*/
*v8++ = v12 & 0xFFFFFFF; /*0xb8d6*/
}
while ( v10 < *(_DWORD *)a3 ); /*0xb8e0*/
if ( v11 ) /*0xb8e4*/
*(_DWORD *)(*(_QWORD *)(a3 + 16) + 4LL * (int)(*(_DWORD *)a3)++) = v11; /*0xb8ed*/
}
}
BnTrim(a3); /*0xb8f5*/
return 0; /*0xb8fa*/
}
}
}
return result; /*0xb90b*/
}
// Function: BnGrowWords @ 0xb914 (0x8d bytes)
__int64 __fastcall BnGrowWords(int *a1, unsigned int n512)
{
__int64 n512_1; // rbx
int v4; // edx
__int64 result; // rax
__int64 v6; // r8
__int64 v7; // rcx
_DWORD *v8; // r9
int n512_2; // r8d
int *v10; // r10
__int64 v11; // rcx
int v12; // eax
n512_1 = n512; /*0xb91e*/
if ( (int)n512 <= 0 ) /*0xb925*/
return 0; /*0xb994*/
v4 = n512 + *a1; /*0xb929*/
if ( a1[1] >= v4 || (result = BnResize((__int64)a1, v4), !(_DWORD)result) ) /*0xb937*/
{
*a1 += n512_1; /*0xb939*/
v6 = *a1; /*0xb93b*/
v7 = *((_QWORD *)a1 + 2); /*0xb93e*/
v8 = (_DWORD *)(v7 - 4 + 4 * v6); /*0xb94f*/
n512_2 = v6 - 1; /*0xb953*/
v10 = (int *)(v7 - 4 + 4 * (*a1 - (__int64)(int)n512_1)); /*0xb95a*/
if ( n512_2 >= (int)n512_1 ) /*0xb961*/
{
v11 = (unsigned int)(n512_2 - n512_1 + 1); /*0xb966*/
do /*0xb97c*/
{
v12 = *v10--; /*0xb96a*/
*v8-- = v12; /*0xb971*/
--v11; /*0xb978*/
}
while ( v11 ); /*0xb97c*/
}
if ( (int)n512_1 > 0 ) /*0xb980*/
MemSet(*((int **)a1 + 2), 0, 4 * n512_1); /*0xb98f*/
return 0; /*0xb98f*/
}
return result; /*0xb99b*/
}
// Function: BnNumBits @ 0xb9a4 (0x2c bytes)
__int64 __fastcall BnNumBits(int *a1)
{
int v2; // ecx
__int64 result; // rax
unsigned int i; // r8d
v2 = *a1; /*0xb9a7*/
if ( !v2 ) /*0xb9ab*/
return 0; /*0xb9ad*/
result = (unsigned int)(28 * v2 - 28); /*0xb9b3*/
for ( i = *(_DWORD *)(*((_QWORD *)a1 + 2) + 4LL * (v2 - 1)); i; i >>= 1 ) /*0xb9c6*/
result = (unsigned int)(result + 1); /*0xb9c8*/
return result; /*0xb9af*/
}
// Function: BnMaskBits @ 0xb9d0 (0xba bytes)
__int64 __fastcall BnMaskBits(_DWORD *a1, int n28, __int64 a3)
{
__int64 result; // rax
int v6; // edx
int v7; // ecx
__int64 v8; // r8
if ( n28 <= 0 ) /*0xb9e1*/
{
BnClear(a3); /*0xb9e6*/
return 0; /*0xba7d*/
}
if ( n28 >= 28 * *a1 ) /*0xb9f8*/
return BnCopy((__int64)a1, a3); /*0xb9ff*/
result = BnCopy((__int64)a1, a3); /*0xba01*/
if ( !(_DWORD)result ) /*0xba08*/
{
v6 = n28 / 28; /*0xba1d*/
v7 = v6 + (n28 != 28 * v6); /*0xba27*/
if ( v7 < *(_DWORD *)a3 ) /*0xba2b*/
{
v8 = 4LL * v7; /*0xba30*/
do /*0xba45*/
{
++v7; /*0xba38*/
*(_DWORD *)(v8 + *(_QWORD *)(a3 + 16)) = 0; /*0xba3a*/
v8 += 4; /*0xba3f*/
}
while ( v7 < *(_DWORD *)a3 ); /*0xba45*/
}
*(_DWORD *)(*(_QWORD *)(a3 + 16) + 4LL * v6) &= (1 << (n28 % 0x1Cu)) - 1; /*0xba74*/
BnTrim(a3); /*0xba78*/
return 0; /*0xba78*/
}
return result; /*0xba84*/
}
// Function: BnModMul @ 0xba8c (0x556 bytes)
__int64 __fastcall BnModMul(_DWORD *a1, _DWORD *a2, __int128 *a3, __int128 *a4)
{
__int64 result; // rax
__int64 v8; // r10
unsigned int v9; // r9d
unsigned int v10; // ebx
int v11; // esi
int n27; // r9d
int n28_1; // edi
int v14; // r13d
int n512_1; // r15d
__int64 v16; // r10
__int64 v17; // rdi
bool v18; // zf
__int64 *v19; // rdx
__int64 *v20; // rcx
int v21; // ebx
__int64 v22; // r15
__int64 v23; // rax
unsigned __int64 v24; // rdx
unsigned int *v25; // rsi
unsigned __int64 n0xFFFFFFF; // rax
int v27; // eax
__int64 v28; // r10
int v29; // r9d
int v30; // eax
_DWORD *v31; // rcx
int v32; // eax
_DWORD *v33; // rcx
int v34; // eax
__int128 v35; // xmm0
BOOL v36; // eax
__int64 v37; // xmm1_8
__int64 v38; // xmm3_8
__int128 v39; // xmm0
__int64 v40; // xmm1_8
__int64 v41; // xmm3_8
__int64 v42[2]; // [rsp+20h] [rbp-79h] BYREF
__int64 v43; // [rsp+30h] [rbp-69h]
int n512; // [rsp+38h] [rbp-61h]
__int64 v4... [9533 chars total]
// Function: BnSqr @ 0xbfe4 (0x565 bytes)
__int64 __fastcall BnSqr(_DWORD *a1, int *a2, int *a3, __int128 *a4)
{
_DWORD *v4; // rsi
int n3529; // eax
int n6; // edi
__int64 result; // rax
int v9; // r14d
int v10; // r12d
int v11; // ebx
unsigned int v12; // esi
unsigned int v13; // ebx
int *v14; // r14
int v15; // esi
int v16; // esi
int v17; // r14d
int n28; // r8d
int *v19; // rdx
int v20; // eax
int n2; // r15d
__int64 v22; // rcx
unsigned int v23; // r9d
int n6_1; // esi
int v25; // r14d
__int64 v26; // rbx
unsigned int *v27; // rdi
__int64 v28; // rax
unsigned int v29; // edx
int v30; // edx
int v31; // esi
int v32; // edi
_DWORD *v33; // xmm3_8
__int128 v34; // xmm0
_DWORD *v35; // xmm1_8
__int64 v36; // rdi
unsigned int *v37; // rsi
__int128 v38; // [rsp+20h] [rbp-E0h] BYREF
_DWORD *v39; // [rsp+30h] [rbp-D0h]
int n28_1; // [rsp+38h] [rbp-C8h]
unsigned int v41; // [rsp+3Ch] [rbp-C4h]
__int64 v42; // [rsp+40h] [rbp-C0h]
__int128 v43; // [rsp... [10370 chars total]
// Function: BnSqrDispatch @ 0xc54c (0x39 bytes)
__int64 __fastcall BnSqrDispatch(int *a1, __int64 a2)
{
__int64 result; // rax
if ( 2 * *a1 >= 511 || *a1 >= 128 ) /*0xc567*/
result = BnSqrWords_simple(a1, (__int128 *)a2); /*0xc576*/
else
result = BnSqrWords(a1, (int *)a2); /*0xc56c*/
*(_DWORD *)(a2 + 8) = 0; /*0xc57b*/
return result; /*0xc57f*/
}
// Function: BnSetBit @ 0xc588 (0x72 bytes)
__int64 __fastcall BnSetBit(__int64 a1, int a2)
{
__int64 v4; // rcx
__int64 result; // rax
BnClear(a1); /*0xc5a1*/
result = BnResize(v4, a2 / 28 + 1); /*0xc5bf*/
if ( !(_DWORD)result ) /*0xc5c6*/
{
*(_DWORD *)a1 = a2 / 28 + 1; /*0xc5d0*/
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 4LL * (a2 / 28)) = 1 << (a2 % 28); /*0xc5e0*/
return 0; /*0xc5e3*/
}
return result; /*0xc5f4*/
}
// Function: BnModExp @ 0xc5fc (0x18e bytes)
__int64 __fastcall BnModExp(unsigned int *a1, unsigned int *a2, int *a3)
{
unsigned int n0x8000000; // esi
__int64 result; // rax
unsigned int i_2; // eax
unsigned int i_1; // ebx
int n512; // r14d
unsigned int i; // eax
unsigned int v12; // eax
bool v13; // zf
unsigned int *v14; // rdx
unsigned int *v15; // rcx
__int64 v16[2]; // [rsp+20h] [rbp-20h] BYREF
_DWORD *v17; // [rsp+30h] [rbp-10h]
n0x8000000 = *a2; /*0xc617*/
result = BnAlloc(v16); /*0xc626*/
if ( !(_DWORD)result ) /*0xc62d*/
{
result = BnCopy((__int64)a1, (__int64)v16); /*0xc63a*/
if ( !(_DWORD)result ) /*0xc641*/
{
if ( (int)(n0x8000000 - 1) > 0 ) /*0xc64c*/
BnRshiftWords((__int64)v16, n0x8000000 - 1); /*0xc652*/
if ( n0x8000000 <= 0x8000000 ) /*0xc668*/
i_2 = BnMulAdd((int *)v16, (__int64)a3, (__int128 *)v16, n0x8000000); /*0xc674*/
else
i_2 = BnMulDispatch((int *)v16, a3, (int *)v16); /*0xc66a*/
i_1 = i_2; /*0xc679*/
if ( !i_2 ) /*0xc67d*/
{
n512 = n0x8000000 + 1; /*0xc683*/
if ( (int)(n0x8000000 + 1) > 0 ) /*0xc68a*/
BnRshiftWords((__int64)v16, n512); /*0xc693*/
i_1 = BnMaskBits(a1, 28 * (n0x8000000 + 1), (__int64)a1); /*0xc6a9*/
if ( !i_1 ) /*0xc6ad*/
{
i_1 = BnMulSimple((int *)v16, (__int64)a2, (__int64)v16, n512); /*0xc6c6*/
if ( !i_1 ) /*0xc6ca*/
{
i_1 = BnSubOrAdd((int *)a1, (int *)v16, (int *)a1); /*0xc6df*/
if ( !i_1 ) /*0xc6e3*/
{
if ( a1[2] != 1 ) /*0xc6eb*/
goto LABEL_17; /*0xc6eb*/
BnClear((__int64)v16); /*0xc6f1*/
LODWORD(v16[0]) = 1; /*0xc6fd*/
*v17 = 1; /*0xc700*/
i_1 = BnGrowWords((int *)v16, n512); /*0xc70b*/
if ( !i_1 ) /*0xc70f*/
{
for ( i = BnAddOrSub((int *)a1, (int *)v16, (int *)a1); ; i = BnSub((int *)a1, a2, (int *)a1) ) /*0xc71b*/
{
i_1 = i; /*0xc759*/
if ( i ) /*0xc75d*/
break; /*0xc75d*/
LABEL_17:
v12 = a1[2]; /*0xc722*/
if ( v12 == a2[2] ) /*0xc729*/
{
if ( v12 == 1 ) /*0xc731*/
{
v14 = a1; /*0xc733*/
v15 = a2; /*0xc736*/
}
else
{
v14 = a2; /*0xc73b*/
v15 = a1; /*0xc73e*/
}
v13 = (unsigned int)BnCmp((__int64)v15, (__int64)v14) == -1; /*0xc746*/
}
else
{
v13 = v12 == 1; /*0xc72b*/
}
if ( v13 ) /*0xc749*/
break; /*0xc749*/
}
}
}
}
}
}
if ( v17 ) /*0xc764*/
BnFreeWords((__int64)v16); /*0xc76a*/
return i_1; /*0xc76f*/
}
}
return result; /*0xc780*/
}
// Function: BnMulSimple @ 0xc78c (0x169 bytes)
__int64 __fastcall BnMulSimple(int *a1, __int64 a2, __int64 a3, int n512)
{
__int64 v5; // rsi
int *v8; // r10
__int64 result; // rax
__int64 v10; // r10
int v11; // r8d
__int64 v12; // rdx
int n512_1; // r9d
unsigned __int64 v14; // r12
int n512_2; // ecx
unsigned int *v16; // rsi
_DWORD *v17; // r15
int n512_3; // r11d
__int64 v19; // r10
__int64 n512_4; // r13
__int64 v21; // rcx
unsigned __int64 v22; // rcx
__int128 v23; // xmm0
__int64 v24; // xmm3_8
bool v25; // zf
__int64 v26; // [rsp+20h] [rbp-20h]
__int128 v27; // [rsp+28h] [rbp-18h] BYREF
__int64 v28; // [rsp+38h] [rbp-8h]
v5 = a3; /*0xc7b2*/
if ( n512 < 512 ) /*0xc7c2*/
{
v8 = (int *)a2; /*0xc7c6*/
if ( *a1 < *(_DWORD *)a2 ) /*0xc7cb*/
v8 = a1; /*0xc7cb*/
if ( *v8 < 256 ) /*0xc7d6*/
return GetInfo_3(a1, a2, a3, n512); /*0xc7d8*/
}
result = BnAllocTemp((__int64)&v27, n512); /*0xc7e8*/
if ( !(_DWORD)result ) /*0xc7ef*/
{
v10 = *a1; /*0xc7f5*/
v11 = 0; /*0xc7f8*/
v12 = 0; /*0xc7fb*/
LODWORD(v27) = n512; /*0xc7fd*/
v26 = v10; /*0xc800*/
if ( v10 > 0 ) /*0xc807*/
{
n512_1 = n512; /*0xc80d*/
do /*0xc890*/
{
LODWORD(v14) = 0; /*0xc814*/
n512_2 = n512_1; /*0xc81b*/
v16 = *(unsigned int **)(a2 + 16); /*0xc821*/
if ( *(_DWORD *)a2 < n512_1 ) /*0xc825*/
n512_2 = *(_DWORD *)a2; /*0xc825*/
v17 = (_DWORD *)(v28 + 4LL * v11); /*0xc830*/
n512_3 = 0; /*0xc834*/
if ( n512_2 > 0 ) /*0xc839*/
{
v19 = *(unsigned int *)(*((_QWORD *)a1 + 2) + 4 * v12); /*0xc83b*/
n512_3 = n512_2; /*0xc83e*/
n512_4 = (unsigned int)n512_2; /*0xc841*/
do /*0xc873*/
{
v21 = *v16++; /*0xc847*/
v22 = (unsigned int)v14 + (unsigned int)*v17 + v19 * v21; /*0xc857*/
v14 = v22 >> 28; /*0xc864*/
*v17++ = v22 & 0xFFFFFFF; /*0xc868*/
--n512_4; /*0xc86f*/
}
while ( n512_4 ); /*0xc873*/
v10 = v26; /*0xc875*/
}
if ( n512_3 + v11 < n512 ) /*0xc87f*/
*v17 = v14; /*0xc881*/
++v11; /*0xc884*/
--n512_1; /*0xc887*/
++v12; /*0xc88a*/
}
while ( v12 < v10 ); /*0xc890*/
v5 = a3; /*0xc896*/
}
BnTrim((__int64)&v27); /*0xc89e*/
v23 = *(_OWORD *)v5; /*0xc8a3*/
v24 = v28; /*0xc8af*/
v28 = *(_QWORD *)(v5 + 16); /*0xc8b4*/
v25 = v28 == 0; /*0xc8b9*/
*(_OWORD *)v5 = v27; /*0xc8be*/
*(_QWORD *)(v5 + 16) = v24; /*0xc8c1*/
v27 = v23; /*0xc8c6*/
if ( !v25 ) /*0xc8ca*/
BnFreeWords((__int64)&v27); /*0xc8d0*/
return 0; /*0xc8d5*/
}
return result; /*0xc8e8*/
}
// Function: GetInfo_3 @ 0xc8f8 (0x16f bytes)
__int64 __fastcall GetInfo_3(int *a1, __int64 a2, __int64 a3, int n512)
{
int v4; // ebx
__int64 v6; // rdi
__int64 result; // rax
int n512_1; // ebp
unsigned __int64 v11; // rsi
__int64 n512_3; // r12
int v13; // r9d
__int64 n512_4; // r8
__int64 v15; // r13
int v16; // ebp
__int64 v17; // rdi
int v18; // r15d
int v19; // edx
int v20; // r10d
unsigned int *v21; // r11
unsigned int *v22; // r14
__int64 v23; // rdx
__int64 v24; // rcx
__int64 v25; // rax
int v26; // eax
int v27; // edx
int *buf_1; // rcx
__int64 v29; // r8
int v30; // eax
_DWORD buf[526]; // [rsp+20h] [rbp-838h] BYREF
int n512_2; // [rsp+878h] [rbp+20h]
v4 = 0; /*0xc914*/
v6 = a3; /*0xc919*/
if ( *(_DWORD *)(a3 + 4) >= n512 || (result = BnResize(a3, n512), !(_DWORD)result) ) /*0xc935*/
{
n512_1 = *(_DWORD *)a2 + *a1; /*0xc943*/
if ( n512 < n512_1 ) /*0xc94d*/
n512_1 = n512; /*0xc94d*/
v11 = 0; /*0xc950*/
n512_2 = n512_1; /*0xc953*/
MemGetInfo(buf, 0x800u); /*0xc95a*/
n512_3 = n512_1; /*0xc95f*/
v13 = 0; /*0xc962*/
if ( n512_1 > 0 ) /*0xc967*/
{
n512_4 = 0; /*0xc970*/
v15 = *((_QWORD *)a1 + 2); /*0xc973*/
v16 = *a1; /*0xc977*/
v17 = *(_QWORD *)(a2 + 16); /*0xc97a*/
v18 = *(_DWORD *)a2 - 1; /*0xc97e*/
do /*0xc9f2*/
{
v19 = v13; /*0xc985*/
if ( v18 < v13 ) /*0xc98e*/
v19 = v18; /*0xc98e*/
v20 = v16 - (v13 - v19); /*0xc994*/
v21 = (unsigned int *)(v15 + 4LL * (v13 - v19)); /*0xc9a5*/
v22 = (unsigned int *)(v17 + 4LL * v19); /*0xc9a8*/
if ( v20 >= v19 + 1 ) /*0xc9b2*/
v20 = v19 + 1; /*0xc9b2*/
if ( v20 > 0 ) /*0xc9b9*/
{
v23 = (unsigned int)v20; /*0xc9bb*/
do /*0xc9d7*/
{
v24 = *v22--; /*0xc9be*/
v25 = *v21++; /*0xc9c5*/
v11 += v25 * v24; /*0xc9d0*/
--v23; /*0xc9d3*/
}
while ( v23 ); /*0xc9d7*/
}
++v13; /*0xc9db*/
v26 = v11 & 0xFFFFFFF; /*0xc9de*/
v11 >>= 28; /*0xc9e3*/
buf[n512_4++] = v26; /*0xc9e7*/
}
while ( n512_4 < n512_3 ); /*0xc9f2*/
v6 = a3; /*0xc9f4*/
n512_1 = n512_2; /*0xc9fc*/
}
v27 = *(_DWORD *)v6; /*0xca03*/
buf_1 = *(int **)(v6 + 16); /*0xca08*/
v29 = 0; /*0xca0c*/
*(_DWORD *)v6 = n512_1; /*0xca0f*/
if ( n512_1 + 1 > 0 ) /*0xca16*/
{
v4 = n512_1 + 1; /*0xca18*/
do /*0xca2c*/
{
v30 = buf[v29++]; /*0xca1b*/
*buf_1++ = v30; /*0xca23*/
}
while ( v29 < n512_1 + 1 ); /*0xca2c*/
}
if ( v4 < v27 ) /*0xca30*/
MemSet(buf_1, 0, 4LL * (unsigned int)(v27 - v4)); /*0xca3d*/
BnTrim(v6); /*0xca45*/
return 0; /*0xca4a*/
}
return result; /*0xca54*/
}
// Function: BnAllocTemp @ 0xca68 (0x84 bytes)
__int64 __fastcall BnAllocTemp(__int64 a1, int n512)
{
int v3; // edi
unsigned __int64 v4; // rax
v3 = 64 - n512 % 32 + n512; /*0xca9a*/
v4 = MmgrAlloc(4LL * v3); /*0xcaa6*/
*(_QWORD *)(a1 + 16) = v4; /*0xcaab*/
if ( !v4 ) /*0xcab2*/
return 4294967294LL; /*0xcab4*/
*(_DWORD *)a1 = 0; /*0xcabb*/
*(_DWORD *)(a1 + 8) = 0; /*0xcabe*/
*(_DWORD *)(a1 + 4) = v3; /*0xcac2*/
if ( v3 > 0 ) /*0xcac7*/
MemSet(v4, 0, 4LL * v3); /*0xcad5*/
return 0; /*0xcae6*/
}
// Function: BnSqrWords_simple @ 0xcaec (0x177 bytes)
__int64 __fastcall BnSqrWords_simple(int *a1, __int128 *a2)
{
__int64 v2; // rdi
__int128 *v3; // rbx
__int64 result; // rax
__int64 v6; // r9
int *v7; // rbx
__int64 v8; // r11
int v9; // r14d
int *v10; // rsi
__int64 v11; // rdi
__int64 v12; // r12
__int64 v13; // r13
__int64 v14; // r8
unsigned __int64 v15; // r8
int v16; // eax
unsigned __int64 v17; // r8
int *v18; // r10
__int64 v19; // rbx
__int64 v20; // rcx
__int64 v21; // rcx
int v22; // eax
int v23; // eax
__int128 v24; // xmm0
int *v25; // xmm3_8
bool v26; // zf
__int128 v27; // [rsp+20h] [rbp-20h] BYREF
int *v28; // [rsp+30h] [rbp-10h]
v2 = *a1; /*0xcb0f*/
v3 = a2; /*0xcb12*/
result = BnAllocTemp((__int64)&v27, 2 * (int)v2 + 1); /*0xcb25*/
if ( !(_DWORD)result ) /*0xcb2c*/
{
LODWORD(v27) = 2 * v2 + 1; /*0xcb32*/
v6 = v2; /*0xcb35*/
if ( (int)v2 > 0 ) /*0xcb3a*/
{
v7 = v28; /*0xcb40*/
v8 = 1; /*0xcb44*/
v9 = 1; /*0xcb48*/
v10 = v28; /*0xcb4b*/
v11 = 0; /*0xcb4e*/
v12 = v6; /*0xcb50*/
do /*0xcbfe*/
{
v13 = v8; /*0xcb57*/
v14 = *(unsigned int *)(*((_QWORD *)a1 + 2) + v11); /*0xcb5a*/
v15 = (unsigned int)*v10 + v14 * v14; /*0xcb64*/
v16 = v15; /*0xcb67*/
v17 = v15 >> 28; /*0xcb6a*/
*v10 = v16 & 0xFFFFFFF; /*0xcb73*/
v18 = &v7[v9]; /*0xcb7f*/
if ( v8 < v6 ) /*0xcb86*/
{
v19 = *(unsigned int *)(v11 + *((_QWORD *)a1 + 2)); /*0xcb88*/
do /*0xcbbe*/
{
v20 = *(unsigned int *)(*((_QWORD *)a1 + 2) + 4 * v13++); /*0xcb8e*/
v21 = v19 * v20; /*0xcb98*/
v22 = (v17 + *v18 + 2 * v21) & 0xFFFFFFF; /*0xcbac*/
LODWORD(v17) = ((unsigned int)v17 + (unsigned __int64)(unsigned int)*v18 + 2 * v21) >> 28; /*0xcbb1*/
*v18++ = v22; /*0xcbb4*/
}
while ( v13 < v6 ); /*0xcbbe*/
v7 = v28; /*0xcbc0*/
}
for ( ; (_DWORD)v17; ++v18 ) /*0xcbc7*/
{
v23 = (v17 + *v18) & 0xFFFFFFF; /*0xcbd8*/
LODWORD(v17) = ((unsigned int)v17 + (unsigned __int64)(unsigned int)*v18) >> 28; /*0xcbdd*/
*v18 = v23; /*0xcbe0*/
}
v9 += 2; /*0xcbeb*/
v10 += 2; /*0xcbef*/
v11 += 4; /*0xcbf3*/
++v8; /*0xcbf7*/
--v12; /*0xcbfa*/
}
while ( v12 ); /*0xcbfe*/
v3 = a2; /*0xcc04*/
}
BnTrim((__int64)&v27); /*0xcc0c*/
v24 = *v3; /*0xcc11*/
v25 = v28; /*0xcc1d*/
v28 = (int *)*((_QWORD *)v3 + 2); /*0xcc22*/
v26 = v28 == 0; /*0xcc27*/
*v3 = v27; /*0xcc2c*/
*((_QWORD *)v3 + 2) = v25; /*0xcc2f*/
v27 = v24; /*0xcc34*/
if ( !v26 ) /*0xcc38*/
BnFreeWords((__int64)&v27); /*0xcc3e*/
return 0; /*0xcc43*/
}
return result; /*0xcc56*/
}
// Function: BnMulAdd @ 0xcc64 (0x132 bytes)
__int64 __fastcall BnMulAdd(int *a1, __int64 a2, __int128 *a3, int n0x8000000)
{
__int64 n0x8000000_1; // rbx
__int128 *v7; // rdi
__int64 result; // rax
__int64 v9; // rdx
int n0x8000000_2; // r8d
__int64 v11; // r9
_DWORD *v12; // rdi
unsigned __int64 v13; // r11
_DWORD *v14; // r10
unsigned int *v15; // r12
__int64 v16; // r13
__int64 v17; // r15
__int64 v18; // rcx
unsigned __int64 v19; // rcx
__int128 v20; // xmm0
__int64 v21; // xmm3_8
bool v22; // zf
__int128 v23; // [rsp+20h] [rbp-20h] BYREF
__int64 v24; // [rsp+30h] [rbp-10h]
n0x8000000_1 = n0x8000000; /*0xcc95*/
v7 = a3; /*0xcc9f*/
result = BnAllocTemp((__int64)&v23, *a1 + 1 + *(_DWORD *)a2); /*0xcca2*/
if ( !(_DWORD)result ) /*0xcca9*/
{
v9 = 0; /*0xccb2*/
n0x8000000_2 = *(_DWORD *)a2; /*0xccb4*/
v11 = *a1; /*0xccb7*/
LODWORD(v23) = *(_DWORD *)a2 + v11 + 1; /*0xccc0*/
if ( (int)v11 > 0 ) /*0xccc5*/
{
v12 = (_DWORD *)(v24 + 4 * n0x8000000_1); /*0xcccb*/
do /*0xcd35*/
{
LODWORD(v13) = 0; /*0xccd3*/
v14 = v12; /*0xccd9*/
v15 = (unsigned int *)(*(_QWORD *)(a2 + 16) + 4LL * (int)n0x8000000_1); /*0xcce4*/
if ( (int)n0x8000000_1 < n0x8000000_2 ) /*0xcceb*/
{
v16 = *(unsigned int *)(*((_QWORD *)a1 + 2) + 4 * v9); /*0xcced*/
v17 = (unsigned int)(n0x8000000_2 - n0x8000000_1); /*0xccf3*/
do /*0xcd28*/
{
v18 = *v15++; /*0xccf9*/
v19 = (unsigned int)v13 + (unsigned int)*v14 + v16 * v18; /*0xcd0c*/
v13 = v19 >> 28; /*0xcd19*/
*v14++ = v19 & 0xFFFFFFF; /*0xcd1d*/
--v17; /*0xcd24*/
}
while ( v17 ); /*0xcd28*/
}
LODWORD(n0x8000000_1) = n0x8000000_1 - 1; /*0xcd2a*/
*v14 = v13; /*0xcd2c*/
++v9; /*0xcd2f*/
}
while ( v9 < v11 ); /*0xcd35*/
v7 = a3; /*0xcd37*/
}
BnTrim((__int64)&v23); /*0xcd3f*/
v20 = *v7; /*0xcd44*/
v21 = v24; /*0xcd50*/
v24 = *((_QWORD *)v7 + 2); /*0xcd55*/
v22 = v24 == 0; /*0xcd5a*/
*v7 = v23; /*0xcd5f*/
*((_QWORD *)v7 + 2) = v21; /*0xcd62*/
v23 = v20; /*0xcd67*/
if ( !v22 ) /*0xcd6b*/
BnFreeWords((__int64)&v23); /*0xcd71*/
return 0; /*0xcd76*/
}
return result; /*0xcd89*/
}
// Function: BnLshift @ 0xcd98 (0x1de bytes)
__int64 __fastcall BnLshift(int *a1, int *a2, int a3)
{
int v3; // r12d
int v5; // ebx
int v6; // edx
int v7; // r13d
__int64 result; // rax
_QWORD *v10; // rcx
int *v11; // r15
int *v12; // r8
int v13; // edx
__int64 v14; // r9
__int64 v15; // rax
__int64 v16; // r14
int v17; // ebp
int v18; // r8d
_QWORD *v19; // rdx
_QWORD *v20; // r10
_QWORD *v21; // rcx
unsigned int *v22; // r9
__int64 v23; // r13
__int64 v24; // r11
__int64 v25; // rax
__int64 v26; // r11
__int64 v27; // rax
int v28; // r8d
char *v29; // rcx
signed __int64 v30; // rdx
__int64 v31; // r8
_DWORD *v32; // rdx
int v33; // eax
__int64 v34; // rcx
_QWORD v35[519]; // [rsp+20h] [rbp-1038h] BYREF
__int64 v36; // [rsp+1060h] [rbp+8h]
v3 = *a1; /*0xcdb4*/
v5 = 0; /*0xcdbc*/
v6 = *a2 + 1; /*0xcdbe*/
v7 = a3; /*0xcdc0*/
if ( a1[1] >= v6 || (result = BnResize((__int64)a1, v6), !(_DWORD)result) ) /*0xcdd2*/
{
v10 = v35; /*0xcdd8*/
v11 = (int *)*((_QWORD *)a1 + 2); /*0xcddd*/
v12 = v11; /*0xcde1*/
v13 = 0; /*0xcde4*/
if ( *a1 > 0 ) /*0xcde8*/
{
v13 = *a1; /*0xcdea*/
v14 = (unsigned int)*a1; /*0xcdec*/
do /*0xce01*/
{
v15 = (unsigned int)*v12++; /*0xcdef*/
*v10++ = v15; /*0xcdf6*/
--v14; /*0xcdfd*/
}
while ( v14 ); /*0xce01*/
}
v16 = *a2; /*0xce03*/
v17 = 2 * v16 + 1; /*0xce06*/
if ( v13 < v17 ) /*0xce10*/
MemSet(v10, 0, 8LL * (unsigned int)(v17 - v13)); /*0xce1e*/
v18 = 0; /*0xce23*/
if ( (int)v16 > 0 ) /*0xce29*/
{
v19 = v35; /*0xce2e*/
v36 = (unsigned int)v16; /*0xce33*/
v20 = v35; /*0xce3b*/
v18 = v16; /*0xce40*/
do /*0xcea7*/
{
v21 = v20; /*0xce45*/
v22 = (unsigned int *)*((_QWORD *)a2 + 2); /*0xce48*/
v23 = (v7 * *(_DWORD *)v19) & 0xFFFFFFF; /*0xce5a*/
v24 = (unsigned int)v16; /*0xce5d*/
do /*0xce76*/
{
v25 = *v22++; /*0xce60*/
*v21++ += v23 * v25; /*0xce6b*/
--v24; /*0xce72*/
}
while ( v24 ); /*0xce76*/
v26 = v36; /*0xce78*/
v7 = a3; /*0xce80*/
++v20; /*0xce8b*/
v19[1] += *v19 >> 28; /*0xce93*/
++v19; /*0xce97*/
--v36; /*0xce9f*/
}
while ( v26 != 1 ); /*0xcea7*/
}
v27 = v18; /*0xcea9*/
v28 = v18 + 1; /*0xceb1*/
v29 = (char *)&v35[v28]; /*0xcec0*/
if ( v28 <= v17 ) /*0xcec7*/
{
v30 = (char *)&v35[v27] - v29; /*0xcec9*/
v31 = (unsigned int)(v17 - v28 + 1); /*0xcecf*/
do /*0xcee6*/
{
*(_QWORD *)v29 += *(_QWORD *)&v29[v30] >> 28; /*0xcedb*/
v29 += 8; /*0xcede*/
--v31; /*0xcee2*/
}
while ( v31 ); /*0xcee6*/
}
v32 = &v35[v16]; /*0xcef1*/
if ( (int)v16 + 1 > 0 ) /*0xcef7*/
{
do /*0xcf13*/
{
++v5; /*0xcefb*/
v33 = *v32 & 0xFFFFFFF; /*0xcefd*/
v32 += 2; /*0xcf02*/
*v11++ = v33; /*0xcf06*/
}
while ( v5 < *a2 + 1 ); /*0xcf13*/
}
if ( v5 < v3 ) /*0xcf18*/
MemSet(v11, 0, 4LL * (unsigned int)(v3 - v5)); /*0xcf29*/
*a1 = *a2 + 1; /*0xcf35*/
BnTrim((__int64)a1); /*0xcf37*/
if ( (unsigned int)BnCmp(v34, (__int64)a2) == -1 ) /*0xcf47*/
return 0; /*0xcf59*/
else
return BnSub(a1, (unsigned int *)a2, a1); /*0xcf52*/
}
return result; /*0xcf63*/
}
// Function: BnModHalf @ 0xcf78 (0x146 bytes)
__int64 __fastcall BnModHalf(int *a1, int *a2)
{
int v4; // edi
__int64 result; // rax
int i; // edi
int v7; // edx
int v8; // edx
unsigned int v9; // r11d
int *v10; // r9
int v11; // r10d
int *v12; // rcx
unsigned int v13; // r8d
int v14; // eax
unsigned int v15; // r8d
int v16; // eax
v4 = (int)BnNumBits(a2) % 28; /*0xcfb0*/
if ( *a2 <= 1 ) /*0xcfb8*/
{
BnClear((__int64)a1); /*0xcfd0*/
v4 = 1; /*0xcfdb*/
**((_DWORD **)a1 + 2) = 1; /*0xcfe0*/
*a1 = **((_DWORD **)a1 + 2) != 0; /*0xcfef*/
}
else
{
result = BnSetBit((__int64)a1, v4 + 28 * *a2 - 29); /*0xcfc2*/
if ( (_DWORD)result ) /*0xcfc9*/
return result; /*0xcfc9*/
}
for ( i = v4 - 1; i < 28; ++i ) /*0xcff1*/
{
v7 = *a1 + 1; /*0xcffe*/
if ( a1[1] < v7 ) /*0xd003*/
{
result = BnResize((__int64)a1, v7); /*0xd008*/
if ( (_DWORD)result ) /*0xd00f*/
return result; /*0xd00f*/
}
v8 = *a1; /*0xd015*/
v9 = 0; /*0xd017*/
v10 = (int *)*((_QWORD *)a1 + 2); /*0xd01a*/
v11 = 0; /*0xd01e*/
v12 = v10; /*0xd021*/
if ( *a1 > 0 ) /*0xd026*/
{
do /*0xd04f*/
{
++v11; /*0xd02b*/
v13 = *v10++; /*0xd02e*/
v14 = 2 * v13; /*0xd035*/
v15 = v13 >> 27; /*0xd037*/
v16 = v9 | v14; /*0xd03b*/
v9 = v15; /*0xd03e*/
*v12++ = v16 & 0xFFFFFFF; /*0xd046*/
}
while ( v11 < *a1 ); /*0xd04f*/
if ( v15 ) /*0xd054*/
{
*v12 = 1; /*0xd056*/
++*a1; /*0xd05c*/
}
}
if ( *a1 < v8 ) /*0xd06b*/
MemSet(*((_QWORD *)a1 + 2) + 4LL * *a1, 0, 4LL * (unsigned int)(v8 - *a1)); /*0xd078*/
if ( (unsigned int)BnCmp((__int64)a1, (__int64)a2) != -1 ) /*0xd091*/
{
result = BnSub(a1, (unsigned int *)a2, a1); /*0xd09c*/
if ( (_DWORD)result ) /*0xd0a3*/
return result; /*0xd0a3*/
}
}
return 0; /*0xd0b8*/
}
// Function: BnMul @ 0xd0c0 (0x595 bytes)
__int64 __fastcall BnMul(int *a1, int *a2, __int64 a3, __int128 *a4)
{
int *v4; // rsi
int n3529; // eax
int n6; // edi
__int64 result; // rax
int v9; // r12d
int v10; // r13d
int v11; // ebx
unsigned int v12; // esi
int v13; // r8d
int v14; // edx
int v15; // r15d
unsigned int v16; // ebx
int *v17; // r12
int v18; // esi
int v19; // esi
int v20; // r12d
int *v21; // rdx
int n2; // r13d
unsigned int v23; // r9d
int n6_1; // esi
int n28; // r8d
int v26; // eax
int *v27; // rcx
int v28; // r12d
__int64 v29; // rbx
int *v30; // rdi
__int64 v31; // rax
unsigned int v32; // edx
int v33; // edx
int v34; // esi
bool v35; // zf
int v36; // edi
__int64 v37; // xmm3_8
__int128 v38; // xmm0
__int64 v39; // xmm1_8
__int64 v40; // rdi
int *v41; // rsi
int v42; // [rsp+20h] [rbp-E0h]
__int128 v43; // [rsp+28h] [rbp-D8h] BYREF
__int64 v44; // [rsp+38h] [rbp-C8h]
int n28_1; // [rsp+40h] [rbp-C0h]
int *v46; // [rsp+48h] [rbp-B8h]
unsigned int v47; // [rsp+50h] [rbp-B0h]
int v48[6]; // [rsp+60h] [rbp-A0h] BYREF
int v49[4]; // [rsp+78h] [rbp-88h] BYREF
__int64 v50; // [rsp+88h] [rbp-78h]
int v54; // [rsp+18C0h] [rbp+17C0h]
v4 = a1; /*0xd0ec*/
n3529 = BnNumBits(a2); /*0xd0f5*/
if ( n3529 > 7 ) /*0xd103*/
{
if ( n3529 > 36 ) /*0xd10d*/
{
if ( n3529 > 140 ) /*0xd11b*/
{
if ( n3529 > 450 ) /*0xd129*/
{
if ( n3529 > 1303 ) /*0xd137*/
n6 = (n3529 > 3529) + 7; /*0xd14b*/
else
n6 = 6; /*0xd139*/
}
else
{
n6 = 5; /*0xd12b*/
}
}
else
{
n6 = 4; /*0xd11d*/
}
}
else
{
n6 = 3; /*0xd10f*/
}
}
else
{
n6 = 2; /*0xd105*/
}
result = BnAlloc(v49); /*0xd153*/
if ( (_DWORD)result ) /*0xd15a*/
return result; /*0xd15a*/
v9 = 1 << (n6 - 1); /*0xd167*/
v54 = v9; /*0xd170*/
v10 = 1 << n6; /*0xd177*/
v11 = v9; /*0xd17a*/
v42 = 1 << n6; /*0xd17d*/
if ( v9 < 1 << n6 ) /*0xd185*/
{
do /*0xd1ab*/
{
v12 = BnAlloc(&v48[6 * v11]); /*0xd19c*/
if ( v12 ) /*0xd1a0*/
{
if ( v9 < (__int64)v11 ) /*0xd366*/
{
v29 = v11 - (__int64)v9; /*0xd36c*/
v30 = &v48[6 * v9]; /*0xd374*/
do /*0xd38f*/
{
if ( *((_QWORD *)v30 + 2) ) /*0xd378*/
BnFreeWords((__int64)v30); /*0xd382*/
v30 += 6; /*0xd387*/
--v29; /*0xd38b*/
}
while ( v29 ); /*0xd38f*/
}
if ( v50 ) /*0xd396*/
BnFreeWords((__int64)v49); /*0xd39d*/
return v12; /*0xd3a4*/
}
++v11; /*0xd1a6*/
}
while ( v11 < v10 ); /*0xd1ab*/
v4 = a1; /*0xd1ad*/
}
v13 = **(_DWORD **)(a3 + 16); /*0xd1b8*/
if ( (v13 & 1) == 0 /*0xd21c*/
|| (v14 = (2 - v13 * (v13 + ((2 * (_BYTE)v13 + 4) & 8))) * (v13 + ((2 * (_BYTE)v13 + 4) & 8)),
v15 = (v14 * (2 - v13 * v14) * (v13 * v14 * (2 - v13 * v14) - 2)) & 0xFFFFFFF,
2 * *(_DWORD *)a3 >= 511)
|| *(int *)a3 >= 256 )
{
v16 = -3; /*0xd5ee*/
goto LABEL_77; /*0xd5ee*/
}
v16 = BnAlloc(&v43); /*0xd22c*/
if ( v16 ) /*0xd230*/
goto LABEL_77; /*0xd230*/
v16 = BnModHalf((int *)&v43, (int *)a3); /*0xd243*/
if ( v16 ) /*0xd247*/
goto LABEL_74; /*0xd247*/
v16 = BnMulMod(v4, (int *)&v43, a3, (__int64)v49); /*0xd262*/
if ( v16 ) /*0xd266*/
goto LABEL_74; /*0xd266*/
v17 = &v48[6 * v9]; /*0xd278*/
v16 = BnCopy((__int64)v49, (__int64)v17); /*0xd289*/
if ( v16 ) /*0xd28d*/
goto LABEL_73; /*0xd28d*/
v18 = 0; /*0xd293*/
do /*0xd2c9*/
{
v16 = BnSqrDispatch(v17, (__int64)v17); /*0xd2a0*/
if ( v16 ) /*0xd2a4*/
goto LABEL_73; /*0xd2a4*/
v16 = BnLshift(v17, (int *)a3, v15); /*0xd2b8*/
if ( v16 ) /*0xd2bc*/
goto LABEL_73; /*0xd2bc*/
++v18; /*0xd2c2*/
}
while ( v18 < n6 - 1 ); /*0xd2c9*/
v19 = v54 + 1; /*0xd2d1*/
if ( v54 + 1 < v10 ) /*0xd2d6*/
{
v20 = v54; /*0xd2d8*/
do /*0xd337*/
{
v46 = &v48[6 * v19]; /*0xd2f4*/
v16 = BnMulDispatch(&v48[6 * v20], v49, v46); /*0xd30b*/
if ( v16 ) /*0xd30f*/
goto LABEL_73; /*0xd30f*/
v16 = BnLshift(v46, (int *)a3, v15); /*0xd325*/
if ( v16 ) /*0xd329*/
goto LABEL_73; /*0xd329*/
++v19; /*0xd32f*/
++v20; /*0xd331*/
}
while ( v19 < v10 ); /*0xd337*/
}
v21 = a2; /*0xd339*/
n2 = 0; /*0xd340*/
v23 = 0; /*0xd343*/
n6_1 = 0; /*0xd346*/
n28 = 1; /*0xd34a*/
v26 = *a2 - 1; /*0xd34e*/
v27 = (int *)v26; /*0xd350*/
v28 = 0; /*0xd353*/
v46 = (int *)v26; /*0xd356*/
while ( 1 ) /*0xd3b0*/
{
n28_1 = --n28; /*0xd3b4*/
if ( !n28 ) /*0xd3b9*/
break; /*0xd3b9*/
LABEL_46:
v32 = v23; /*0xd3e0*/
v23 *= 2; /*0xd3e3*/
v33 = (v32 >> 27) & 1; /*0xd3e9*/
v47 = v23; /*0xd3ec*/
if ( !n2 && !v33 ) /*0xd3f8*/
goto LABEL_42; /*0xd3f8*/
if ( n2 != 1 || v33 ) /*0xd402*/
{
++n6_1; /*0xd44b*/
n2 = 2; /*0xd451*/
v27 = v46; /*0xd459*/
v28 |= v33 << (n6 - n6_1); /*0xd45e*/
v21 = a2; /*0xd461*/
if ( n6_1 == n6 ) /*0xd46a*/
{
v34 = 0; /*0xd470*/
while ( 1 ) /*0xd481*/
{
v16 = BnSqrDispatch((int *)&v43, (__int64)&v43); /*0xd481*/
if ( v16 ) /*0xd485*/
break; /*0xd485*/
v16 = BnLshift((int *)&v43, (int *)a3, v15); /*0xd49b*/
if ( v16 ) /*0xd49f*/
break; /*0xd49f*/
if ( ++v34 >= n6 ) /*0xd4a9*/
{
v16 = BnMulDispatch((int *)&v43, &v48[6 * v28], (int *)&v43); /*0xd4ca*/
if ( !v16 ) /*0xd4ce*/
{
v16 = BnLshift((int *)&v43, (int *)a3, v15); /*0xd4e4*/
if ( !v16 ) /*0xd4e8*/
{
n6_1 = 0; /*0xd4ee*/
n2 = 1; /*0xd4f0*/
v28 = 0; /*0xd4f4*/
goto LABEL_52; /*0xd4f7*/
}
}
break; /*0xd4e8*/
}
}
LABEL_72:
v10 = 1 << n6; /*0xd5ce*/
goto LABEL_73; /*0xd5ce*/
}
}
else
{
v16 = BnSqrDispatch((int *)&v43, (__int64)&v43); /*0xd413*/
if ( v16 ) /*0xd417*/
goto LABEL_72; /*0xd417*/
v16 = BnLshift((int *)&v43, (int *)a3, v15); /*0xd42d*/
if ( v16 ) /*0xd431*/
goto LABEL_72; /*0xd431*/
LABEL_52:
v27 = v46; /*0xd437*/
n28 = n28_1; /*0xd43c*/
v23 = v47; /*0xd441*/
LABEL_42:
v21 = a2; /*0xd3a9*/
}
}
if ( v27 != (int *)-1LL ) /*0xd3bf*/
{
v31 = *((_QWORD *)v21 + 2); /*0xd3c5*/
n28 = 28; /*0xd3c9*/
n28_1 = 28; /*0xd3cf*/
v23 = *(_DWORD *)(v31 + 4LL * (_QWORD)v27); /*0xd3d4*/
v27 = (int *)((char *)v27 - 1); /*0xd3d8*/
v46 = v27; /*0xd3db*/
goto LABEL_46; /*0xd3db*/
}
v35 = n2 == 2; /*0xd4fc*/
v10 = 1 << n6; /*0xd500*/
if ( v35 && n6_1 > 0 ) /*0xd509*/
{
v36 = 0; /*0xd50b*/
while ( 1 ) /*0xd520*/
{
v16 = BnSqrDispatch((int *)&v43, (__int64)&v43); /*0xd520*/
if ( v16 ) /*0xd524*/
break; /*0xd524*/
v16 = BnLshift((int *)&v43, (int *)a3, v15); /*0xd53a*/
if ( v16 ) /*0xd53e*/
break; /*0xd53e*/
v28 *= 2; /*0xd544*/
if ( (v42 & v28) != 0 ) /*0xd54a*/
{
v16 = BnMulDispatch((int *)&v43, v49, (int *)&v43); /*0xd560*/
if ( v16 ) /*0xd564*/
break; /*0xd564*/
v16 = BnLshift((int *)&v43, (int *)a3, v15); /*0xd576*/
if ( v16 ) /*0xd57a*/
break; /*0xd57a*/
}
if ( ++v36 >= n6_1 ) /*0xd580*/
goto LABEL_70; /*0xd580*/
}
LABEL_73:
v9 = v54; /*0xd5d3*/
}
else
{
LABEL_70:
v9 = v54; /*0xd582*/
v16 = BnLshift((int *)&v43, (int *)a3, v15); /*0xd599*/
if ( !v16 ) /*0xd59d*/
{
v37 = v44; /*0xd5ab*/
v38 = *a4; /*0xd5b1*/
v39 = *((_QWORD *)a4 + 2); /*0xd5b4*/
*a4 = v43; /*0xd5b9*/
v43 = v38; /*0xd5bc*/
v44 = v39; /*0xd5c1*/
*((_QWORD *)a4 + 2) = v37; /*0xd5c7*/
}
}
LABEL_74:
if ( v44 ) /*0xd5e0*/
BnFreeWords((__int64)&v43); /*0xd5e7*/
LABEL_77:
if ( v50 ) /*0xd5f8*/
BnFreeWords((__int64)v49); /*0xd5ff*/
if ( v9 < (__int64)v10 ) /*0xd60d*/
{
v40 = v10 - (__int64)v9; /*0xd613*/
v41 = &v48[6 * v9]; /*0xd61b*/
do /*0xd636*/
{
if ( *((_QWORD *)v41 + 2) ) /*0xd61f*/
BnFreeWords((__int64)v41); /*0xd629*/
v41 += 6; /*0xd62e*/
--v40; /*0xd632*/
}
while ( v40 ); /*0xd636*/
}
return v16; /*0xd642*/
}
// Function: BnSqrWords @ 0xd658 (0x180 bytes)
__int64 __fastcall BnSqrWords(_DWORD *a1, int *a2)
{
int v2; // ebx
int v3; // edi
int *v4; // rsi
_DWORD *v5; // r14
__int64 result; // rax
__int64 v7; // r9
unsigned __int64 v8; // r8
int v9; // r10d
int v10; // esi
__int64 v11; // r11
__int64 v12; // r13
int v13; // r14d
int v14; // edi
__int64 v15; // rbp
int v16; // edx
unsigned int *v17; // r15
unsigned int *v18; // r12
int v19; // edi
__int64 v20; // rdx
__int64 v21; // rcx
__int64 v22; // rax
unsigned __int64 v23; // r8
int v24; // eax
__int64 v25; // r8
int v26; // edx
int *v27; // rcx
int v28; // eax
_DWORD v29[526]; // [rsp+20h] [rbp-838h]
v2 = 0; /*0xd67b*/
v3 = 2 * *a1; /*0xd67d*/
v4 = a2; /*0xd67f*/
v5 = a1; /*0xd682*/
if ( a2[1] >= v3 || (result = BnResize((__int64)a2, v3), !(_DWORD)result) ) /*0xd696*/
{
v7 = v3; /*0xd69c*/
v8 = 0; /*0xd69f*/
v9 = 0; /*0xd6a2*/
if ( v3 > 0 ) /*0xd6a7*/
{
v10 = *v5; /*0xd6ad*/
v11 = 0; /*0xd6b0*/
v12 = *((_QWORD *)v5 + 2); /*0xd6b3*/
v13 = *v5 - 1; /*0xd6b7*/
do /*0xd759*/
{
v14 = v9; /*0xd6be*/
if ( v13 < v9 ) /*0xd6c6*/
v14 = v13; /*0xd6c6*/
v15 = 0; /*0xd6ca*/
v16 = v10 - (v9 - v14); /*0xd6cf*/
v17 = (unsigned int *)(v12 + 4LL * (v9 - v14)); /*0xd6df*/
v18 = (unsigned int *)(v12 + 4LL * v14); /*0xd6ed*/
if ( v16 >= v14 + 1 ) /*0xd6f2*/
v16 = v14 + 1; /*0xd6f2*/
v19 = (v14 - (v9 - v14) + 1) >> 1; /*0xd6f9*/
if ( v16 < v19 ) /*0xd6fd*/
v19 = v16; /*0xd6fd*/
if ( v19 > 0 ) /*0xd702*/
{
v20 = (unsigned int)v19; /*0xd704*/
do /*0xd721*/
{
v21 = *v18--; /*0xd706*/
v22 = *v17++; /*0xd70f*/
v15 += v22 * v21; /*0xd71a*/
--v20; /*0xd71d*/
}
while ( v20 ); /*0xd721*/
}
v23 = v8 + 2 * v15; /*0xd723*/
if ( (v9 & 1) == 0 ) /*0xd72b*/
v23 += *(unsigned int *)(v12 + 4 * ((__int64)v9 >> 1)) /*0xd73c*/
* (unsigned __int64)*(unsigned int *)(v12 + 4 * ((__int64)v9 >> 1));
++v9; /*0xd742*/
v24 = v23 & 0xFFFFFFF; /*0xd745*/
v8 = v23 >> 28; /*0xd74a*/
v29[v11++] = v24; /*0xd74e*/
}
while ( v11 < v7 ); /*0xd759*/
v4 = a2; /*0xd75f*/
v5 = a1; /*0xd767*/
}
v25 = 0; /*0xd772*/
v26 = *v4; /*0xd775*/
v27 = (int *)*((_QWORD *)v4 + 2); /*0xd779*/
*v4 = 2 * *v5; /*0xd77d*/
if ( v7 > 0 ) /*0xd782*/
{
v2 = v7; /*0xd784*/
do /*0xd79d*/
{
v28 = v29[v25++]; /*0xd787*/
*v27++ = v28 & 0xFFFFFFF; /*0xd794*/
}
while ( v25 < v7 ); /*0xd79d*/
}
if ( v2 < v26 ) /*0xd7a1*/
MemSet(v27, 0, 4LL * (unsigned int)(v26 - v2)); /*0xd7ae*/
BnTrim((__int64)v4); /*0xd7b6*/
return 0; /*0xd7bb*/
}
return result; /*0xd7c5*/
}
// Function: BnMulWord @ 0xd7d8 (0xba bytes)
__int64 __fastcall BnMulWord(__int64 a1, unsigned int a2, __int64 a3)
{
__int64 v3; // rbp
unsigned __int64 v4; // rdi
int v6; // edx
__int64 result; // rax
int v9; // edx
int v10; // r8d
_DWORD *v11; // r9
unsigned int *i; // r10
__int64 v13; // rcx
unsigned __int64 v14; // rcx
int v15; // edx
v3 = a2; /*0xd7ec*/
LODWORD(v4) = 0; /*0xd7ee*/
v6 = *(_DWORD *)a1 + 1; /*0xd7f5*/
if ( *(_DWORD *)(a3 + 4) >= v6 || (result = BnResize(a3, v6), !(_DWORD)result) ) /*0xd80a*/
{
v9 = 0; /*0xd80f*/
v10 = *(_DWORD *)a3; /*0xd811*/
v11 = *(_DWORD **)(a3 + 16); /*0xd814*/
*(_DWORD *)(a3 + 8) = *(_DWORD *)(a1 + 8); /*0xd818*/
for ( i = *(unsigned int **)(a1 + 16); v9 < *(_DWORD *)a1; ++v11 ) /*0xd821*/
{
v13 = *i; /*0xd826*/
++v9; /*0xd829*/
++i; /*0xd82d*/
v14 = (unsigned int)v4 + v3 * v13; /*0xd835*/
v4 = v14 >> 28; /*0xd842*/
*v11 = v14 & 0xFFFFFFF; /*0xd846*/
}
v15 = v9 + 1; /*0xd851*/
*v11 = v4; /*0xd853*/
if ( v15 < v10 ) /*0xd859*/
MemSet(v11 + 1, 0, 4LL * (unsigned int)(v10 - v15)); /*0xd868*/
*(_DWORD *)a3 = *(_DWORD *)a1 + 1; /*0xd874*/
BnTrim(a3); /*0xd876*/
return 0; /*0xd87b*/
}
return result; /*0xd88c*/
}
// Function: BnAllocNew @ 0xd894 (0x37 bytes)
unsigned __int64 BnAllocNew()
{
unsigned __int64 result; // rax
__int64 v1; // rbx
result = MmgrAlloc(0x18u); /*0xd89f*/
v1 = result; /*0xd8a4*/
if ( result ) /*0xd8aa*/
{
if ( (unsigned int)BnAlloc(result) ) /*0xd8af*/
{
GetInfo_7(v1); /*0xd8bb*/
return 0; /*0xd8c0*/
}
return v1; /*0xd8c2*/
}
return result; /*0xd8c5*/
}
// Function: GetInfo_4 @ 0xd8cc (0x14e bytes)
void *__fastcall GetInfo_4(__int64 n4, char **InputSize, unsigned int *p_n256, char *ResultBuf)
{
unsigned int n256; // ebx
char *src_1; // rsi
unsigned __int64 v7; // rdi
int v8; // edx
unsigned int count; // r8d
char *v10; // rcx
char *buf; // rcx
unsigned __int64 n56; // rdx
char src[4]; // [rsp+20h] [rbp-60h] BYREF
int v15; // [rsp+24h] [rbp-5Ch]
int v16; // [rsp+28h] [rbp-58h]
int n271733878; // [rsp+2Ch] [rbp-54h]
unsigned int v18; // [rsp+30h] [rbp-50h]
unsigned int v19; // [rsp+34h] [rbp-4Ch]
char dst[56]; // [rsp+38h] [rbp-48h] BYREF
unsigned int v21; // [rsp+70h] [rbp-10h]
unsigned int v22; // [rsp+74h] [rbp-Ch]
n256 = *p_n256; /*0xd8ea*/
src_1 = *InputSize; /*0xd8f0*/
v18 = 8 * *p_n256; /*0xd8f8*/
*(_DWORD *)src = 1732584193; /*0xd900*/
v15 = -271733879; /*0xd907*/
v16 = -1732584194; /*0xd90e*/
n271733878 = 271733878; /*0xd915*/
v19 = n256 >> 29; /*0xd91c*/
if ( n256 >= 0x40 ) /*0xd922*/
{
v7 = (unsigned __int64)n256 >> 6; /*0xd926*/
do /*0xd954*/
{
MemConfig_0(dst, src_1, 0x40u); /*0xd937*/
Md5Transform(src, dst); /*0xd944*/
src_1 += 64; /*0xd949*/
n256 -= 64; /*0xd94d*/
--v7; /*0xd950*/
}
while ( v7 ); /*0xd954*/
}
if ( n256 ) /*0xd95b*/
MemConfig_0(dst, src_1, n256); /*0xd964*/
v8 = (v18 >> 3) & 0x3F; /*0xd979*/
count = 63 - v8; /*0xd97e*/
v10 = &dst[v8]; /*0xd981*/
*v10 = 0x80; /*0xd984*/
buf = v10 + 1; /*0xd987*/
if ( (unsigned int)(63 - v8) < 8 ) /*0xd98e*/
{
if ( count ) /*0xd996*/
MemGetInfo(buf, count); /*0xd998*/
Md5Transform(src, dst); /*0xd9a5*/
n56 = 56; /*0xd9aa*/
buf = dst; /*0xd9af*/
goto LABEL_11; /*0xd9b3*/
}
n56 = count - 8; /*0xd9b9*/
if ( count != 8 ) /*0xd9bd*/
LABEL_11:
MemGetInfo(buf, n56); /*0xd9bf*/
v21 = v18; /*0xd9c4*/
v22 = v19; /*0xd9d5*/
Md5Transform(src, dst); /*0xd9d8*/
MemConfig_0(ResultBuf, src, 0x10u); /*0xd9ea*/
return MemGetInfo(src, 0x58u); /*0xda15*/
}
// Function: Md5Transform @ 0xda1c (0x7e3 bytes)
__int64 __fastcall Md5Transform(_DWORD *src, _DWORD *dst)
{
int v2; // r10d
_DWORD *dst_1; // rbx
int v4; // r9d
int v5; // r8d
int v6; // r12d
int v7; // ecx
int v8; // edx
int v9; // r8d
int v10; // r9d
int v11; // r10d
int v12; // ecx
int v13; // edx
int v14; // ebp
int v15; // r13d
int v16; // r14d
int v17; // esi
int v18; // r15d
int v19; // edi
int v20; // r8d
int v21; // r9d
int v22; // r10d
int v23; // ecx
int v24; // r11d
int v25; // edx
int v26; // r8d
int v27; // r9d
int v28; // ecx
int v29; // edx
int v30; // r8d
int v31; // r9d
int v32; // r10d
int v33; // ecx
int v34; // edx
int v35; // r8d
int v36; // r9d
int v37; // r10d
int v38; // ecx
int v39; // edx
int v40; // r11d
int v41; // r8d
int v42; // r9d
int v43; // r10d
int v44; // edx
int v45; // r8d
int v46; // r9d
int v47; // r10d
int v48; // r11d
int v49; // edx
int v50; // r8d
int v51; // r9d
int v52; // r10d
int v53; // r11d
int v54; // r8d
int v55; // r9d
int v56; // edx
int v57; // r10d
int v58; // ecx
int v59; // r8d
int v60; // r9d
int v61; // edx
int v62; // r10d
int v63; // ecx
int v64; // r8d
int v65; // r9d
int v66; // edx
int v67; // r10d
int v68; // ecx
int v69; // r8d
int v70; // r11d
int v71; // edx
int v72; // r10d
int v73; // r9d
int v74; // r8d
int v75; // edx
__int64 result; // rax
int v77; // [rsp+0h] [rbp-68h]
int v78; // [rsp+4h] [rbp-64h]
int v79; // [rsp+8h] [rbp-60h]
int v80; // [rsp+Ch] [rbp-5Ch]
int v81; // [rsp+10h] [rbp-58h]
int v83; // [rsp+78h] [rbp+10h]
int v84; // [rsp+80h] [rbp+18h]
int v85; // [rsp+88h] [rbp+20h]
v2 = src[1]; /*0xda31*/
dst_1 = dst; /*0xda35*/
v4 = src[2]; /*0xda38*/
v5 = src[3]; /*0xda3c*/
v6 = dst[5]; /*0xda50*/
v83 = *dst; /*0xda56*/
v85 = dst[1]; /*0xda65*/
v7 = v2 + __ROL4__(*dst + (v5 ^ v2 & (v4 ^ v5)) + *src - 680876936, 7); /*0xda75*/
v80 = dst[2]; /*0xda94*/
v8 = v7 + __ROL4__(v85 + (v4 ^ v7 & (v2 ^ v4)) + v5 - 389564586, 12); /*0xda99*/
v84 = dst_1[3]; /*0xdab3*/
v9 = v8 + __ROR4__(v80 + (v2 ^ v8 & (v7 ^ v2)) + v4 + 606105819, 15); /*0xdac1*/
v78 = dst_1[4]; /*0xdadc*/
v10 = v9 + __ROR4__(v84 + (v7 ^ v9 & (v7 ^ v8)) + v2 - 1044525330, 10); /*0xdae8*/
v77 = dst_1[6]; /*0xdb0c*/
v11 = v10 + __ROL4__(v78 + (v8 ^ v10 & (v9 ^ v8)) + v7 - 176418897, 7); /*0xdb13*/
v12 = v11 + __ROL4__(v6 + (v9 ^ v11 & (v10 ^ v9)) + v8 + 1200080426, 12); /*0xdb2a*/
v13 = v12 + __ROR4__(v77 + (v10 ^ v12 & (v11 ^ v10)) + v9 - 1473231341, 15); /*0xdb40*/
v14 = dst_1[7]; /*0xdb42*/
v15 = dst_1[8]; /*0xdb4c*/
v16 = dst_1[10]; /*0xdb57*/
v17 = dst_1[12]; /*0xdb60*/
v18 = dst_1[13]; /*0xdb65*/
v19 = dst_1[14]; /*0xdb6c*/
v81 = dst_1[9]; /*0xdb78*/
v20 = v13 + __ROR4__(v14 + (v11 ^ v13 & (v11 ^ v12)) + v10 - 45705983, 10); /*0xdb85*/
v21 = v20 + __ROL4__(v15 + (v12 ^ v20 & (v13 ^ v12)) + v11 + 1770035416, 7); /*0xdba3*/
v79 = dst_1[11]; /*0xdbc7*/
v22 = v21 + __ROL4__(v81 + (v13 ^ v21 & (v20 ^ v13)) + v12 - 1958414417, 12); /*0xdbcf*/
v23 = v22 + __ROR4__(v16 + (v20 ^ v22 & (v21 ^ v20)) + v13 - 42063, 15); /*0xdbe6*/
v24 = v23 + __ROR4__(v79 + (v21 ^ v23 & (v21 ^ v22)) + v20 - 1990404162, 10); /*0xdc0d*/
v25 = v24 + __ROL4__(v17 + (v22 ^ v24 & (v23 ^ v22)) + v21 + 1804603682, 7); /*0xdc23*/
v26 = v25 + __ROL4__(v22 + v18 + (v23 ^ v25 & (v24 ^ v23)) - 40341101, 12); /*0xdc3f*/
LODWORD(dst_1) = dst_1[15]; /*0xdc51*/
v27 = v26 + __ROR4__(v19 + (v24 ^ v26 & (v25 ^ v24)) + v23 - 1502002290, 15); /*0xdc54*/
v28 = v27 + __ROR4__(v24 + (_DWORD)dst_1 + (v25 ^ v27 & (v25 ^ v26)) + 1236535329, 10); /*0xdc72*/
v29 = v28 + __ROL4__(v85 + (v27 ^ v26 & (v28 ^ v27)) - 165796510 + v25, 5); /*0xdc97*/
v30 = v29 + __ROL4__(v77 + (v28 ^ v27 & (v29 ^ v28)) - 1069501632 + v26, 9); /*0xdcaf*/
v31 = v30 + __ROL4__(v79 + (v29 ^ v28 & (v29 ^ v30)) + 643717713 + v27, 14); /*0xdcd4*/
v32 = v31 + __ROR4__(v83 + (v30 ^ v29 & (v31 ^ v30)) + v28 - 373897302, 12); /*0xdcf4*/
v33 = v32 + __ROL4__(v6 + (v31 ^ v30 & (v32 ^ v31)) + v29 - 701558691, 5); /*0xdd12*/
v34 = v33 + __ROL4__(v16 + (v32 ^ v31 & (v33 ^ v32)) + v30 + 38016083, 9); /*0xdd2c*/
v35 = v34 + __ROL4__((_DWORD)dst_1 + (v33 ^ v32 & (v33 ^ v34)) + v31 - 660478335, 14); /*0xdd42*/
v36 = v35 + __ROR4__(v78 + (v34 ^ v33 & (v35 ^ v34)) + v32 - 405537848, 12); /*0xdd5e*/
v37 = v36 + __ROL4__(v81 + (v35 ^ v34 & (v36 ^ v35)) + v33 + 568446438, 5); /*0xdd8e*/
v38 = v37 + __ROL4__(v19 + (v36 ^ v35 & (v37 ^ v36)) + v34 - 1019803690, 9); /*0xdda8*/
v39 = v38 + __ROL4__(v84 + (v37 ^ v36 & (v37 ^ v38)) + v35 - 187363961, 14); /*0xddcb*/
v40 = v39 + __ROR4__(v15 + (v38 ^ v37 & (v39 ^ v38)) + v36 + 1163531501, 12); /*0xdde7*/
v41 = v40 + __ROL4__(v18 + (v39 ^ v38 & (v40 ^ v39)) + v37 - 1444681467, 5); /*0xddfe*/
v42 = v41 + __ROL4__(v80 + (v40 ^ v39 & (v41 ^ v40)) + v38 - 51403784, 9); /*0xde1b*/
v43 = v42 + __ROL4__(v14 + (v41 ^ v40 & (v41 ^ v42)) + v39 + 1735328473, 14); /*0xde36*/
v44 = v43 + __ROR4__(v17 + (v42 ^ v41 & (v43 ^ v42)) + v40 - 1926607734, 12); /*0xde4b*/
v45 = v44 + __ROL4__(v6 + (v44 ^ v43 ^ v42) - 378558 + v41, 4); /*0xde60*/
v46 = v45 + __ROL4__(v15 + (v45 ^ v44 ^ v43) - 2022574463 + v42, 11); /*0xde81*/
v47 = v46 + __ROL4__(v79 + (v45 ^ v44 ^ v46) + 1839030562 + v43, 16); /*0xdea6*/
v48 = v47 + __ROR4__(v19 + (v45 ^ v47 ^ v46) + v44 - 35309556, 9); /*0xdecb*/
v49 = v48 + __ROL4__(v85 + (v48 ^ v47 ^ v46) + v45 - 1530992060, 4); /*0xdee7*/
v50 = v49 + __ROL4__(v78 + (v49 ^ v48 ^ v47) + v46 + 1272893353, 11); /*0xdef7*/
v51 = v50 + __ROL4__(v14 + (v49 ^ v48 ^ v50) + v47 - 155497632, 16); /*0xdf15*/
v52 = v51 + __ROR4__(v16 + (v49 ^ v51 ^ v50) + v48 - 1094730640, 9); /*0xdf2c*/
v53 = v52 + __ROL4__(v18 + (v52 ^ v51 ^ v50) + v49 + 681279174, 4); /*0xdf3f*/
v54 = v53 + __ROL4__(v83 + (v53 ^ v52 ^ v51) - 358537222 + v50, 11); /*0xdf55*/
v55 = v54 + __ROL4__(v84 + (v53 ^ v52 ^ v54) - 722521979 + v51, 16); /*0xdf77*/
v56 = v55 + __ROR4__(v77 + (v53 ^ v55 ^ v54) + v52 + 76029189, 9); /*0xdf94*/
v57 = v56 + __ROL4__(v53 + v81 + (v56 ^ v55 ^ v54) - 640364487, 4); /*0xdfbb*/
v58 = v57 + __ROL4__(v17 + (v57 ^ v56 ^ v55) + v54 - 421815835, 11); /*0xdfcf*/
v59 = v58 + __ROL4__((_DWORD)dst_1 + (v57 ^ v56 ^ v58) + v55 + 530742520, 16); /*0xdfeb*/
v60 = v59 + __ROR4__(v80 + (v57 ^ v59 ^ v58) + v56 - 995338651, 9); /*0xe00a*/
v61 = v60 + __ROL4__(v83 + (v59 ^ (v60 | ~v58)) + v57 - 198630844, 6); /*0xe028*/
v62 = v61 + __ROL4__(v14 + (v60 ^ (v61 | ~v59)) + v58 + 1126891415, 10); /*0xe045*/
v63 = v62 + __ROL4__(v19 + (v61 ^ (v62 | ~v60)) + v59 - 1416354905, 15); /*0xe05f*/
v64 = v63 + __ROR4__(v6 + (v62 ^ (v63 | ~v61)) + v60 - 57434055, 11); /*0xe076*/
v65 = v64 + __ROL4__(v17 + (v63 ^ (v64 | ~v62)) + v61 + 1700485571, 6); /*0xe087*/
v66 = v65 + __ROL4__(v84 + (v64 ^ (v65 | ~v63)) + v62 - 1894986606, 10); /*0xe0ba*/
v67 = v66 + __ROL4__(v16 + (v65 ^ (v66 | ~v64)) + v63 - 1051523, 15); /*0xe0dc*/
v68 = v67 + __ROR4__(v85 + (v66 ^ (v67 | ~v65)) + v64 - 2054922799, 11); /*0xe0fc*/
v69 = v68 + __ROL4__(v65 + v15 + (v67 ^ (v68 | ~v66)) + 1873313359, 6); /*0xe118*/
v70 = v69 + __ROL4__((_DWORD)dst_1 + (v68 ^ (v69 | ~v67)) + v66 - 30611744, 10); /*0xe138*/
v71 = v70 + __ROL4__(v77 + (v69 ^ (v70 | ~v68)) + v67 - 1560198380, 15); /*0xe150*/
v72 = v71 + __ROR4__(v68 + v18 + (v70 ^ (v71 | ~v69)) + 1309151649, 11); /*0xe170*/
v73 = v72 + __ROL4__(v78 + (v71 ^ (v72 | ~v70)) + v69 - 145523070, 6); /*0xe183*/
v74 = v73 + __ROL4__(v70 + v79 + (v72 ^ (v73 | ~v71)) - 1120210379, 10); /*0xe19f*/
*src += v73; /*0xe1c2*/
v75 = v74 + __ROL4__(v80 + (v73 ^ (v74 | ~v72)) + 718787259 + v71, 15); /*0xe1cd*/
src[2] += v75; /*0xe1d2*/
result = v81 + (v74 ^ (v75 | (unsigned int)~v73)); /*0xe1db*/
src[1] += v75 + __ROR4__(result + v72 - 343485551, 11); /*0xe1e6*/
src[3] += v74; /*0xe1ea*/
return result; /*0xe1ee*/
}
// Function: GetInfo_9 @ 0xe200 (0x7d bytes)
char *__fastcall GetInfo_9(char *i)
{
char *dst; // rdi
char *i_1; // r8
int n4096_1; // edx
int n4096; // eax
unsigned __int64 count; // rbx
char *buf; // rax
dst = 0; /*0xe20f*/
i_1 = i; /*0xe214*/
n4096_1 = 0; /*0xe217*/
do /*0xe22e*/
{
if ( !*i_1++ ) /*0xe21e*/
break; /*0xe226*/
n4096 = n4096_1++; /*0xe228*/
}
while ( n4096 < 4096 ); /*0xe22e*/
if ( n4096_1 < 4096 ) /*0xe232*/
{
count = n4096_1; /*0xe234*/
buf = (char *)MmgrAlloc(n4096_1); /*0xe23a*/
dst = buf; /*0xe23f*/
if ( buf ) /*0xe245*/
{
if ( count ) /*0xe24a*/
{
MemGetInfo(buf, count); /*0xe252*/
MemConfig_0(dst, i, count); /*0xe265*/
}
}
}
return dst; /*0xe277*/
}
// Function: Asn1DecodeShort @ 0xe280 (0x54 bytes)
unsigned __int64 __fastcall Asn1DecodeShort(char *src, __int64 count, _DWORD *a3)
{
__int64 count_1; // rdi
unsigned __int64 result; // rax
char dst[24]; // [rsp+20h] [rbp-18h] BYREF
unsigned __int64 v7; // [rsp+50h] [rbp+18h] BYREF
count_1 = (unsigned __int8)count; /*0xe28f*/
if ( (_BYTE)count ) /*0xe297*/
MemConfig_0(dst, src, (unsigned __int8)count); /*0xe2a4*/
dst[count_1] = 0; /*0xe2ae*/
SataConfig_10(dst, count, &v7); /*0xe2b8*/
result = v7; /*0xe2bd*/
*a3 = v7; /*0xe2c7*/
return result; /*0xe2ce*/
}
// Function: AsciiSPrint @ 0xe2d4 (0x3a bytes)
unsigned __int64 AsciiSPrint(unsigned int *KeyBuffer, unsigned __int64 n256, char *%a, ...)
{
va_list va; // [rsp+58h] [rbp+20h] BYREF
va_start(va, %a);
if ( KeyBuffer && %a && n256 ) /*0xe2f0*/
return FormatString((unsigned __int64)KeyBuffer, n256, 0, (unsigned __int8 *)%a, (unsigned __int16 **)va); /*0xe300*/
else
return 0; /*0xe307*/
}
// Function: SataConfig_7 @ 0xe310 (0x1b7 bytes)
__int64 __fastcall SataConfig_7(unsigned __int8 *a1, __int64 a2, unsigned __int8 **buf)
{
unsigned __int8 *v6; // rbp
unsigned __int8 v7; // cl
int v8; // esi
unsigned __int8 *v9; // r14
char v10; // di
int v11; // r8d
char *ASN.1:_Identifier_underflow; // rdx
char v13; // dl
unsigned __int8 *v14; // r14
unsigned __int8 n4; // dl
__int64 v16; // r8
bool v17; // zf
MemGetInfo(buf, 0x18u); /*0xe339*/
v6 = &a1[a2]; /*0xe33e*/
if ( a1 < v6 )
{
v7 = *a1; /*0xe357*/
v8 = 1; /*0xe35a*/
*((_BYTE *)buf + 8) = *a1; /*0xe361*/
v9 = a1 + 1; /*0xe368*/
*((_BYTE *)buf + 9) = v7 >> 6; /*0xe36b*/
*((_BYTE *)buf + 10) = (v7 & 0x20) != 0; /*0xe377*/
if ( (v7 & 0x1F) == 0x1F )
{
*((_DWORD *)buf + 3) = 0; /*0xe383*/
while ( v9 < v6 )
{
v10 = *v9; /*0xe38d*/
v11 = *v9++; /*0xe398*/
DebugLogPrint(0, "ASN.1: Extended tag data: 0x%02x", v11);
*((_DWORD *)buf + 3) = (*((_DWORD *)buf + 3) << 7) | v10 & 0x7F; /*0xe3b3*/
if ( v10 >= 0 ) /*0xe3ba*/
goto LABEL_10; /*0xe3ba*/
}
ASN.1:_Identifier_underflow = "ASN.1: Identifier underflow";
goto LABEL_34; /*0xe3c5*/
}
*((_DWORD *)buf + 3) = v7 & 0x1F; /*0xe3d0*/
LABEL_10:
if ( v9 >= v6 )
{
ASN.1:_Identifier_underflow = "ASN.1: No room for Length";
LABEL_34:
DebugLogPrint(1, ASN.1:_Identifier_underflow); /*0xe4a4*/
return 0xFFFFFFFFLL; /*0xe4a6*/
}
v13 = *v9; /*0xe3e5*/
v14 = v9 + 1; /*0xe3e8*/
if ( v13 >= 0 )
{
*((_DWORD *)buf + 4) = (unsigned __int8)v13; /*0xe447*/
}
else
{
if ( v13 == -1 )
{
ASN.1:_Identifier_underflow = "ASN.1: Reserved length value 0xff used";
goto LABEL_34; /*0xe3fb*/
}
*((_DWORD *)buf + 4) = 0; /*0xe400*/
n4 = v13 & 0x7F; /*0xe405*/
if ( n4 > 4u )
{
ASN.1:_Identifier_underflow = "ASN.1: Too long length field";
goto LABEL_34; /*0xe414*/
}
while ( n4 )
{
--n4; /*0xe419*/
if ( v14 >= v6 )
{
ASN.1:_Identifier_underflow = "ASN.1: Length underflow";
goto LABEL_34; /*0xe442*/
}
*((_DWORD *)buf + 4) = *v14++ | (*((_DWORD *)buf + 4) << 8); /*0xe42e*/
}
}
if ( v6 < v14 || (v16 = *((unsigned int *)buf + 4), (unsigned int)v16 > (int)v6 - (int)v14) )
{
ASN.1:_Identifier_underflow = "ASN.1: Contents underflow";
goto LABEL_34; /*0xe49d*/
}
v17 = *((_BYTE *)buf + 9) == 0; /*0xe45c*/
*buf = v14; /*0xe461*/
if ( v17 && *((_DWORD *)buf + 3) == 1 )
{
if ( (_DWORD)v16 != 1 )
{
DebugLogPrint(1, "ASN.1: Unexpected BOOLEAN length (%u)", v16);
LABEL_31:
v8 = 0; /*0xe496*/
return (unsigned int)(v8 - 1); /*0xe496*/
}
if ( (unsigned __int8)(*v14 - 1) <= 0xFDu )
{
DebugLogPrint(1, "ASN.1: Invalid BOOLEAN value 0x%x (DER requires 0 or 0xff)", *v14);
goto LABEL_31; /*0xe491*/
}
}
return (unsigned int)(v8 - 1); /*0xe49b*/
}
DebugLogPrint(1, "ASN.1: No room for Identifier");
return 0xFFFFFFFFLL; /*0xe4bd*/
}
// Function: GetInfo_6 @ 0xe4c8 (0xc6 bytes)
__int64 __fastcall GetInfo_6(char *a1, __int64 a2, unsigned __int64 *buf)
{
char *v6; // r9
__int64 v7; // r8
char v8; // dl
int v9; // ecx
unsigned __int64 n0x14; // rax
unsigned int n2; // edx
MemGetInfo(buf, 0x58u); /*0xe4e8*/
v6 = &a1[a2]; /*0xe4ed*/
while ( a1 < v6 )
{
LODWORD(v7) = 0; /*0xe4fc*/
do /*0xe521*/
{
if ( a1 >= v6 ) /*0xe502*/
return 0xFFFFFFFFLL; /*0xe502*/
v8 = *a1; /*0xe508*/
v9 = *a1++ & 0x7F; /*0xe513*/
v7 = ((_DWORD)v7 << 7) | (unsigned int)v9; /*0xe51c*/
}
while ( v8 < 0 ); /*0xe521*/
n0x14 = buf[10]; /*0xe523*/
if ( n0x14 >= 0x14 )
{
DebugLogPrint(1, "ASN.1: Too long OID value", v7);
return 0xFFFFFFFFLL; /*0xe589*/
}
if ( n0x14 ) /*0xe530*/
{
*((_DWORD *)buf + n0x14) = v7; /*0xe559*/
++buf[10]; /*0xe55d*/
}
else
{
n2 = (unsigned int)v7 / 0x28; /*0xe53a*/
if ( (unsigned int)v7 / 0x28 > 2 ) /*0xe540*/
n2 = 2; /*0xe540*/
*(_DWORD *)buf = n2; /*0xe544*/
*((_DWORD *)buf + 1) = v7 - 40 * n2; /*0xe54f*/
buf[10] = 2; /*0xe553*/
}
}
return 0; /*0xe572*/
}
// Function: Asn1ParseOid @ 0xe590 (0x5a bytes)
__int64 __fastcall Asn1ParseOid(unsigned __int64 *buf, _QWORD *a2, __int64 a3)
{
__int64 v6; // rdx
char *v7; // rcx
if ( *(_DWORD *)(a3 + 16) )
{
if ( !*(_BYTE *)(a3 + 9) && *(_DWORD *)(a3 + 12) == 6 ) /*0xe5ad*/
{
v6 = *(unsigned int *)(a3 + 16); /*0xe5af*/
v7 = *(char **)a3; /*0xe5b2*/
*a2 = *(_QWORD *)a3 + v6; /*0xe5b9*/
return GetInfo_6(v7, v6, buf); /*0xe5c3*/
}
DebugLogPrint(1, "ASN.1: Expected OID - found class %d tag 0x%x", *(unsigned __int8 *)(a3 + 9), *(_DWORD *)(a3 + 12));
}
return 0xFFFFFFFFLL; /*0xe5bf*/
}
// Function: BitStringToInt @ 0xe5ec (0x113 bytes)
__int64 __fastcall BitStringToInt(__int64 buf_, unsigned __int64 n2, double a3)
{
unsigned int v3; // ebx
unsigned __int8 *v4; // r8
__int64 n8; // r10
unsigned __int8 v7; // r11
unsigned __int8 v8; // al
__int64 n8_1; // rbx
unsigned __int8 v10; // cl
unsigned __int8 v11; // dl
unsigned __int8 v12; // r11
unsigned __int8 v13; // al
__int64 n8_2; // rdi
unsigned __int8 v15; // cl
unsigned __int8 v16; // dl
unsigned __int8 v17; // r11
unsigned __int8 v18; // al
__int64 n8_3; // rdi
unsigned __int8 v20; // cl
unsigned __int8 v21; // dl
unsigned __int8 v22; // r11
unsigned __int8 v23; // al
unsigned __int8 v24; // cl
unsigned __int8 v25; // dl
v3 = 0; /*0xe5f6*/
v4 = (unsigned __int8 *)(buf_ + 1); /*0xe5f8*/
n8 = 8; /*0xe5ff*/
if ( n2 >= 2 ) /*0xe607*/
{
v7 = *v4; /*0xe609*/
v8 = 0; /*0xe60c*/
n8_1 = 8; /*0xe60e*/
do /*0xe62d*/
{
v10 = v7; /*0xe613*/
v11 = 2 * v8; /*0xe616*/
v7 >>= 1; /*0xe61b*/
v8 = (2 * v8) | 1; /*0xe623*/
if ( (v10 & 1) == 0 ) /*0xe626*/
v8 = v11; /*0xe626*/
--n8_1; /*0xe629*/
}
while ( n8_1 ); /*0xe62d*/
v3 = v8; /*0xe62f*/
++v4; /*0xe632*/
}
if ( n2 >= 3 ) /*0xe639*/
{
v12 = *v4; /*0xe63b*/
v13 = 0; /*0xe63e*/
n8_2 = 8; /*0xe640*/
do /*0xe65f*/
{
v15 = v12; /*0xe645*/
v16 = 2 * v13; /*0xe648*/
v12 >>= 1; /*0xe64d*/
v13 = (2 * v13) | 1; /*0xe655*/
if ( (v15 & 1) == 0 ) /*0xe658*/
v13 = v16; /*0xe658*/
--n8_2; /*0xe65b*/
}
while ( n8_2 ); /*0xe65f*/
v3 |= v13 << 8; /*0xe667*/
++v4; /*0xe669*/
}
if ( n2 >= 4 ) /*0xe670*/
{
v17 = *v4; /*0xe672*/
v18 = 0; /*0xe675*/
n8_3 = 8; /*0xe677*/
do /*0xe696*/
{
v20 = v17; /*0xe67c*/
v21 = 2 * v18; /*0xe67f*/
v17 >>= 1; /*0xe684*/
v18 = (2 * v18) | 1; /*0xe68c*/
if ( (v20 & 1) == 0 ) /*0xe68f*/
v18 = v21; /*0xe68f*/
--n8_3; /*0xe692*/
}
while ( n8_3 ); /*0xe696*/
v3 |= v18 << 16; /*0xe69e*/
++v4; /*0xe6a0*/
}
if ( n2 >= 5 ) /*0xe6a7*/
{
v22 = *v4; /*0xe6a9*/
v23 = 0; /*0xe6ac*/
do /*0xe6ca*/
{
v24 = v22; /*0xe6b0*/
v25 = 2 * v23; /*0xe6b3*/
v22 >>= 1; /*0xe6b8*/
v23 = (2 * v23) | 1; /*0xe6c0*/
if ( (v24 & 1) == 0 ) /*0xe6c3*/
v23 = v25; /*0xe6c3*/
--n8; /*0xe6c6*/
}
while ( n8 ); /*0xe6ca*/
v3 |= v23 << 24; /*0xe6d2*/
}
if ( n2 >= 6 )
DebugLogPrint(1, "X509: %a - some bits ignored (BIT STRING length %lu)", a3, n2);
return v3; /*0xe6f9*/
}
// Function: ReadUnaligned16 @ 0xe700 (0x2d bytes)
__int64 __fastcall ReadUnaligned16(unsigned __int16 *a1)
{
if ( !a1 ) /*0xe70c*/
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 38, (__int64)"Buffer != ((void *) 0)"); /*0xe71f*/
return *a1; /*0xe727*/
}
// Function: ReadUnaligned64 @ 0xe730 (0x2f bytes)
__int64 __fastcall ReadUnaligned64(__int64 a1)
{
if ( !a1 ) /*0xe73c*/
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, (__int64)"Buffer != ((void *) 0)"); /*0xe751*/
return *(_QWORD *)a1; /*0xe759*/
}
// Function: AsciiStrLen @ 0xe760 (0x6b bytes)
unsigned __int64 __fastcall AsciiStrLen(_BYTE *i)
{
_BYTE *i_1; // rbx
unsigned __int64 j; // rdi
i_1 = i; /*0xe76a*/
if ( !i ) /*0xe770*/
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 1082, (__int64)"String != ((void *) 0)"); /*0xe785*/
for ( j = 0; *i_1; ++j ) /*0xe78c*/
{
if ( j >= 0xF4240 ) /*0xe798*/
AssertReport( /*0xe7ad*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
1090,
(__int64)"Length < _gPcd_FixedAtBuild_PcdMaximumAsciiStringLength");
++i_1; /*0xe7b2*/
}
return j; /*0xe7c5*/
}
// Function: AsciiStrCmpNoCase @ 0xe7cc (0xc9 bytes)
__int64 __fastcall AsciiStrCmpNoCase(char *i, char *i_2)
{
char *i_1; // rbx
char v4; // dl
char v5; // cl
char *v6; // rdi
i_1 = i; /*0xe7d9*/
if ( AsciiStrLen(i) == -1 ) /*0xe7e5*/
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 1260, (__int64)"AsciiStrSize (FirstString)"); /*0xe7fa*/
if ( AsciiStrLen(i_2) == -1 ) /*0xe80b*/
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 1261, (__int64)"AsciiStrSize (SecondString)"); /*0xe820*/
v4 = *i_1; /*0xe82a*/
if ( (unsigned __int8)(*i_1 - 97) <= 0x19u ) /*0xe838*/
v4 -= 32; /*0xe83a*/
v5 = *i_2; /*0xe83d*/
if ( (unsigned __int8)(*i_2 - 97) <= 0x19u ) /*0xe847*/
v5 -= 32; /*0xe849*/
if ( *i_1 ) /*0xe84c*/
{
v6 = (char *)(i_2 - i_1); /*0xe851*/
do /*0xe87a*/
{
if ( v4 != v5 ) /*0xe856*/
break; /*0xe856*/
v4 = *++i_1; /*0xe85b*/
if ( (unsigned __int8)(*i_1 - 97) <= 0x19u ) /*0xe865*/
v4 -= 32; /*0xe867*/
v5 = i_1[(_QWORD)v6]; /*0xe86a*/
if ( (unsigned __int8)(v5 - 97) <= 0x19u ) /*0xe875*/
v5 -= 32; /*0xe877*/
}
while ( *i_1 ); /*0xe87a*/
}
return v4 - v5; /*0xe88f*/
}
// Function: WStrLen @ 0xe898 (0x56 bytes)
unsigned __int64 __fastcall WStrLen(_WORD *%a)
{
unsigned __int64 n0xF4240; // rax
if ( ((unsigned __int8)%a & 1) != 0 ) /*0xe8a4*/
AssertReport( /*0xe8b9*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c",
128,
(__int64)"((UINTN) String & 0x00000001) == 0");
if ( !%a ) /*0xe8c3*/
return 0; /*0xe8e6*/
n0xF4240 = 0; /*0xe8c5*/
if ( *%a ) /*0xe8c7*/
{
while ( n0xF4240 < 0xF4240 ) /*0xe8d2*/
{
if ( !%a[++n0xF4240] ) /*0xe8d7*/
return n0xF4240; /*0xe8db*/
}
return 1000001; /*0xe8df*/
}
return n0xF4240; /*0xe8e8*/
}
// Function: AsciiStrLen @ 0xe8f0 (0x23 bytes)
unsigned __int64 __fastcall AsciiStrLen(_BYTE *%a)
{
unsigned __int64 n0xF4240; // rax
n0xF4240 = 0; /*0xe8f0*/
if ( %a && *%a ) /*0xe8f7*/
{
while ( n0xF4240 < 0xF4240 ) /*0xe901*/
{
if ( !%a[++n0xF4240] ) /*0xe906*/
return n0xF4240; /*0xe90a*/
}
return 1000001; /*0xe90d*/
}
return n0xF4240; /*0xe90c*/
}
// Function: SataConfig_10 @ 0xe914 (0xfc bytes)
unsigned __int64 __fastcall SataConfig_10(_BYTE *%a, __int64 count, unsigned __int64 *a3)
{
_BYTE *%a_1; // rbx
const char *(String____((void__)_0)); // r8
__int64 n2206; // rdx
__int64 v8; // r9
%a_1 = %a; /*0xe921*/
if ( !%a ) /*0xe927*/
{
(String____((void__)_0)) = "(String != ((void *) 0))"; /*0xe929*/
n2206 = 2206; /*0xe930*/
LABEL_3:
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c", n2206, (__int64)(String____((void__)_0))); /*0xe935*/
return 0x8000000000000002uLL; /*0xe94b*/
}
if ( !a3 ) /*0xe953*/
{
(String____((void__)_0)) = "(Data != ((void *) 0))"; /*0xe955*/
n2206 = 2207; /*0xe95c*/
goto LABEL_3; /*0xe961*/
}
if ( AsciiStrLen(%a) > 0xF4240 ) /*0xe96e*/
AssertReport( /*0xe983*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c",
2213,
(__int64)"(AsciiStrnLenS (String, (_gPcd_FixedAtBuild_PcdMaximumAsciiStringLength) + 1) <= (_gPcd_FixedAtBuild_PcdM"
"aximumAsciiStringLength))");
if ( AsciiStrLen(%a_1) > 0xF4240 ) /*0xe996*/
return 0x8000000000000002uLL; /*0xe996*/
while ( *%a_1 == 32 || *%a_1 == 9 ) /*0xe9a0*/
++%a_1; /*0xe9a2*/
while ( *%a_1 == 48 ) /*0xe9ad*/
++%a_1; /*0xe9a7*/
*a3 = 0; /*0xe9af*/
while ( (unsigned __int8)(*%a_1 - 48) <= 9u ) /*0xe9b9*/
{
v8 = (char)*%a_1 - 48; /*0xe9c4*/
if ( *a3 > ~v8 / 0xAuLL ) /*0xe9e1*/
{
*a3 = -1; /*0xe9f3*/
return 0x8000000000000003uLL; /*0xea01*/
}
++%a_1; /*0xe9e7*/
*a3 = v8 + 10 * *a3; /*0xe9ee*/
}
return 0; /*0xea0a*/
}
// Function: MemGetInfo @ 0xea10 (0x50 bytes)
void *__fastcall MemGetInfo(void *buf, unsigned __int64 count)
{
if ( count - 1 > -1 - (__int64)buf ) /*0xea2e*/
AssertReport( /*0xea43*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMemWrapper.c",
54,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer)");
return InternalZeroMem(buf, count, 0); /*0xea56*/
}
// Function: MemConfig_0 @ 0xea60 (0x9e bytes)
char *__fastcall MemConfig_0(char *dst, char *src, unsigned __int64 count)
{
unsigned __int64 v3; // rbp
v3 = count - 1; /*0xea7d*/
if ( count - 1 > -1 - (__int64)dst ) /*0xea93*/
AssertReport( /*0xeaa6*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
56,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
if ( v3 > -1 - (__int64)src ) /*0xeab1*/
AssertReport( /*0xeac6*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
57,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
if ( dst == src ) /*0xeace*/
return dst; /*0xead0*/
else
return InternalCopyMem(dst, src, count); /*0xeade*/
}
// Function: MemConfig @ 0xeb00 (0xd6 bytes)
unsigned __int64 __fastcall MemConfig(unsigned __int64 a1, unsigned __int64 a2, __int64 a3)
{
if ( !a3 || a1 == a2 ) /*0xeb29*/
return 0; /*0xebbf*/
if ( !a1 ) /*0xeb32*/
AssertReport( /*0xeb45*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
60,
(__int64)"DestinationBuffer != ((void *) 0)");
if ( !a2 ) /*0xeb4d*/
AssertReport( /*0xeb60*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
61,
(__int64)"SourceBuffer != ((void *) 0)");
if ( a3 - 1 > ~a1 ) /*0xeb72*/
AssertReport( /*0xeb87*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
62,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
if ( a3 - 1 > ~a2 ) /*0xeb95*/
AssertReport( /*0xebaa*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
63,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
return InternalCompareMemAligned((_BYTE *)a1, (_BYTE *)a2, a3); /*0xebd0*/
}
// Function: MemSet16 @ 0xebd8 (0x33 bytes)
_BYTE *__fastcall MemSet16(_BYTE *KeyBuffer, unsigned __int64 KeyBuffer_1, __int64 i, __int16 n32, __int64 n2)
{
__int64 j; // r10
for ( j = 0; j < i; ++j ) /*0xebde*/
{
if ( (unsigned __int64)KeyBuffer >= KeyBuffer_1 ) /*0xebe3*/
break; /*0xebe3*/
*KeyBuffer = n32; /*0xebeb*/
if ( n2 != 1 ) /*0xebee*/
KeyBuffer[1] = HIBYTE(n32); /*0xebf7*/
KeyBuffer += n2; /*0xebfa*/
}
return KeyBuffer; /*0xec0a*/
}
// Function: Uint64ToHexStr @ 0xec0c (0x76 bytes)
_BYTE *__fastcall Uint64ToHexStr(_BYTE *_r_n, unsigned __int64 a2, __int64 n16)
{
int n16_1; // edi
unsigned __int64 n16_2; // rbp
_BYTE *_r_n_1; // rbx
unsigned __int64 v7; // rtt
n16_1 = n16; /*0xec20*/
*_r_n = 0; /*0xec23*/
n16_2 = (unsigned int)n16; /*0xec29*/
_r_n_1 = _r_n; /*0xec2c*/
do /*0xec68*/
{
if ( !n16_1 ) /*0xec31*/
AssertReport((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\DivU64x32Remainder.c", 47, (__int64)"Divisor != 0"); /*0xec44*/
++_r_n_1; /*0xec55*/
v7 = a2; /*0xec58*/
a2 /= n16_2; /*0xec5b*/
*_r_n_1 = a0123456789abcd[(unsigned int)(v7 % n16_2)]; /*0xec63*/
}
while ( a2 ); /*0xec68*/
return _r_n_1; /*0xec7c*/
}
// Function: FormatString @ 0xec84 (0xe07 bytes)
unsigned __int64 __fastcall FormatString(
unsigned __int64 KeyBuffer,
unsigned __int64 n0xF4240,
__int16 a3,
unsigned __int8 *%a,
unsigned __int16 **va)
{
unsigned __int8 *%a_2; // r14
__int64 v6; // r12
unsigned __int64 KeyBuffer_1; // r13
__int64 v9; // rdi
const char *(Buffer____((void__)_0)); // r8
__int64 n578; // rdx
__int64 n0xFFFF; // rdx
unsigned __int64 KeyBuffera_1; // rbx
unsigned __int64 v15; // r10
__int64 n2_3; // rsi
int v17; // eax
bool v18; // zf
unsigned __int64 n10; // rcx
unsigned __int8 *%a_3; // rdx
unsigned __int8 *%a_4; // r8
unsigned __int64 v22; // r9
char v23; // r11
unsigned __int64 v24; // rdi
const char *_r_n_1; // rbx
unsigned __int16 **va_1; // r10
unsigned __int8 *%a_5; // rdx
int v28; // eax
unsigned __int64 n13_1; // rcx
unsigned __int16 *v30; // rax
int v31; // eax
unsigned __int8 *%a_6; // rdx
unsigned __int64 v33; // rcx
unsigned __int64 v34; // rcx
unsig... [30547 chars total]
// Function: UnicodeSPrint @ 0xfa8c (0x22 bytes)
unsigned __int64 UnicodeSPrint(_BYTE *_r_n, unsigned __int64 n38, __int16 a3, char *%02d_%02d_%04d__%02d:%02d, ...)
{
va_list va; // [rsp+60h] [rbp+28h] BYREF
va_start(va, %02d_%02d_%04d__%02d:%02d);
return FormatString( /*0xfaa9*/
(unsigned __int64)_r_n,
n38,
a3,
(unsigned __int8 *)%02d_%02d_%04d__%02d:%02d,
(unsigned __int16 **)va);
}
// Function: CpuConfig @ 0xfab0 (0x38 bytes)
__int64 __fastcall CpuConfig(unsigned int _RAX, _DWORD *a2, _DWORD *a3, _DWORD *a4, _DWORD *a5)
{
__int64 result; // rax
_RAX = _RAX; /*0xfabf*/
__asm { cpuid } /*0xfac4*/
if ( a2 ) /*0xfac9*/
*a2 = result; /*0xfacb*/
if ( a3 ) /*0xfad1*/
*a3 = _RBX; /*0xfad3*/
if ( a4 ) /*0xfad9*/
*a4 = _RCX; /*0xfadb*/
if ( a5 ) /*0xfae1*/
*a5 = _RDX; /*0xfae3*/
return result; /*0xfae6*/
}
// Function: MemSet @ 0xfaf0 (0x5d bytes)
int *__fastcall MemSet(int *buf, int value, unsigned __int64 n4)
{
int *buf_1; // rdi
int value_1; // eax
unsigned __int64 n4_1; // rcx
__int16 value_2; // bx
int v7; // eax
__int64 v8; // rdx
char n4_2; // dl
unsigned __int64 i; // rcx
buf_1 = buf; /*0xfaf3*/
value_1 = value; /*0xfaf6*/
n4_1 = n4; /*0xfaf9*/
BYTE1(value_1) = value; /*0xfb0a*/
value_2 = value_1; /*0xfb0c*/
v7 = value_1 << 16; /*0xfb0f*/
LOWORD(v7) = value_2; /*0xfb13*/
if ( n4 >= 4 ) /*0xfb1a*/
{
v8 = (unsigned __int8)buf_1 & 3; /*0xfb1f*/
if ( ((unsigned __int8)buf_1 & 3) != 0 ) /*0xfb23*/
{
memset(buf_1, value_2, 4 - v8); /*0xfb32*/
buf_1 = (int *)((char *)buf_1 + 4 - v8); /*0xfb32*/
n4_1 = n4 - (4 - v8); /*0xfb34*/
}
n4_2 = n4_1; /*0xfb37*/
for ( i = n4_1 >> 2; i; --i ) /*0xfb3a*/
*buf_1++ = v7; /*0xfb3e*/
n4_1 = n4_2 & 3; /*0xfb44*/
}
memset(buf_1, value_2, n4_1); /*0xfb47*/
return buf; /*0xfb4a*/
}
// Function: MemMove @ 0xfb50 (0xb0 bytes)
char *__fastcall MemMove(char *KeyBuffer, char *KeyBuffer_2, unsigned __int64 n64)
{
unsigned __int64 KeyBuffer_1; // rdi
unsigned __int64 n64_1; // rcx
char v10; // dl
char *n8; // rax
unsigned __int64 count; // rax
unsigned __int64 count_1; // rbx
char n64_2; // al
unsigned __int64 v15; // rcx
unsigned __int64 n64_3; // rax
__asm { pushf } /*0xfb53*/
KeyBuffer_1 = (unsigned __int64)KeyBuffer; /*0xfb59*/
n64_1 = n64; /*0xfb5c*/
v10 = 0; /*0xfb5f*/
n8 = &KeyBuffer_2[-KeyBuffer_1]; /*0xfb64*/
if ( (unsigned __int64)KeyBuffer_2 < KeyBuffer_1 ) /*0xfb67*/
{
n8 = (char *)(KeyBuffer_1 - (_QWORD)KeyBuffer_2); /*0xfb6d*/
if ( (unsigned __int64)&KeyBuffer_2[n64] >= KeyBuffer_1 ) /*0xfb73*/
{
KeyBuffer_2 += n64; /*0xfb75*/
KeyBuffer_1 += n64; /*0xfb78*/
v10 = 1; /*0xfb7c*/
}
}
if ( n64 < 8 || (unsigned __int64)n8 < 8 ) /*0xfb89*/
goto LABEL_19; /*0xfb89*/
count = (unsigned __int8)KeyBuffer_2 & 7; /*0xfb91*/
count_1 = KeyBuffer_1 & 7; /*0xfb95*/
if ( v10 ) /*0xfb9b*/
{
--KeyBuffer_2; /*0xfb9d*/
--KeyBuffer_1; /*0xfba0*/
}
if ( count == count_1 && count ) /*0xfbab*/
{
if ( !v10 ) /*0xfbaf*/
count = 8 - count; /*0xfbb4*/
qmemcpy((void *)KeyBuffer_1, KeyBuffer_2, count); /*0xfbbd*/
KeyBuffer_2 += count; /*0xfbbd*/
KeyBuffer_1 += count; /*0xfbbd*/
n64_1 = n64 - count; /*0xfbbf*/
}
if ( v10 ) /*0xfbc4*/
{
KeyBuffer_2 -= 7; /*0xfbc6*/
KeyBuffer_1 -= 7LL; /*0xfbca*/
}
n64_2 = n64_1; /*0xfbce*/
v15 = n64_1 >> 3; /*0xfbd1*/
qmemcpy((void *)KeyBuffer_1, KeyBuffer_2, 8 * v15); /*0xfbd5*/
KeyBuffer_2 += 8 * v15; /*0xfbd5*/
KeyBuffer_1 += 8 * v15; /*0xfbd5*/
n64_3 = n64_2 & 7; /*0xfbd8*/
if ( n64_3 ) /*0xfbdc*/
{
if ( v10 ) /*0xfbe0*/
{
KeyBuffer_2 += 8; /*0xfbe2*/
KeyBuffer_1 += 8LL; /*0xfbe6*/
}
n64_1 = n64_3; /*0xfbea*/
LABEL_19:
if ( v10 ) /*0xfbef*/
{
--KeyBuffer_2; /*0xfbf1*/
--KeyBuffer_1; /*0xfbf4*/
}
qmemcpy((void *)KeyBuffer_1, KeyBuffer_2, n64_1); /*0xfbf7*/
}
__asm { popf } /*0xfbf9*/
return KeyBuffer; /*0xfbfc*/
}