undefined4 FUN_0040448c(int *param_1,undefined4 param_2,undefined4 param_3,int param_4)

{
  int iVar1;
  int iVar2;
  
  iVar2 = *(int *)(param_4 + 0xcc);
  if (iVar2 == 2) {
    if ((*(uint *)(param_4 + 200) & 1) != 0) {
LAB_0040470c:
      dprintf(6,"process_auth","server did not include authentication information");
      goto LAB_00404504;
    }
    if (*(int *)(param_4 + 0xd0) != 1) {
LAB_00404734:
      dprintf(6,"process_auth","unknown authentication algorithm (%d)");
      goto LAB_00404504;
    }
    if (*(int *)(param_4 + 0xd4) != 0) {
      dprintf(6,"process_auth","unknown RDM (%d)");
      goto LAB_00404504;
    }
    if ((param_1[4] & 1U) == 0) {
      iVar2 = dhcp6_auth_replaycheck
                        (0,0x420000,param_1[6],param_1[7],*(undefined4 *)(param_4 + 0xd8),
                         *(undefined4 *)(param_4 + 0xdc));
      if (iVar2 != 0) goto LAB_0040480c;
    }
    else {
      dprintf(4,"process_auth","previous RD value is unknown (accept it)");
    }
    iVar2 = param_1[3];
    if (iVar2 == 0) {
      iVar2 = find_key(*(undefined4 *)(param_4 + 0xe8),*(undefined4 *)(param_4 + 0xe4),
                       *(undefined4 *)(param_4 + 0xe0));
      if (iVar2 == 0) {
        dprintf(6,"process_auth","failed to find key provided by the server (ID: %x)",
                *(undefined4 *)(param_4 + 0xe0));
        goto LAB_00404504;
      }
      dprintf(7,"process_auth","found key for authentication: %s",*(undefined4 *)(iVar2 + 4));
      param_1[3] = iVar2;
    }
    else if (((*(int *)(param_4 + 0xe0) != *(int *)(iVar2 + 0x10)) ||
             (*(size_t *)(param_4 + 0xe4) != *(size_t *)(iVar2 + 0xc))) ||
            (iVar1 = memcmp(*(void **)(param_4 + 0xe8),*(void **)(iVar2 + 8),
                            *(size_t *)(param_4 + 0xe4)), iVar1 != 0)) {
      dprintf(6,"process_auth","authentication key mismatch");
      goto LAB_00404504;
    }
    iVar1 = dhcp6_validate_key(iVar2);
    if (iVar1 != 0) {
      dprintf(6,"process_auth","key %s has expired",*(undefined4 *)(iVar2 + 4));
      goto LAB_00404504;
    }
    iVar2 = dhcp6_verify_mac(param_2,param_3,*(undefined4 *)(param_4 + 0xcc),
                             *(undefined4 *)(param_4 + 0xd0),*(int *)(param_4 + 0xec) + 4,iVar2);
  }
  else {
    if (iVar2 != 3) {
      if (iVar2 != -1) {
        dprintf(6,"process_auth","server sent unsupported authentication protocol (%d)");
      }
      goto LAB_00404504;
    }
    if ((*(uint *)(param_4 + 200) & 1) != 0) goto LAB_0040470c;
    if (*(int *)(param_4 + 0xd0) != 1) goto LAB_00404734;
    if (*(int *)(param_4 + 0xd4) != 0) {
      dprintf(6,"process_auth","unknown RDM (%d)",*(int *)(param_4 + 0xd4));
      goto LAB_00404504;
    }
    if (*(int *)(param_4 + 0xe0) == 1) {
      g_prevrd = *(int *)(param_4 + 0xd8);
      DAT_0043ea04 = *(int *)(param_4 + 0xdc);
      return 0;
    }
    iVar2 = dhcp6_auth_replaycheck
                      (0,0x420000,param_1[6],param_1[7],*(undefined4 *)(param_4 + 0xd8),
                       *(undefined4 *)(param_4 + 0xdc));
    if (iVar2 != 0) {
LAB_0040480c:
      dprintf(6,"process_auth","possible replay attack detected");
      goto LAB_00404504;
    }
    iVar2 = dhcp6_verify_mac(param_2,param_3,*(undefined4 *)(param_4 + 0xcc),
                             *(undefined4 *)(param_4 + 0xd0),*(int *)(param_4 + 0xe4) + 4,param_1[3]
                            );
  }
  if (iVar2 == 0) {
    dprintf(7,"process_auth","message authentication validated");
    g_prevrd = *(int *)(param_4 + 0xd8);
    DAT_0043ea04 = *(int *)(param_4 + 0xdc);
    param_1[4] = param_1[4] & 0xfffffffe;
    param_1[6] = g_prevrd;
    param_1[7] = DAT_0043ea04;
    return 0;
  }
  dprintf(6,"process_auth","invalid message authentication");
LAB_00404504:
  if (*param_1 != -1) {
    dprintf(6,"process_auth","message not authenticated while authentication required");
    return 0xffffffff;
  }
  return 0;
}