1 ===================================================================
2 RCS file: /cvsroot/ppp/pppd/chap-new.c,v
3 retrieving revision 1.6
4 retrieving revision 1.7
6 --- ppp/pppd/chap-new.c 2004/11/04 10:02:26 1.6
7 +++ ppp/pppd/chap-new.c 2005/07/10 07:31:26 1.7
9 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 unsigned char challenge[CHAL_MAX_PKTLEN];
24 /* Values for flags in chap_client_state and chap_server_state */
26 int (*verifier)(char *, char *, int, struct chap_digest_type *,
27 unsigned char *, unsigned char *, char *, int);
28 char rname[MAXNAMELEN+1];
31 if ((ss->flags & LOWERUP) == 0)
33 if (id != ss->challenge[PPP_HDRLEN+1] || len < 2)
35 - if ((ss->flags & AUTH_DONE) == 0) {
36 - if ((ss->flags & CHALLENGE_VALID) == 0)
38 + if (ss->flags & CHALLENGE_VALID) {
40 GETCHAR(response_len, pkt);
41 len -= response_len + 1; /* length of name */
46 - ss->flags &= ~CHALLENGE_VALID;
47 if (ss->flags & TIMEOUT_PENDING) {
48 ss->flags &= ~TIMEOUT_PENDING;
49 UNTIMEOUT(chap_timeout, ss);
51 verifier = chap_verify_response;
52 ok = (*verifier)(name, ss->name, id, ss->digest,
53 ss->challenge + PPP_HDRLEN + CHAP_HDRLEN,
54 - response, message, sizeof(message));
55 + response, ss->message, sizeof(ss->message));
56 if (!ok || !auth_number()) {
57 ss->flags |= AUTH_FAILED;
58 warn("Peer %q failed CHAP authentication", name);
61 + } else if ((ss->flags & AUTH_DONE) == 0)
64 /* send the response */
66 MAKEHEADER(p, PPP_CHAP);
67 - mlen = strlen(message);
68 + mlen = strlen(ss->message);
69 len = CHAP_HDRLEN + mlen;
70 p[0] = (ss->flags & AUTH_FAILED)? CHAP_FAILURE: CHAP_SUCCESS;
75 - memcpy(p + CHAP_HDRLEN, message, mlen);
76 + memcpy(p + CHAP_HDRLEN, ss->message, mlen);
77 output(0, outpacket_buf, PPP_HDRLEN + len);
79 - if ((ss->flags & AUTH_DONE) == 0) {
80 - ss->flags |= AUTH_DONE;
81 + if (ss->flags & CHALLENGE_VALID) {
82 + ss->flags &= ~CHALLENGE_VALID;
83 if (ss->flags & AUTH_FAILED) {
84 auth_peer_fail(0, PPP_CHAP);
86 - auth_peer_success(0, PPP_CHAP, ss->digest->code,
87 - name, strlen(name));
88 + if ((ss->flags & AUTH_DONE) == 0)
89 + auth_peer_success(0, PPP_CHAP,
91 + name, strlen(name));
92 if (chap_rechallenge_time) {
93 ss->flags |= TIMEOUT_PENDING;
94 TIMEOUT(chap_timeout, ss,
95 chap_rechallenge_time);
98 + ss->flags |= AUTH_DONE;