undefined4
AES_CCM_Decrypt(int param_1,uint param_2,undefined4 param_3,int param_4,int param_5,uint param_6,
undefined4 param_7,undefined4 param_8,size_t param_9,int param_10,uint *param_11)
{
byte bVar1;
bool bVar2;
undefined4 uVar3;
uint uVar4;
byte *pbVar5;
int iVar6;
byte *pbVar7;
byte *pbVar8;
uint uVar9;
uint uVar10;
undefined4 local_70;
undefined1 auStack_6c [16];
byte local_5c [16];
byte local_4c [15];
char local_3d;
byte local_3c [20];
local_70 = 0;
if (param_4 == 0x10) {
if (param_6 - 7 < 7) {
if (((((param_9 == 4) || (param_9 == 6)) || (param_9 == 8)) ||
((param_9 == 10 || (param_9 == 0xc)))) || ((param_9 == 0xe || (param_9 == 0x10)))) {
uVar10 = param_2 - param_9;
if (*param_11 < uVar10) {
uVar3 = 0xfffffffc;
if (RTDebugLevel != 0) {
printk("AES_CCM_Decrypt: The PlainTextLength is not enough.\n");
uVar3 = 0xfffffffc;
}
}
else {
memset(local_4c,0,0x10) //possible issue identified - semgrep
local_4c[0] = 0xeU - (char)param_6 | local_4c[0];
uVar4 = 0;
while( true ) {
bVar2 = param_6 <= uVar4;
uVar4 = uVar4 + 1;
if (bVar2) break;
local_4c[uVar4] = *(byte *)(param_5 + uVar4 + -1);
}
local_70 = 0x10;
RT_AES_Encrypt(local_4c,0x10,param_3,0x10,local_3c,&local_70);
pbVar7 = (byte *)(param_1 + uVar10);
iVar6 = 0;
uVar4 = uVar10;
while( true ) {
bVar2 = param_2 <= uVar4;
pbVar5 = local_3c + iVar6;
pbVar8 = local_5c + iVar6;
uVar4 = uVar4 + 1;
iVar6 = iVar6 + 1;
if (bVar2) break;
bVar1 = *pbVar7;
pbVar7 = pbVar7 + 1;
*pbVar8 = *pbVar5 ^ bVar1;
}
for (uVar4 = 0; uVar4 < uVar10; uVar4 = uVar4 + uVar9) {
local_3d = local_3d + '\x01';
local_70 = 0x10;
RT_AES_Encrypt(local_4c,0x10,param_3,0x10,local_3c,&local_70);
uVar9 = 0x10;
if (uVar10 - uVar4 < 0x11) {
uVar9 = uVar10 - uVar4;
}
pbVar8 = (byte *)(param_1 + uVar4);
pbVar5 = (byte *)(param_10 + uVar4);
for (pbVar7 = local_3c; pbVar7 != local_3c + uVar9; pbVar7 = pbVar7 + 1) {
bVar1 = *pbVar8;
pbVar8 = pbVar8 + 1;
*pbVar5 = *pbVar7 ^ bVar1;
pbVar5 = pbVar5 + 1;
}
}
*param_11 = uVar10;
AES_CCM_MAC(param_10,uVar10,param_3,0x10,param_5,param_6,param_7,param_8,param_9,
auStack_6c);
iVar6 = memcmp(local_5c,auStack_6c,param_9) //possible issue identified - semgrep
uVar3 = 0;
if ((iVar6 != 0) && (uVar3 = 0xfffffffb, RTDebugLevel != 0)) {
printk("AES_CCM_Decrypt: The MIC does not match.\n");
uVar3 = 0xfffffffb;
}
}
}
else {
uVar3 = 0xfffffffd;
if (RTDebugLevel != 0) {
printk("AES_CCM_Decrypt: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes\n");
uVar3 = 0xfffffffd;
}
}
}
else {
uVar3 = 0xfffffffe;
if (RTDebugLevel != 0) {
printk("AES_CCM_Decrypt: A valid nonce length is 7-13 bytes\n");
uVar3 = 0xfffffffe;
}
}
}
else {
uVar3 = 0xffffffff;
if (RTDebugLevel != 0) {
printk("AES_CCM_Decrypt: The key length must be %d bytes\n",0x10);
uVar3 = 0xffffffff;
}
}
return uVar3;
}