int authentication(char *param_1,char *param_2,char *param_3,int param_4)

{
  char cVar1;
  uint uVar2;
  int iVar3;
  size_t sVar4;
  int iVar5;
  int iVar6;
  int iVar7;
  int iVar8;
  char *pcVar9;
  char *pcVar10;
  undefined4 uVar11;
  int iVar12;
  byte bVar13;
  byte bVar14;
  int iVar15;
  undefined4 local_2d8;
  int local_2d4 [3];
  int local_2c8;
  undefined1 auStack_2c4 [16];
  char local_2b4 [20];
  int local_2a0;
  int local_29c;
  sysinfo local_294;
  undefined1 auStack_254 [88];
  int local_1fc;
  int local_1f8;
  char local_124 [16];
  uint local_114;
  uint local_110;
  
  iVar3 = sobj_new();
  FUN_004080bc();
  FUN_00407b10(local_2d4);
  iVar15 = -2;
  if (iVar3 == 0) {
    return -2;
  }
  if ((param_1 == (char *)0x0) || (param_2 == (char *)0x0)) {
LAB_00408db4:
    pcVar9 = (char *)0x0;
    goto LAB_00408db8;
  }
  if (param_4 != 0) {
    sVar4 = strlen(param_2);
    iVar15 = -3;
    if (sVar4 != 0x20) goto LAB_00408db4;
  }
  local_2d8 = 0;
  iVar15 = sobj_new();
  iVar5 = sobj_new();
  iVar6 = sobj_new();
  iVar7 = xs_fopen("/var/passwd","r")   //possible issue identified - semgrep
  if (iVar7 == 0) {
    if (iVar15 == 0) goto LAB_00408a38;
LAB_00408a14:
    iVar8 = -1;
    pcVar9 = (char *)0x0;
LAB_00408a1c:
    sobj_del(iVar15);
  }
  else {
    if (iVar15 != 0) {
      if ((iVar5 != 0) && (iVar6 != 0)) {
        while( true ) {
          sobj_xstream_eatwhite(iVar7);
          iVar8 = sobj_xstream_read(iVar7,iVar15,0,&local_2d8)   //possible issue identified - semgrep
          if (iVar8 < 1) break;
          sobj_xstream_eatwhite(iVar7);
          iVar8 = sobj_xstream_read(iVar7,iVar5,0,&local_2d8)   //possible issue identified - semgrep
          if (iVar8 < 1) break;
          sobj_xstream_eatwhite(iVar7);
          iVar8 = sobj_xstream_read(iVar7,iVar6,0,&local_2d8)   //possible issue identified - semgrep
          if (iVar8 < 1) break;
          pcVar9 = (char *)sobj_get_string(iVar15);
          iVar8 = strcmp(param_1,pcVar9);
          if (iVar8 == 0) {
            pcVar9 = (char *)sobj_strdup(iVar5);
            pcVar10 = (char *)sobj_get_string(iVar6);
            iVar8 = atoi(pcVar10);
            goto LAB_00408a1c;
          }
          sobj_free(iVar15);
          sobj_free(iVar5);
          sobj_free(iVar6);
        }
      }
      goto LAB_00408a14;
    }
LAB_00408a38:
    iVar8 = -1;
    pcVar9 = (char *)0x0;
  }
  if (iVar5 != 0) {
    sobj_del(iVar5);
  }
  if (iVar6 != 0) {
    sobj_del(iVar6);
  }
  if (iVar7 != 0) {
    xs_close(iVar7);
  }
  iVar15 = -2;
  if (-1 < iVar8) {
    sess_get_uid(iVar3);
    uVar11 = sobj_get_string(iVar3);
    iVar5 = FUN_0040819c(&local_1fc,uVar11);
    if (iVar5 == 0) {
      iVar15 = -1;
    }
    else {
      if (param_4 == 0) {
        iVar6 = strcmp(param_2,pcVar9);
      }
      else {
        local_2b4[0] = '\0';
        local_2b4[1] = '\0';
        local_2b4[2] = '\0';
        local_2b4[3] = '\0';
        local_2b4[4] = '\0';
        local_2b4[5] = '\0';
        local_2b4[6] = '\0';
        local_2b4[7] = '\0';
        local_2b4[8] = '\0';
        local_2b4[9] = '\0';
        local_2b4[10] = '\0';
        local_2b4[0xb] = '\0';
        local_2b4[0xc] = '\0';
        local_2b4[0xd] = '\0';
        local_2b4[0xe] = '\0';
        local_2b4[0xf] = '\0';
        iVar15 = 0;
        do {
          cVar1 = param_2[iVar15]   //possible issue identified - semgrep
          bVar13 = cVar1 - 0x30;
          bVar14 = bVar13;
          if (9 < bVar13) {
            bVar14 = cVar1 + 0xa9;
            if ((5 < (byte)(cVar1 + 0x9fU)) && (bVar14 = 0, (byte)(cVar1 + 0xbfU) < 6)) {
              bVar14 = cVar1 - 0x37;
            }
            bVar13 = cVar1 + 0xa9;
            if ((5 < (byte)(cVar1 + 0x9fU)) && (bVar13 = 0, (byte)(cVar1 + 0xbfU) < 6)) {
              bVar13 = cVar1 - 0x37;
            }
          }
          pcVar10 = local_2b4 + iVar15;
          iVar15 = iVar15 + 1;
          *pcVar10 = bVar13 + bVar14 * '\x10';
        } while (iVar15 != 0x10);
        MD5Init(auStack_254);
        sVar4 = strlen(pcVar9);
        MD5Update(auStack_254,pcVar9,sVar4);
        MD5Final(auStack_2c4,auStack_254);
        iVar6 = memcmp(local_2b4,auStack_2c4,0x10);
      }
      iVar15 = -3;
      if (iVar6 == 0) {
        FUN_00407b10(local_2b4 + 0x10);
        iVar6 = 0;
        iVar15 = 1;
        while (iVar7 = iVar15 + 1, iVar15 <= local_2a0) {
          iVar12 = FUN_00407ea0(&local_114,iVar15,0);
          uVar2 = local_114;
          iVar15 = iVar7;
          if ((iVar12 == 0) && (sysinfo(&local_294), (uint)local_294.uptime <= uVar2)) {
            iVar6 = iVar6 - ((int)~local_110 >> 0x1f);
          }
        }
        iVar15 = -1;
        if (iVar6 < local_29c) {
          if (local_2c8 != 0) {
            iVar15 = -4;
            if (param_3 == (char *)0x0) goto LAB_00408db8;
            if ((local_124[0] == '\0') || (iVar15 = strcmp(local_124,param_3), iVar15 != 0)) {
              iVar15 = -4;
              goto LAB_00408db8;
            }
          }
          local_1f8 = iVar8;
          sysinfo(&local_294);
          local_1fc = local_294.uptime + local_2d4[0];
          FUN_00407ea0(&local_1fc,iVar5,1);
          iVar15 = iVar8;
        }
      }
    }
  }
LAB_00408db8:
  sobj_del(iVar3);
  if (pcVar9 != (char *)0x0) {
    free(pcVar9);
  }
  return iVar15;
}