SmCrEncStart
NTSTATUS __stdcall SmCrEncStart(_SMCR_ENCRYPT_CONTEXT *EncryptCtx, INT8 *KeyPtr, UINT64 KeySize, UINT64 Flags){
unsigned int v5;
NTSTATUS result;
UINT32 v8;
size_t *v9;
VOID *v10;
_SIZE_T v11;
VOID *v12;
UINT32 v13;
VOID *v14;
UINT32 pcbResult;
UINT32 cbSecret;
UINT32 cbSecreta;
UINT32 v18;
UINT32 dwFlags;
size_t pbOutput;
dwFlags = 0;
pbOutput = 0;
v5 = KeySize;
result = (unsigned int)BCryptOpenAlgorithmProvider(EncryptCtx, (_LPCWSTR)&stru_1407D7500._MxCsr, 0, 1u);
if( result >= 0 )
{
v9 = (size_t *)(EncryptCtx + 2);
result = (unsigned int)BCryptGetProperty(
*(BCRYPT_HANDLE *)EncryptCtx,
(_LPCWSTR)&stru_1407D7500._R13,
(PUCHAR)EncryptCtx + 8,
v8,
&dwFlags,
cbSecret);
if( result >= 0 )
{
if( !*v9 || ((*v9 - 1) & *v9) != 0 )
{
return -1073741453;
}
else
{
LODWORD(v10) = SSHSupportAllocateNonPaged(v5, 0x52436D73u);
*((_QWORD *)EncryptCtx + 2) = v10;
if( !v10 )
return -1073741670;
if( KeyPtr )
{
memmove(v10, KeyPtr, v5);
}
else
{
result = SmCrGenRandom((INT8 *)v10, v5);
if( result < 0 )
return result;
}
v11 = *v9;
EncryptCtx[6] = v5;
LODWORD(v12) = SSHSupportAllocateNonPaged(v11, 0x52436D73u);
*((_QWORD *)EncryptCtx + 6) = v12;
if( !v12 )
return -1073741670;
memset(v12, 0i64, *v9);
result = (unsigned int)BCryptGetProperty(
*(BCRYPT_HANDLE *)EncryptCtx,
(_LPCWSTR)L"ObjectLength",
(PUCHAR)&pbOutput,
v13,
&dwFlags,
cbSecreta);
if( result >= 0 )
{
LODWORD(v14) = SSHSupportAllocateNonPaged(pbOutput, 0x52436D73u);
*((_QWORD *)EncryptCtx + 5) = v14;
if( !v14 )
return -1073741670;
memset(v14, 0i64, pbOutput);
result = (unsigned int)BCryptSetProperty(
*(BCRYPT_HANDLE *)EncryptCtx,
(_LPCWSTR)&stru_1407D7500._Rbx,
(PUCHAR)&stru_1407D7500.TrapFrame,
0x20u,
pcbResult);
if( result >= 0 )
{
result = (unsigned int)BCryptGenerateSymmetricKey(
*(_QWORD *)EncryptCtx,
EncryptCtx + 8,
*((PUCHAR *)EncryptCtx + 5),
pbOutput,
*((PUCHAR *)EncryptCtx + 2),
EncryptCtx[6],
v18);
if( result >= 0 )
return 0;
}
}
}
}
}
return result;
}Referenced by:
ST_STORE::StStart