/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x1400cd030 FUN_1400cd030 * Pseudocode, not original source. */ /* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */ void FUN_1400cd030(void *param_1,byte *param_2,undefined8 param_3,undefined8 param_4) { byte bVar1; uint uVar2; undefined4 uVar3; int iVar4; uint uVar5; uint *puVar6; int iVar7; void *pvVar8; int iVar9; longlong lVar10; int iVar11; ulonglong uVar12; int iVar13; int iVar14; uint *puVar15; longlong lVar16; byte *pbVar17; longlong lVar18; undefined1 auStack_d8 [32]; int local_b8; exception local_a8 [68]; uint auStack_64 [9]; ulonglong local_40; local_40 = DAT_1401ac5a0 ^ (ulonglong)auStack_d8; iVar11 = (int)param_3; local_b8 = iVar11; if (((iVar11 != 0x10) && (iVar11 != 0x18)) && (iVar11 != 0x20)) { FUN_14006b700(local_a8,"Incorrect key length",param_3,param_4); /* WARNING: Subroutine does not return */ _CxxThrowException(local_a8,(ThrowInfo *)&DAT_1401a93e8); } iVar4 = (int)param_4; if (((iVar4 != 0x10) && (iVar4 != 0x18)) && (iVar4 != 0x20)) { FUN_14006b700(local_a8,"Incorrect block length",param_3,param_4); /* WARNING: Subroutine does not return */ _CxxThrowException(local_a8,(ThrowInfo *)&DAT_1401a93e8); } *(int *)((longlong)param_1 + 0x3c4) = iVar4; if (iVar11 == 0x10) { if (iVar4 == 0x10) { uVar3 = 10; } else { uVar3 = 0xe; if (iVar4 == 0x18) { uVar3 = 0xc; } } } else { if (iVar11 != 0x18) { *(undefined4 *)((longlong)param_1 + 0x3c8) = 0xe; goto LAB_1400cd13f; } uVar3 = 0xe; if (iVar4 != 0x20) { uVar3 = 0xc; } } *(undefined4 *)((longlong)param_1 + 0x3c8) = uVar3; LAB_1400cd13f: iVar9 = 0; iVar4 = (int)(iVar4 + (iVar4 >> 0x1f & 3U)) >> 2; lVar16 = (longlong)iVar4; pvVar8 = param_1; if (-1 < *(int *)((longlong)param_1 + 0x3c8)) { do { if (0 < iVar4) { memset(pvVar8,0,lVar16 << 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,lVar16 << 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)(iVar11 + (iVar11 >> 0x1f & 3U)) >> 2; lVar18 = (longlong)(int)uVar5; if (0 < (int)uVar5) { uVar12 = (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]; uVar12 = uVar12 - 1; param_2 = param_2 + 4; } while (uVar12 != 0); } iVar7 = 0; lVar10 = 0; iVar13 = iVar7; if (0 < (int)uVar5) { do { iVar13 = iVar7; if (iVar9 <= iVar7) break; uVar2 = auStack_64[lVar10 + 1]; lVar10 = lVar10 + 1; iVar13 = 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 = iVar13; } while (lVar10 < lVar18); } iVar7 = 1; if (iVar13 < iVar9) { pbVar17 = &DAT_140145cb0; do { uVar12 = (ulonglong)(int)auStack_64[lVar18]; auStack_64[1] = auStack_64[1] ^ CONCAT31(CONCAT21(CONCAT11((&DAT_140142ab0)[(longlong)uVar12 >> 0x10 & 0xff] ^ *pbVar17, (&DAT_140142ab0)[(longlong)uVar12 >> 8 & 0xff]), (&DAT_140142ab0)[uVar12 & 0xff]), (&DAT_140142ab0)[auStack_64[lVar18] >> 0x18]); if (uVar5 == 8) { lVar10 = 3; puVar6 = auStack_64 + 2; do { *puVar6 = *puVar6 ^ puVar6[-1]; lVar10 = lVar10 + -1; puVar6 = puVar6 + 1; } while (lVar10 != 0); uVar12 = (ulonglong)(int)auStack_64[4]; lVar10 = 5; auStack_64[5] = auStack_64[5] ^ CONCAT31(CONCAT21(CONCAT11((&DAT_140142ab0)[auStack_64[4] >> 0x18], (&DAT_140142ab0)[(longlong)uVar12 >> 0x10 & 0xff]), (&DAT_140142ab0)[(longlong)uVar12 >> 8 & 0xff]), (&DAT_140142ab0)[uVar12 & 0xff]); do { puVar6 = auStack_64 + lVar10; lVar10 = lVar10 + 1; auStack_64[lVar10] = auStack_64[lVar10] ^ *puVar6; } while (lVar10 < 8); } else { lVar10 = 1; if (1 < lVar18) { do { puVar6 = auStack_64 + lVar10; lVar10 = lVar10 + 1; auStack_64[lVar10] = auStack_64[lVar10] ^ *puVar6; } while (lVar10 < lVar18); } } lVar10 = 0; iVar14 = iVar13; iVar11 = local_b8; if (0 < (int)uVar5) { do { if (iVar9 <= iVar14) goto LAB_1400cd425; uVar2 = auStack_64[lVar10 + 1]; lVar10 = lVar10 + 1; iVar13 = iVar14 + 1; *(uint *)((longlong)param_1 + ((longlong)(iVar14 % iVar4) + (longlong)(iVar14 / iVar4) * 8) * 4) = uVar2; *(uint *)((longlong)param_1 + ((longlong)(iVar14 % iVar4) + 0x78 + ((longlong)*(int *)((longlong)param_1 + 0x3c8) - (longlong)(iVar14 / iVar4)) * 8) * 4) = uVar2; iVar14 = iVar13; } while (lVar10 < lVar18); } pbVar17 = pbVar17 + 1; } while (iVar13 < iVar9); } LAB_1400cd425: if (1 < *(int *)((longlong)param_1 + 0x3c8)) { puVar6 = (uint *)((longlong)param_1 + 0x200); do { puVar15 = puVar6; lVar18 = lVar16; if (0 < lVar16) { do { uVar12 = (ulonglong)(int)*puVar15; lVar18 = lVar18 + -1; *puVar15 = *(uint *)(&DAT_140144cb0 + (ulonglong)(*puVar15 >> 0x18) * 4) ^ *(uint *)(&DAT_1401450b0 + ((longlong)uVar12 >> 0x10 & 0xffU) * 4) ^ *(uint *)(&DAT_1401454b0 + ((longlong)uVar12 >> 8 & 0xffU) * 4) ^ *(uint *)(&DAT_1401458b0 + (uVar12 & 0xff) * 4); puVar15 = puVar15 + 1; } while (lVar18 != 0); } iVar7 = iVar7 + 1; puVar6 = puVar6 + 8; } while (iVar7 < *(int *)((longlong)param_1 + 0x3c8)); } *(int *)((longlong)param_1 + 0x3c0) = iVar11; return; }