static int ikev2_process_sar1(struct ikev2_initiator_data *data, const u8 *sar1, size_t sar1_len) { struct ikev2_proposal_data prop; const u8 *pos, *end; int found = 0; /* Security Association Payloads: <Proposals> */ if (sar1 == NULL) { asd_printf(ASD_DEFAULT,MSG_DEBUG, "IKEV2: SAr1 not received"); return -1; } os_memset(&prop, 0, sizeof(prop)); prop.proposal_num = 1; pos = sar1; end = sar1 + sar1_len; while (pos < end) { int plen; prop.integ = -1; prop.prf = -1; prop.encr = -1; prop.dh = -1; plen = ikev2_parse_proposal(data, &prop, pos, end); if (plen < 0) return -1; if (!found && prop.integ != -1 && prop.prf != -1 && prop.encr != -1 && prop.dh != -1) { found = 1; } pos += plen; /* Only one proposal expected in SAr */ break; } if (pos != end) { asd_printf(ASD_DEFAULT,MSG_DEBUG, "IKEV2: Unexpected data after proposal"); return -1; } if (!found) { asd_printf(ASD_DEFAULT,MSG_DEBUG, "IKEV2: No acceptable proposal found"); return -1; } asd_printf(ASD_DEFAULT,MSG_DEBUG, "IKEV2: Accepted proposal #%d: ENCR:%d PRF:%d " "INTEG:%d D-H:%d", data->proposal.proposal_num, data->proposal.encr, data->proposal.prf, data->proposal.integ, data->proposal.dh); return 0; }
static int ikev2_process_sai1(struct ikev2_responder_data *data, const u8 *sai1, size_t sai1_len) { struct ikev2_proposal_data prop; const u8 *pos, *end; int found = 0; /* Security Association Payloads: <Proposals> */ if (sai1 == NULL) { wpa_printf(MSG_INFO, "IKEV2: SAi1 not received"); return -1; } os_memset(&prop, 0, sizeof(prop)); prop.proposal_num = 1; pos = sai1; end = sai1 + sai1_len; while (pos < end) { int plen; prop.integ = -1; prop.prf = -1; prop.encr = -1; prop.dh = -1; plen = ikev2_parse_proposal(&prop, pos, end); if (plen < 0) return -1; if (!found && prop.integ != -1 && prop.prf != -1 && prop.encr != -1 && prop.dh != -1) { os_memcpy(&data->proposal, &prop, sizeof(prop)); data->dh = dh_groups_get(prop.dh); found = 1; } pos += plen; } if (pos != end) { wpa_printf(MSG_INFO, "IKEV2: Unexpected data after proposals"); return -1; } if (!found) { wpa_printf(MSG_INFO, "IKEV2: No acceptable proposal found"); return -1; } wpa_printf(MSG_DEBUG, "IKEV2: Accepted proposal #%d: ENCR:%d PRF:%d " "INTEG:%d D-H:%d", data->proposal.proposal_num, data->proposal.encr, data->proposal.prf, data->proposal.integ, data->proposal.dh); return 0; }