Newer
Older
AMI-Aptio-BIOS-Reversed / AmiCryptoPkg / CryptoLib / CryptLibInitRun / CryptoDXE.c
@Ajax Dong Ajax Dong 2 days ago 257 KB Recovering names
#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*/
}