Lines Matching refs:pcb
67 { "chap-max-challenge", o_int, &pcb->settings.chap_max_transmits,
69 { "chap-interval", o_int, &pcb->settings.chap_rechallenge_time,
87 static void chap_init(ppp_pcb *pcb);
88 static void chap_lowerup(ppp_pcb *pcb);
89 static void chap_lowerdown(ppp_pcb *pcb);
92 static void chap_generate_challenge(ppp_pcb *pcb);
93 static void chap_handle_response(ppp_pcb *pcb, int code,
95 static int chap_verify_response(ppp_pcb *pcb, const char *name, const char *ourname, int id,
100 static void chap_respond(ppp_pcb *pcb, int id,
102 static void chap_handle_status(ppp_pcb *pcb, int code, int id,
104 static void chap_protrej(ppp_pcb *pcb);
105 static void chap_input(ppp_pcb *pcb, unsigned char *pkt, int pktlen);
124 static void chap_init(ppp_pcb *pcb) { in chap_init() argument
125 LWIP_UNUSED_ARG(pcb); in chap_init()
128 memset(&pcb->chap_client, 0, sizeof(chap_client_state)); in chap_init()
130 memset(&pcb->chap_server, 0, sizeof(chap_server_state)); in chap_init()
138 static void chap_lowerup(ppp_pcb *pcb) { in chap_lowerup() argument
140 pcb->chap_client.flags |= LOWERUP; in chap_lowerup()
142 pcb->chap_server.flags |= LOWERUP; in chap_lowerup()
143 if (pcb->chap_server.flags & AUTH_STARTED) in chap_lowerup()
144 chap_timeout(pcb); in chap_lowerup()
148 static void chap_lowerdown(ppp_pcb *pcb) { in chap_lowerdown() argument
150 pcb->chap_client.flags = 0; in chap_lowerdown()
152 if (pcb->chap_server.flags & TIMEOUT_PENDING) in chap_lowerdown()
153 UNTIMEOUT(chap_timeout, pcb); in chap_lowerdown()
154 pcb->chap_server.flags = 0; in chap_lowerdown()
164 void chap_auth_peer(ppp_pcb *pcb, const char *our_name, int digest_code) { in chap_auth_peer() argument
168 if (pcb->chap_server.flags & AUTH_STARTED) { in chap_auth_peer()
179 pcb->chap_server.digest = dp; in chap_auth_peer()
180 pcb->chap_server.name = our_name; in chap_auth_peer()
182 pcb->chap_server.id = magic(); in chap_auth_peer()
183 pcb->chap_server.flags |= AUTH_STARTED; in chap_auth_peer()
184 if (pcb->chap_server.flags & LOWERUP) in chap_auth_peer()
185 chap_timeout(pcb); in chap_auth_peer()
193 void chap_auth_with_peer(ppp_pcb *pcb, const char *our_name, int digest_code) { in chap_auth_with_peer() argument
200 if (pcb->chap_client.flags & AUTH_STARTED) { in chap_auth_with_peer()
212 pcb->chap_client.digest = dp; in chap_auth_with_peer()
213 pcb->chap_client.name = our_name; in chap_auth_with_peer()
214 pcb->chap_client.flags |= AUTH_STARTED; in chap_auth_with_peer()
224 ppp_pcb *pcb = (ppp_pcb*)arg; in chap_timeout() local
227 pcb->chap_server.flags &= ~TIMEOUT_PENDING; in chap_timeout()
228 if ((pcb->chap_server.flags & CHALLENGE_VALID) == 0) { in chap_timeout()
229 pcb->chap_server.challenge_xmits = 0; in chap_timeout()
230 chap_generate_challenge(pcb); in chap_timeout()
231 pcb->chap_server.flags |= CHALLENGE_VALID; in chap_timeout()
232 } else if (pcb->chap_server.challenge_xmits >= pcb->settings.chap_max_transmits) { in chap_timeout()
233 pcb->chap_server.flags &= ~CHALLENGE_VALID; in chap_timeout()
234 pcb->chap_server.flags |= AUTH_DONE | AUTH_FAILED; in chap_timeout()
235 auth_peer_fail(pcb, PPP_CHAP); in chap_timeout()
239 p = pbuf_alloc(PBUF_RAW, (u16_t)(pcb->chap_server.challenge_pktlen), PPP_CTRL_PBUF_TYPE); in chap_timeout()
246 MEMCPY(p->payload, pcb->chap_server.challenge, pcb->chap_server.challenge_pktlen); in chap_timeout()
247 ppp_write(pcb, p); in chap_timeout()
248 ++pcb->chap_server.challenge_xmits; in chap_timeout()
249 pcb->chap_server.flags |= TIMEOUT_PENDING; in chap_timeout()
250 TIMEOUT(chap_timeout, arg, pcb->settings.chap_timeout_time); in chap_timeout()
257 static void chap_generate_challenge(ppp_pcb *pcb) { in chap_generate_challenge() argument
261 p = pcb->chap_server.challenge; in chap_generate_challenge()
264 pcb->chap_server.digest->generate_challenge(pcb, p); in chap_generate_challenge()
266 nlen = strlen(pcb->chap_server.name); in chap_generate_challenge()
267 memcpy(p + 1 + clen, pcb->chap_server.name, nlen); in chap_generate_challenge()
270 pcb->chap_server.challenge_pktlen = PPP_HDRLEN + len; in chap_generate_challenge()
272 p = pcb->chap_server.challenge + PPP_HDRLEN; in chap_generate_challenge()
274 p[1] = ++pcb->chap_server.id; in chap_generate_challenge()
282 static void chap_handle_response(ppp_pcb *pcb, int id, argument
296 if ((pcb->chap_server.flags & LOWERUP) == 0)
298 if (id != pcb->chap_server.challenge[PPP_HDRLEN+1] || len < 2)
300 if (pcb->chap_server.flags & CHALLENGE_VALID) {
308 if (pcb->chap_server.flags & TIMEOUT_PENDING) {
309 pcb->chap_server.flags &= ~TIMEOUT_PENDING;
310 UNTIMEOUT(chap_timeout, pcb);
313 if (pcb->settings.explicit_remote) {
314 name = pcb->remote_name;
328 ok = (*verifier)(name, pcb->chap_server.name, id, pcb->chap_server.digest,
329 pcb->chap_server.challenge + PPP_HDRLEN + CHAP_HDRLEN,
330 response, pcb->chap_server.message, sizeof(pcb->chap_server.message));
332 ok = chap_verify_response(pcb, name, pcb->chap_server.name, id, pcb->chap_server.digest,
333 pcb->chap_server.challenge + PPP_HDRLEN + CHAP_HDRLEN,
339 pcb->chap_server.flags |= AUTH_FAILED;
342 } else if ((pcb->chap_server.flags & AUTH_DONE) == 0)
359 outp[0] = (pcb->chap_server.flags & AUTH_FAILED)? CHAP_FAILURE: CHAP_SUCCESS;
365 ppp_write(pcb, p);
367 if (pcb->chap_server.flags & CHALLENGE_VALID) {
368 pcb->chap_server.flags &= ~CHALLENGE_VALID;
369 if (!(pcb->chap_server.flags & AUTH_DONE) && !(pcb->chap_server.flags & AUTH_FAILED)) {
383 pcb->chap_server.flags |= AUTH_FAILED;
389 if (pcb->chap_server.flags & AUTH_FAILED) {
390 auth_peer_fail(pcb, PPP_CHAP);
392 if ((pcb->chap_server.flags & AUTH_DONE) == 0)
393 auth_peer_success(pcb, PPP_CHAP,
394 pcb->chap_server.digest->code,
396 if (pcb->settings.chap_rechallenge_time) {
397 pcb->chap_server.flags |= TIMEOUT_PENDING;
398 TIMEOUT(chap_timeout, pcb,
399 pcb->settings.chap_rechallenge_time);
402 pcb->chap_server.flags |= AUTH_DONE;
411 static int chap_verify_response(ppp_pcb *pcb, const char *name, const char *ourname, int id, argument
420 if (!get_secret(pcb, name, ourname, (char *)secret, &secret_len, 1)) {
424 ok = digest->verify_response(pcb, id, name, secret, secret_len, challenge,
435 static void chap_respond(ppp_pcb *pcb, int id, argument
452 if ((pcb->chap_client.flags & (LOWERUP | AUTH_STARTED)) != (LOWERUP | AUTH_STARTED))
464 if (pcb->settings.explicit_remote || (pcb->settings.remote_name[0] != 0 && rname[0] == 0))
465 strlcpy(rname, pcb->settings.remote_name, sizeof(rname));
469 if (!get_secret(pcb, pcb->chap_client.name, rname, secret, &secret_len, 0)) {
478 pcb->chap_client.digest->make_response(pcb, outp, id, pcb->chap_client.name, pkt,
479 secret, secret_len, pcb->chap_client.priv);
483 nlen = strlen(pcb->chap_client.name);
484 memcpy(outp + clen + 1, pcb->chap_client.name, nlen);
494 ppp_write(pcb, p);
497 static void chap_handle_status(ppp_pcb *pcb, int code, int id, argument
502 if ((pcb->chap_client.flags & (AUTH_DONE|AUTH_STARTED|LOWERUP))
505 pcb->chap_client.flags |= AUTH_DONE;
509 if (pcb->chap_client.digest->check_success != NULL) {
510 if (!(*pcb->chap_client.digest->check_success)(pcb, pkt, len, pcb->chap_client.priv))
515 if (pcb->chap_client.digest->handle_failure != NULL)
516 (*pcb->chap_client.digest->handle_failure)(pcb, pkt, len);
527 auth_withpeer_success(pcb, PPP_CHAP, pcb->chap_client.digest->code);
529 pcb->chap_client.flags |= AUTH_FAILED;
531 auth_withpeer_fail(pcb, PPP_CHAP);
535 static void chap_input(ppp_pcb *pcb, unsigned char *pkt, int pktlen) { argument
550 chap_respond(pcb, id, pkt, len);
554 chap_handle_response(pcb, id, pkt, len);
559 chap_handle_status(pcb, code, id, pkt, len);
566 static void chap_protrej(ppp_pcb *pcb) { argument
569 if (pcb->chap_server.flags & TIMEOUT_PENDING) {
570 pcb->chap_server.flags &= ~TIMEOUT_PENDING;
571 UNTIMEOUT(chap_timeout, pcb);
573 if (pcb->chap_server.flags & AUTH_STARTED) {
574 pcb->chap_server.flags = 0;
575 auth_peer_fail(pcb, PPP_CHAP);
578 if ((pcb->chap_client.flags & (AUTH_STARTED|AUTH_DONE)) == AUTH_STARTED) {
579 pcb->chap_client.flags &= ~AUTH_STARTED;
581 auth_withpeer_fail(pcb, PPP_CHAP);