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;
}