void RT_AES_Decrypt(int param_1,uint param_2,undefined4 param_3,uint param_4,int param_5,
uint *param_6)
{
byte bVar1;
byte bVar2;
byte bVar3;
byte bVar4;
byte bVar5;
byte bVar6;
byte bVar7;
byte bVar8;
char cVar9;
int iVar10;
code *pcVar11;
char *pcVar12;
char *pcVar13;
int iVar14;
int iVar15;
byte *pbVar16;
int iVar17;
int iVar18;
int iVar19;
char *local_20 [2];
local_20[0] = (char *)0x0;
if (*param_6 < 0x10) {
if (RTDebugLevel == 0) {
return;
}
pcVar12 = "RT_AES_Decrypt: plain block size is %d bytes, it must be %d bytes(128 bits).\n";
param_2 = *param_6;
}
else {
if (((param_4 != 0x10) && (param_4 != 0x18)) && (param_4 != 0x20)) {
if (RTDebugLevel == 0) {
return;
}
printk("RT_AES_Decrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n"
,param_4,0x10,0x18,0x20);
return;
}
if (param_2 == 0x10) {
os_alloc_mem(0,local_20,0x100);
iVar17 = 0;
if (local_20[0] == (char *)0x0) {
if (RTDebugLevel == 0) {
return;
}
pcVar13 = "%s: Allocate memory fail!!!\n";
pcVar12 = "RT_AES_Decrypt";
pcVar11 = printk;
}
else {
do {
pcVar12 = (char *)(param_1 + iVar17);
iVar14 = 0;
do {
iVar10 = iVar17 * 4 + iVar14;
iVar14 = iVar14 + 1;
local_20[0][iVar10] = *pcVar12;
pcVar12 = pcVar12 + 4;
} while (iVar14 != 4);
iVar17 = iVar17 + 1;
} while (iVar17 != 4);
RT_AES_KeyExpansion(param_3,param_4,local_20[0]);
param_4 = param_4 >> 2;
iVar14 = (param_4 + 6) * 4;
iVar17 = 0;
do {
iVar10 = iVar17 * 0x3c;
iVar18 = iVar17 * 4;
local_20[0][iVar18] = local_20[0][iVar14 + iVar10 + 0x10] ^ local_20[0][iVar18];
iVar17 = iVar17 + 1;
local_20[0][iVar18 + 1] = local_20[0][iVar14 + iVar10 + 0x11] ^ local_20[0][iVar18 + 1];
local_20[0][iVar18 + 2] = local_20[0][iVar14 + iVar10 + 0x12] ^ local_20[0][iVar18 + 2];
local_20[0][iVar18 + 3] = local_20[0][iVar14 + iVar10 + 0x13] ^ local_20[0][iVar18 + 3];
} while (iVar17 != 4);
iVar14 = (param_4 + 5) * 4 + 2;
iVar17 = (param_4 + 5) * 4;
for (iVar10 = param_4 + 5; iVar10 != 0; iVar10 = iVar10 + -1) {
cVar9 = local_20[0][7] //possible issue identified - semgrep
local_20[0][7] = local_20[0][6];
iVar18 = 0;
local_20[0][6] = local_20[0][5];
local_20[0][5] = local_20[0][4];
local_20[0][4] = cVar9;
cVar9 = local_20[0][8] //possible issue identified - semgrep
local_20[0][8] = local_20[0][10];
local_20[0][10] = cVar9;
cVar9 = local_20[0][9] //possible issue identified - semgrep
local_20[0][9] = local_20[0][0xb];
local_20[0][0xb] = cVar9;
cVar9 = local_20[0][0xc] //possible issue identified - semgrep
local_20[0][0xc] = local_20[0][0xd];
local_20[0][0xd] = local_20[0][0xe];
local_20[0][0xe] = local_20[0][0xf];
local_20[0][0xf] = cVar9;
do {
iVar15 = iVar18 * 4;
iVar18 = iVar18 + 1;
local_20[0][iVar15] = aes_sbox_dec[(byte)local_20[0][iVar15]];
local_20[0][iVar15 + 1] = aes_sbox_dec[(byte)local_20[0][iVar15 + 1]];
local_20[0][iVar15 + 2] = aes_sbox_dec[(byte)local_20[0][iVar15 + 2]];
local_20[0][iVar15 + 3] = aes_sbox_dec[(byte)local_20[0][iVar15 + 3]];
} while (iVar18 != 4);
iVar18 = 0;
do {
iVar15 = iVar18 * 0x3c;
iVar19 = iVar18 * 4;
local_20[0][iVar19] = local_20[0][iVar17 + iVar15 + 0x10] ^ local_20[0][iVar19];
iVar18 = iVar18 + 1;
local_20[0][iVar19 + 1] = local_20[0][iVar17 + iVar15 + 0x11] ^ local_20[0][iVar19 + 1];
local_20[0][iVar19 + 2] = local_20[0][iVar14 + iVar15 + 0x10] ^ local_20[0][iVar19 + 2];
local_20[0][iVar19 + 3] = local_20[0][iVar17 + iVar15 + 0x13] ^ local_20[0][iVar19 + 3];
} while (iVar18 != 4);
iVar18 = 0;
do {
pbVar16 = (byte *)(local_20[0] + iVar18);
bVar1 = *pbVar16;
bVar2 = pbVar16[4];
bVar3 = pbVar16[8];
bVar4 = pbVar16[0xc];
bVar5 = (&aes_mul_9)[bVar1];
bVar6 = aes_mul_e[bVar2];
*pbVar16 = aes_mul_b[bVar2] ^ aes_mul_e[bVar1] ^ aes_mul_d[bVar3] ^ (&aes_mul_9)[bVar4];
bVar7 = (&aes_mul_9)[bVar2];
bVar8 = aes_mul_d[bVar1];
local_20[0][iVar18 + 4] = bVar6 ^ bVar5 ^ aes_mul_b[bVar3] ^ aes_mul_d[bVar4];
bVar2 = aes_mul_d[bVar2];
bVar1 = aes_mul_b[bVar1];
bVar5 = (&aes_mul_9)[bVar3];
local_20[0][iVar18 + 8] = bVar7 ^ bVar8 ^ aes_mul_e[bVar3] ^ aes_mul_b[bVar4];
iVar15 = iVar18 + 1;
local_20[0][iVar18 + 0xc] = bVar2 ^ bVar1 ^ bVar5 ^ aes_mul_e[bVar4];
iVar18 = iVar15;
} while (iVar15 != 4);
iVar17 = iVar17 + -4;
iVar14 = iVar14 + -4;
}
cVar9 = local_20[0][7] //possible issue identified - semgrep
local_20[0][7] = local_20[0][6];
local_20[0][6] = local_20[0][5];
iVar17 = 0;
local_20[0][5] = local_20[0][4];
local_20[0][4] = cVar9;
cVar9 = local_20[0][8] //possible issue identified - semgrep
local_20[0][8] = local_20[0][10];
local_20[0][10] = cVar9;
cVar9 = local_20[0][9] //possible issue identified - semgrep
local_20[0][9] = local_20[0][0xb];
local_20[0][0xb] = cVar9;
cVar9 = local_20[0][0xc] //possible issue identified - semgrep
local_20[0][0xc] = local_20[0][0xd];
local_20[0][0xd] = local_20[0][0xe];
local_20[0][0xe] = local_20[0][0xf];
local_20[0][0xf] = cVar9;
do {
iVar14 = iVar17 * 4;
iVar17 = iVar17 + 1;
local_20[0][iVar14] = aes_sbox_dec[(byte)local_20[0][iVar14]];
local_20[0][iVar14 + 1] = aes_sbox_dec[(byte)local_20[0][iVar14 + 1]];
local_20[0][iVar14 + 2] = aes_sbox_dec[(byte)local_20[0][iVar14 + 2]];
local_20[0][iVar14 + 3] = aes_sbox_dec[(byte)local_20[0][iVar14 + 3]];
} while (iVar17 != 4);
iVar17 = 0;
do {
iVar14 = 0;
do {
iVar18 = iVar17 * 4 + iVar14;
iVar10 = iVar14 + iVar17 * 0x3c;
iVar14 = iVar14 + 1;
local_20[0][iVar18] = local_20[0][iVar10 + 0x10] ^ local_20[0][iVar18];
} while (iVar14 != 4);
iVar17 = iVar17 + 1;
iVar14 = 0;
} while (iVar17 != 4);
do {
pcVar12 = (char *)(param_5 + iVar14);
iVar17 = 0;
do {
iVar10 = iVar14 * 4 + iVar17;
iVar17 = iVar17 + 1;
*pcVar12 = local_20[0][iVar10];
pcVar12 = pcVar12 + 4;
} while (iVar17 != 4);
iVar14 = iVar14 + 1;
} while (iVar14 != 4);
*param_6 = 0x10;
if (local_20[0] == (char *)0x0) {
return;
}
pcVar13 = (char *)0x0;
pcVar11 = os_free_mem;
pcVar12 = local_20[0];
}
(*pcVar11)(pcVar13,pcVar12);
return;
}
if (RTDebugLevel == 0) {
return;
}
pcVar12 = "RT_AES_Decrypt: cipher block size is %d bytes, it must be %d bytes(128 bits).\n";
}
printk(pcVar12,param_2,0x10);
return;
}