if ((vp = fr_pair_find_by_da(&request->request_pairs, NULL, attr_chap_password)) != NULL) {
uint8_t buffer[17];
fr_pair_t *challenge;
- uint8_t const *vector;
/*
- * Use Chap-Challenge pair if present,
- * Request Authenticator otherwise.
+ * Use CHAP-Challenge pair if present, otherwise create CHAP-Challenge and
+ * populate with current Request Authenticator.
+ *
+ * Request Authenticator is re-calculated by fr_packet_sign
*/
challenge = fr_pair_find_by_da(&request->request_pairs, NULL, attr_chap_challenge);
- if (challenge && (challenge->vp_length >= 7)) {
- vector = challenge->vp_octets;
- } else {
- vector = request->packet->vector;
+ if (!challenge || (challenge->vp_length < 7)) {
+ pair_update_request(challenge, attr_chap_challenge);
+ fr_pair_value_memdup(challenge, request->packet->vector, RADIUS_AUTH_VECTOR_LENGTH, false);
}
fr_chap_encode(buffer,
- fr_rand() & 0xff, vector,
- challenge ? challenge->vp_length : RADIUS_AUTH_VECTOR_LENGTH,
+ fr_rand() & 0xff, challenge->vp_octets, challenge->vp_length,
request->password->vp_strvalue,
request->password->vp_length);
fr_pair_value_memdup(vp, buffer, sizeof(buffer), false);
if ((vp = fr_pair_find_by_da(&request->request_pairs, NULL, attr_chap_password)) != NULL) {
uint8_t buffer[17];
fr_pair_t *challenge;
- uint8_t const *vector;
/*
- * Use Chap-Challenge pair if present,
- * Request Authenticator otherwise.
+ * Use CHAP-Challenge pair if present, otherwise create CHAP-Challenge and
+ * populate with current Request Authenticator.
+ *
+ * Request Authenticator is re-calculated by fr_packet_sign
*/
challenge = fr_pair_find_by_da(&request->request_pairs, NULL, attr_chap_challenge);
- if (challenge && (challenge->vp_length >= 7)) {
- vector = challenge->vp_octets;
- } else {
- vector = request->packet->vector;
+ if (!challenge || (challenge->vp_length < 7)) {
+ pair_update_request(challenge, attr_chap_challenge);
+ fr_pair_value_memdup(challenge, request->packet->vector, RADIUS_AUTH_VECTOR_LENGTH, false);
}
fr_chap_encode(buffer,
- fr_rand() & 0xff, vector,
- challenge ? challenge->vp_length : RADIUS_AUTH_VECTOR_LENGTH,
+ fr_rand() & 0xff, challenge->vp_octets, challenge->vp_length,
request->password->vp_strvalue,
request->password->vp_length);
fr_pair_value_memdup(vp, buffer, sizeof(buffer), false);