undefined4 RTMPSoftDecryptAES(undefined4 param_1,byte *param_2,int param_3,int param_4)
{
bool bVar1;
byte *pbVar2;
byte *pbVar3;
char *pcVar4;
byte *pbVar5;
int iVar6;
uint uVar7;
int iVar8;
int iVar9;
uint uVar10;
uint __n;
byte local_c0;
byte local_bf;
byte local_be;
byte local_bd;
byte local_bc;
byte local_bb;
byte local_b8 [8];
undefined1 auStack_b0 [8];
byte local_a8 [16];
undefined1 auStack_98 [16];
byte local_88 [16];
byte local_78 [16];
undefined1 auStack_68 [16];
byte local_58 [16];
byte local_48 [16];
byte *local_38;
int local_34;
uint local_30;
uint local_2c;
uVar10 = (uint)param_2[1] & ((uint)param_2[1] << 0x1e) >> 0x1f;
iVar9 = 0x1e;
if (uVar10 == 0) {
iVar9 = 0x18;
}
bVar1 = (*param_2 >> 4) - 8 < 4;
if (bVar1) {
iVar9 = iVar9 + 2;
}
if (*(char *)(param_4 + 0x41) == '\0') {
if (RTDebugLevel < 3) {
return 0;
}
pcVar4 = "RTMPSoftDecryptAES failed!(the Length can not be 0)\n";
}
else {
pbVar2 = param_2 + iVar9;
local_c0 = *pbVar2;
local_bf = pbVar2[1];
local_be = pbVar2[4];
local_bd = pbVar2[5];
local_bc = pbVar2[6];
local_bb = pbVar2[7];
local_2c = (param_3 + -0x10) - iVar9;
local_30 = local_2c >> 4;
__n = local_2c & 0xf;
uVar7 = 0;
local_38 = pbVar2;
while (uVar7 < local_30) {
uVar7 = uVar7 + 1;
construct_ctr_preload(auStack_98,uVar10,bVar1,param_2,&local_c0,uVar7);
aes128k128d(param_4,auStack_98,local_a8);
iVar8 = 0;
do {
local_88[iVar8] = pbVar2[iVar8 + 8] ^ local_a8[iVar8];
iVar8 = iVar8 + 1;
} while (iVar8 != 0x10);
memmove(pbVar2,local_88,0x10) //possible issue identified - semgrep
pbVar2 = pbVar2 + 0x10;
}
local_34 = local_30 * 0x10;
iVar8 = local_34 + iVar9 + 8;
if (__n != 0) {
construct_ctr_preload(auStack_98,uVar10,bVar1,param_2,&local_c0,local_30 + 1);
memset(local_78,0,0x10) //possible issue identified - semgrep
memmove(local_78,param_2 + iVar8,__n) //possible issue identified - semgrep
aes128k128d(param_4,auStack_98,local_a8);
iVar6 = 0;
do {
pbVar2 = local_78 + iVar6;
pbVar3 = local_a8 + iVar6;
pbVar5 = local_88 + iVar6;
iVar6 = iVar6 + 1;
*pbVar5 = *pbVar2 ^ *pbVar3;
} while (iVar6 != 0x10);
memmove(param_2 + iVar8 + -8,local_88,__n) //possible issue identified - semgrep
iVar8 = iVar8 + __n;
}
construct_ctr_preload(auStack_98,uVar10,bVar1,param_2,&local_c0,0);
memset(local_78,0,0x10) //possible issue identified - semgrep
memmove(local_78,param_2 + iVar8,8) //possible issue identified - semgrep
aes128k128d(param_4,auStack_98,local_a8);
iVar8 = 0;
do {
pbVar2 = local_78 + iVar8;
pbVar3 = local_a8 + iVar8;
pbVar5 = local_88 + iVar8;
iVar8 = iVar8 + 1;
*pbVar5 = *pbVar2 ^ *pbVar3;
} while (iVar8 != 0x10);
memmove(auStack_b0,local_88,8) //possible issue identified - semgrep
param_2[1] = param_2[1] | 0x40;
construct_mic_iv(auStack_68,bVar1,uVar10,param_2,local_2c,&local_c0);
construct_mic_header1(local_58,iVar9,param_2);
construct_mic_header2(local_48,param_2,uVar10,bVar1);
aes128k128d(param_4,auStack_68,local_a8);
iVar8 = 0;
do {
pbVar2 = local_58 + iVar8;
pbVar3 = local_a8 + iVar8;
pbVar5 = local_88 + iVar8;
iVar8 = iVar8 + 1;
*pbVar5 = *pbVar2 ^ *pbVar3;
} while (iVar8 != 0x10);
aes128k128d(param_4,local_88,local_a8);
iVar8 = 0;
do {
pbVar2 = local_48 + iVar8;
pbVar3 = local_a8 + iVar8;
pbVar5 = local_88 + iVar8;
iVar8 = iVar8 + 1;
*pbVar5 = *pbVar2 ^ *pbVar3;
} while (iVar8 != 0x10);
aes128k128d(param_4,local_88,local_a8);
for (uVar10 = 0; iVar8 = 0, uVar10 < local_30; uVar10 = uVar10 + 1) {
do {
pbVar3 = local_a8 + iVar8;
pbVar2 = local_38 + iVar8;
pbVar5 = local_88 + iVar8;
iVar8 = iVar8 + 1;
*pbVar5 = *pbVar2 ^ *pbVar3;
} while (iVar8 != 0x10);
aes128k128d(param_4,local_88,local_a8);
local_38 = local_38 + 0x10;
}
iVar9 = local_34 + iVar9;
if (__n != 0) {
memset(local_78,0,0x10) //possible issue identified - semgrep
memmove(local_78,param_2 + iVar9,__n) //possible issue identified - semgrep
iVar9 = 0;
do {
pbVar2 = local_78 + iVar9;
pbVar3 = local_a8 + iVar9;
pbVar5 = local_88 + iVar9;
iVar9 = iVar9 + 1;
*pbVar5 = *pbVar2 ^ *pbVar3;
} while (iVar9 != 0x10);
aes128k128d(param_4);
}
iVar9 = 0;
do {
pbVar2 = local_a8 + iVar9;
pbVar3 = local_b8 + iVar9;
iVar9 = iVar9 + 1;
*pbVar3 = *pbVar2;
} while (iVar9 != 8);
iVar9 = memcmp(local_b8,auStack_b0,8);
if (iVar9 == 0) {
return 1;
}
if (RTDebugLevel == 0) {
return 0;
}
pcVar4 = "RTMPSoftDecryptAES, MIC Error !\n";
}
printk(pcVar4);
return 0;
}