/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c * Ghidra 12.1.2 decompiler output for 0x1401af310 FUN_1401af310 * Pseudocode, not original source. */ /* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */ void FUN_1401af310(void *param_1,byte *param_2,int param_3,int param_4) { byte bVar1; uint uVar2; undefined4 uVar3; int iVar4; uint uVar5; uint *puVar6; int iVar7; void *pvVar8; int iVar9; longlong lVar10; ulonglong uVar11; int iVar12; int iVar13; uint *puVar14; longlong lVar15; byte *pbVar16; longlong lVar17; undefined1 auStack_d8 [32]; int local_b8; undefined1 local_a8 [68]; uint auStack_64 [9]; ulonglong local_40; local_40 = DAT_1403463c0 ^ (ulonglong)auStack_d8; local_b8 = param_3; if (((param_3 != 0x10) && (param_3 != 0x18)) && (param_3 != 0x20)) { FUN_14016d2a0(local_a8,"Incorrect key length"); /* WARNING: Subroutine does not return */ _CxxThrowException(local_a8,(ThrowInfo *)&DAT_1403417f8); } if (((param_4 != 0x10) && (param_4 != 0x18)) && (param_4 != 0x20)) { FUN_14016d2a0(local_a8,"Incorrect block length"); /* WARNING: Subroutine does not return */ _CxxThrowException(local_a8,(ThrowInfo *)&DAT_1403417f8); } *(int *)((longlong)param_1 + 0x3c4) = param_4; if (param_3 == 0x10) { if (param_4 == 0x10) { uVar3 = 10; } else { uVar3 = 0xe; if (param_4 == 0x18) { uVar3 = 0xc; } } } else { if (param_3 != 0x18) { *(undefined4 *)((longlong)param_1 + 0x3c8) = 0xe; goto LAB_1401af41f; } uVar3 = 0xe; if (param_4 != 0x20) { uVar3 = 0xc; } } *(undefined4 *)((longlong)param_1 + 0x3c8) = uVar3; LAB_1401af41f: iVar9 = 0; iVar4 = (int)(param_4 + (param_4 >> 0x1f & 3U)) >> 2; lVar15 = (longlong)iVar4; pvVar8 = param_1; if (-1 < *(int *)((longlong)param_1 + 0x3c8)) { do { if (0 < iVar4) { memset(pvVar8,0,lVar15 << 2); } iVar9 = iVar9 + 1; pvVar8 = (void *)((longlong)pvVar8 + 0x20); } while (iVar9 <= *(int *)((longlong)param_1 + 0x3c8)); } iVar9 = 0; if (-1 < *(int *)((longlong)param_1 + 0x3c8)) { pvVar8 = (void *)((longlong)param_1 + 0x1e0); do { if (0 < iVar4) { memset(pvVar8,0,lVar15 << 2); } iVar9 = iVar9 + 1; pvVar8 = (void *)((longlong)pvVar8 + 0x20); } while (iVar9 <= *(int *)((longlong)param_1 + 0x3c8)); } puVar6 = auStack_64; iVar9 = (*(int *)((longlong)param_1 + 0x3c8) + 1) * iVar4; uVar5 = (int)(param_3 + (param_3 >> 0x1f & 3U)) >> 2; lVar17 = (longlong)(int)uVar5; if (0 < (int)uVar5) { uVar11 = (ulonglong)uVar5; do { puVar6 = puVar6 + 1; bVar1 = param_2[2]; *puVar6 = (uint)*param_2 << 0x18; *puVar6 = *puVar6 | (uint)param_2[1] << 0x10; *puVar6 = *puVar6 | (uint)bVar1 << 8; *puVar6 = *puVar6 | (uint)param_2[3]; uVar11 = uVar11 - 1; param_2 = param_2 + 4; } while (uVar11 != 0); } iVar7 = 0; lVar10 = 0; iVar12 = iVar7; if (0 < (int)uVar5) { do { iVar12 = iVar7; if (iVar9 <= iVar7) break; uVar2 = auStack_64[lVar10 + 1]; lVar10 = lVar10 + 1; iVar12 = iVar7 + 1; *(uint *)((longlong)param_1 + ((longlong)(iVar7 % iVar4) + (longlong)(iVar7 / iVar4) * 8) * 4) = uVar2; *(uint *)((longlong)param_1 + ((longlong)(iVar7 % iVar4) + 0x78 + ((longlong)*(int *)((longlong)param_1 + 0x3c8) - (longlong)(iVar7 / iVar4)) * 8) * 4) = uVar2; iVar7 = iVar12; } while (lVar10 < lVar17); } iVar7 = 1; if (iVar12 < iVar9) { pbVar16 = &DAT_1402874b0; do { uVar11 = (ulonglong)(int)auStack_64[lVar17]; auStack_64[1] = auStack_64[1] ^ CONCAT31(CONCAT21(CONCAT11((&DAT_1402842b0)[(longlong)uVar11 >> 0x10 & 0xff] ^ *pbVar16, (&DAT_1402842b0)[(longlong)uVar11 >> 8 & 0xff]), (&DAT_1402842b0)[uVar11 & 0xff]), (&DAT_1402842b0)[auStack_64[lVar17] >> 0x18]); if (uVar5 == 8) { lVar10 = 3; puVar6 = auStack_64 + 2; do { *puVar6 = *puVar6 ^ puVar6[-1]; lVar10 = lVar10 + -1; puVar6 = puVar6 + 1; } while (lVar10 != 0); uVar11 = (ulonglong)(int)auStack_64[4]; lVar10 = 5; auStack_64[5] = auStack_64[5] ^ CONCAT31(CONCAT21(CONCAT11((&DAT_1402842b0)[auStack_64[4] >> 0x18], (&DAT_1402842b0)[(longlong)uVar11 >> 0x10 & 0xff]), (&DAT_1402842b0)[(longlong)uVar11 >> 8 & 0xff]), (&DAT_1402842b0)[uVar11 & 0xff]); do { puVar6 = auStack_64 + lVar10; lVar10 = lVar10 + 1; auStack_64[lVar10] = auStack_64[lVar10] ^ *puVar6; } while (lVar10 < 8); } else { lVar10 = 1; if (1 < lVar17) { do { puVar6 = auStack_64 + lVar10; lVar10 = lVar10 + 1; auStack_64[lVar10] = auStack_64[lVar10] ^ *puVar6; } while (lVar10 < lVar17); } } lVar10 = 0; iVar13 = iVar12; param_3 = local_b8; if (0 < (int)uVar5) { do { if (iVar9 <= iVar13) goto LAB_1401af705; uVar2 = auStack_64[lVar10 + 1]; lVar10 = lVar10 + 1; iVar12 = iVar13 + 1; *(uint *)((longlong)param_1 + ((longlong)(iVar13 % iVar4) + (longlong)(iVar13 / iVar4) * 8) * 4) = uVar2; *(uint *)((longlong)param_1 + ((longlong)(iVar13 % iVar4) + 0x78 + ((longlong)*(int *)((longlong)param_1 + 0x3c8) - (longlong)(iVar13 / iVar4)) * 8) * 4) = uVar2; iVar13 = iVar12; } while (lVar10 < lVar17); } pbVar16 = pbVar16 + 1; } while (iVar12 < iVar9); } LAB_1401af705: if (1 < *(int *)((longlong)param_1 + 0x3c8)) { puVar6 = (uint *)((longlong)param_1 + 0x200); do { puVar14 = puVar6; lVar17 = lVar15; if (0 < lVar15) { do { uVar11 = (ulonglong)(int)*puVar14; lVar17 = lVar17 + -1; *puVar14 = *(uint *)(&DAT_1402864b0 + (ulonglong)(*puVar14 >> 0x18) * 4) ^ *(uint *)(&DAT_1402868b0 + ((longlong)uVar11 >> 0x10 & 0xffU) * 4) ^ *(uint *)(&DAT_140286cb0 + ((longlong)uVar11 >> 8 & 0xffU) * 4) ^ *(uint *)(&DAT_1402870b0 + (uVar11 & 0xff) * 4); puVar14 = puVar14 + 1; } while (lVar17 != 0); } iVar7 = iVar7 + 1; puVar6 = puVar6 + 8; } while (iVar7 < *(int *)((longlong)param_1 + 0x3c8)); } *(int *)((longlong)param_1 + 0x3c0) = param_3; return; }