/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c * Ghidra 12.1.2 decompiler output for 0x1401afc80 FUN_1401afc80 * Pseudocode, not original source. */ void FUN_1401afc80(byte *param_1,byte *param_2,longlong param_3) { undefined4 uVar1; uint *puVar2; undefined4 *puVar3; uint uVar4; uint uVar5; uint uVar6; ulonglong uVar7; ulonglong uVar8; ulonglong uVar9; ulonglong uVar10; uint uVar11; int iVar12; ulonglong uVar13; undefined1 local_78 [80]; if (*(int *)(param_3 + 0x3c0) < 1) { FUN_14016d300(local_78,L"aes key is not initialized"); /* WARNING: Subroutine does not return */ _CxxThrowException(local_78,(ThrowInfo *)&DAT_1403417f8); } iVar12 = *(int *)(param_3 + 0x3c8); uVar6 = ((uint)*param_1 << 0x18 | (uint)param_1[1] << 0x10 | (uint)param_1[2] << 8 | (uint)param_1[3]) ^ *(uint *)(param_3 + 0x1e0); uVar5 = ((uint)param_1[4] << 0x18 | (uint)param_1[5] << 0x10 | (uint)param_1[6] << 8 | (uint)param_1[7]) ^ *(uint *)(param_3 + 0x1e4); uVar4 = ((uint)param_1[8] << 0x18 | (uint)param_1[9] << 0x10 | (uint)param_1[10] << 8 | (uint)param_1[0xb]) ^ *(uint *)(param_3 + 0x1e8); uVar11 = ((uint)CONCAT11(param_1[0xe],param_1[0xf]) | (uint)param_1[0xc] << 0x18 | (uint)param_1[0xd] << 0x10) ^ *(uint *)(param_3 + 0x1ec); if (1 < iVar12) { uVar13 = (ulonglong)(iVar12 - 1); puVar2 = (uint *)(param_3 + 0x208); do { uVar10 = (ulonglong)(int)uVar5; uVar9 = (ulonglong)(int)uVar11; uVar8 = (ulonglong)(int)uVar4; uVar7 = (ulonglong)(int)uVar6; uVar5 = *(uint *)(&DAT_1402858b0 + ((longlong)uVar7 >> 0x10 & 0xffU) * 4) ^ *(uint *)(&DAT_1402854b0 + ((longlong)uVar10 >> 0x18 & 0xffU) * 4) ^ *(uint *)(&DAT_140285cb0 + ((longlong)uVar9 >> 8 & 0xffU) * 4) ^ *(uint *)(&DAT_1402860b0 + (uVar8 & 0xff) * 4) ^ puVar2[-1]; uVar4 = *(uint *)(&DAT_1402854b0 + ((longlong)uVar8 >> 0x18 & 0xffU) * 4) ^ *(uint *)(&DAT_140285cb0 + ((longlong)uVar7 >> 8 & 0xffU) * 4) ^ *(uint *)(&DAT_1402858b0 + ((longlong)uVar10 >> 0x10 & 0xffU) * 4) ^ *(uint *)(&DAT_1402860b0 + (uVar9 & 0xff) * 4) ^ *puVar2; uVar11 = *(uint *)(&DAT_1402858b0 + ((longlong)uVar8 >> 0x10 & 0xffU) * 4) ^ *(uint *)(&DAT_140285cb0 + ((longlong)uVar10 >> 8 & 0xffU) * 4) ^ *(uint *)(&DAT_1402854b0 + ((longlong)uVar9 >> 0x18 & 0xffU) * 4) ^ *(uint *)(&DAT_1402860b0 + (uVar7 & 0xff) * 4) ^ puVar2[1]; uVar6 = *(uint *)(&DAT_1402854b0 + (ulonglong)(uVar6 >> 0x18) * 4) ^ *(uint *)(&DAT_140285cb0 + ((longlong)uVar8 >> 8 & 0xffU) * 4) ^ *(uint *)(&DAT_1402858b0 + ((longlong)uVar9 >> 0x10 & 0xffU) * 4) ^ *(uint *)(&DAT_1402860b0 + (uVar10 & 0xff) * 4) ^ puVar2[-2]; uVar13 = uVar13 - 1; puVar2 = puVar2 + 8; } while (uVar13 != 0); iVar12 = *(int *)(param_3 + 0x3c8); } uVar13 = (ulonglong)(int)uVar6; uVar8 = (ulonglong)(int)uVar4; uVar9 = (ulonglong)(int)uVar11; uVar7 = (ulonglong)(int)uVar5; puVar3 = (undefined4 *)(((longlong)iVar12 + 0xf) * 0x20 + param_3); uVar1 = *puVar3; *param_2 = (&DAT_1402843b0)[(longlong)uVar13 >> 0x18 & 0xff] ^ (byte)((uint)uVar1 >> 0x18); param_2[1] = (&DAT_1402843b0)[(longlong)uVar9 >> 0x10 & 0xff] ^ (byte)((uint)uVar1 >> 0x10); param_2[2] = (&DAT_1402843b0)[(longlong)uVar8 >> 8 & 0xff] ^ (byte)((uint)uVar1 >> 8); param_2[3] = (&DAT_1402843b0)[uVar7 & 0xff] ^ (byte)uVar1; uVar1 = puVar3[1]; param_2[4] = (&DAT_1402843b0)[(longlong)uVar7 >> 0x18 & 0xff] ^ (byte)((uint)uVar1 >> 0x18); param_2[5] = (&DAT_1402843b0)[(longlong)uVar13 >> 0x10 & 0xff] ^ (byte)((uint)uVar1 >> 0x10); param_2[6] = (&DAT_1402843b0)[(longlong)uVar9 >> 8 & 0xff] ^ (byte)((uint)uVar1 >> 8); param_2[7] = (&DAT_1402843b0)[uVar8 & 0xff] ^ (byte)uVar1; uVar1 = puVar3[2]; param_2[8] = (&DAT_1402843b0)[(longlong)uVar8 >> 0x18 & 0xff] ^ (byte)((uint)uVar1 >> 0x18); param_2[9] = (&DAT_1402843b0)[(longlong)uVar7 >> 0x10 & 0xff] ^ (byte)((uint)uVar1 >> 0x10); param_2[10] = (&DAT_1402843b0)[(longlong)uVar13 >> 8 & 0xff] ^ (byte)((uint)uVar1 >> 8); param_2[0xb] = (&DAT_1402843b0)[uVar9 & 0xff] ^ (byte)uVar1; uVar1 = puVar3[3]; param_2[0xc] = (&DAT_1402843b0)[(longlong)uVar9 >> 0x18 & 0xff] ^ (byte)((uint)uVar1 >> 0x18); param_2[0xd] = (&DAT_1402843b0)[(longlong)uVar8 >> 0x10 & 0xff] ^ (byte)((uint)uVar1 >> 0x10); param_2[0xe] = (&DAT_1402843b0)[(longlong)uVar7 >> 8 & 0xff] ^ (byte)((uint)uVar1 >> 8); param_2[0xf] = (&DAT_1402843b0)[uVar13 & 0xff] ^ (byte)uVar1; return; }