Lines Matching defs:pcb
98 static void eap_init(ppp_pcb *pcb);
99 static void eap_input(ppp_pcb *pcb, u_char *inp, int inlen);
100 static void eap_protrej(ppp_pcb *pcb);
101 static void eap_lowerup(ppp_pcb *pcb);
102 static void eap_lowerdown(ppp_pcb *pcb);
196 static void eap_init(ppp_pcb *pcb) {
198 BZERO(&pcb->eap, sizeof(eap_state));
200 pcb->eap.es_server.ea_id = magic();
209 ppp_pcb *pcb = (ppp_pcb*)arg;
211 if (!eap_client_active(pcb))
215 auth_withpeer_fail(pcb, PPP_EAP);
216 pcb->eap.es_client.ea_state = eapBadAuth;
225 void eap_authwithpeer(ppp_pcb *pcb, const char *localname) {
231 pcb->eap.es_client.ea_name = localname;
232 pcb->eap.es_client.ea_namelen = strlen(localname);
234 pcb->eap.es_client.ea_state = eapListen;
240 if (pcb->settings.eap_req_time > 0)
241 TIMEOUT(eap_client_timeout, pcb,
242 pcb->settings.eap_req_time);
250 static void eap_send_failure(ppp_pcb *pcb) {
267 pcb->eap.es_server.ea_id++;
268 PUTCHAR(pcb->eap.es_server.ea_id, outp);
271 ppp_write(pcb, p);
273 pcb->eap.es_server.ea_state = eapBadAuth;
274 auth_peer_fail(pcb, PPP_EAP);
281 static void eap_send_success(ppp_pcb *pcb) {
298 pcb->eap.es_server.ea_id++;
299 PUTCHAR(pcb->eap.es_server.ea_id, outp);
302 ppp_write(pcb, p);
304 auth_peer_success(pcb, PPP_EAP, 0,
305 pcb->eap.es_server.ea_peer, pcb->eap.es_server.ea_peerlen);
425 static void eap_figure_next_state(ppp_pcb *pcb, int status) {
437 pcb->settings.eap_timeout_time = pcb->eap.es_savedtime;
438 switch (pcb->eap.es_server.ea_state) {
445 ts = (struct t_server *)pcb->eap.es_server.ea_session;
448 pcb->eap.es_server.ea_session = NULL;
449 pcb->eap.es_server.ea_skey = NULL;
453 pcb->eap.es_server.ea_state = eapBadAuth;
458 if (pcb->eap.es_server.ea_peerlen > SRP_PSEUDO_LEN &&
459 strncmp(pcb->eap.es_server.ea_peer, SRP_PSEUDO_ID,
461 (pcb->eap.es_server.ea_peerlen - SRP_PSEUDO_LEN) * 3 / 4 <
465 pcb->eap.es_server.ea_peer + SRP_PSEUDO_LEN,
466 pcb->eap.es_server.ea_peerlen - SRP_PSEUDO_LEN,
490 pcb->eap.es_server.ea_peerlen = plen;
491 dp = (unsigned char *)pcb->eap.es_server.ea_peer;
503 pcb->eap.es_server.ea_peer[
504 pcb->eap.es_server.ea_peerlen] = '\0';
506 pcb->eap.es_server.ea_peerlen,
507 pcb->eap.es_server.ea_peer);
515 if (get_srp_secret(pcb->eap.es_unit, pcb->eap.es_server.ea_peer,
516 pcb->eap.es_server.ea_name, (char *)secbuf, 1) != 0) {
518 pcb->eap.es_server.ea_state = eapMD5Chall;
536 if (pcb->settings.eap_timeout_time > 0 &&
537 pcb->settings.eap_timeout_time < 30)
538 pcb->settings.eap_timeout_time = 30;
545 tpw.pebuf.name = pcb->eap.es_server.ea_peer;
554 pcb->eap.es_server.ea_session = (void *)ts;
555 pcb->eap.es_server.ea_state = eapSRP1;
556 vals[0] = pcb->eap.es_server.ea_id + 1;
564 pcb->eap.es_server.ea_state = eapMD5Chall;
569 ts = (struct t_server *)pcb->eap.es_server.ea_session;
572 pcb->eap.es_server.ea_session = NULL;
573 pcb->eap.es_server.ea_skey = NULL;
577 pcb->eap.es_server.ea_state = eapMD5Chall;
578 } else if (status != 0 || pcb->eap.es_server.ea_session == NULL) {
579 pcb->eap.es_server.ea_state = eapBadAuth;
581 pcb->eap.es_server.ea_state = eapSRP2;
587 ts = (struct t_server *)pcb->eap.es_server.ea_session;
590 pcb->eap.es_server.ea_session = NULL;
591 pcb->eap.es_server.ea_skey = NULL;
594 if (status != 0 || pcb->eap.es_server.ea_session == NULL) {
595 pcb->eap.es_server.ea_state = eapBadAuth;
597 pcb->eap.es_server.ea_state = eapSRP3;
604 ts = (struct t_server *)pcb->eap.es_server.ea_session;
607 pcb->eap.es_server.ea_session = NULL;
608 pcb->eap.es_server.ea_skey = NULL;
611 if (status != 0 || pcb->eap.es_server.ea_session == NULL) {
612 pcb->eap.es_server.ea_state = eapBadAuth;
614 pcb->eap.es_server.ea_state = eapOpen;
620 pcb->eap.es_server.ea_state = eapBadAuth;
622 pcb->eap.es_server.ea_state = eapOpen;
627 pcb->eap.es_server.ea_state = eapBadAuth;
630 if (pcb->eap.es_server.ea_state == eapBadAuth)
631 eap_send_failure(pcb);
638 static void eap_send_request(ppp_pcb *pcb) {
654 if (pcb->eap.es_server.ea_state < eapIdentify &&
655 pcb->eap.es_server.ea_state != eapInitial) {
656 pcb->eap.es_server.ea_state = eapIdentify;
658 if (pcb->settings.explicit_remote && pcb->remote_name) {
664 int len = (int)strlen(pcb->remote_name);
668 MEMCPY(pcb->eap.es_server.ea_peer, pcb->remote_name, len);
669 pcb->eap.es_server.ea_peer[len] = '\0';
670 pcb->eap.es_server.ea_peerlen = len;
671 eap_figure_next_state(pcb, 0);
676 if (pcb->settings.eap_max_transmits > 0 &&
677 pcb->eap.es_server.ea_requests >= pcb->settings.eap_max_transmits) {
678 if (pcb->eap.es_server.ea_responses > 0)
682 eap_send_failure(pcb);
699 PUTCHAR(pcb->eap.es_server.ea_id, outp);
703 switch (pcb->eap.es_server.ea_state) {
718 pcb->eap.es_challen = EAP_MIN_CHALLENGE_LENGTH +
720 PUTCHAR(pcb->eap.es_challen, outp);
721 magic_random_bytes(pcb->eap.es_challenge, pcb->eap.es_challen);
722 MEMCPY(outp, pcb->eap.es_challenge, pcb->eap.es_challen);
723 INCPTR(pcb->eap.es_challen, outp);
724 MEMCPY(outp, pcb->eap.es_server.ea_name, pcb->eap.es_server.ea_namelen);
725 INCPTR(pcb->eap.es_server.ea_namelen, outp);
733 PUTCHAR(pcb->eap.es_server.ea_namelen, outp);
734 MEMCPY(outp, pcb->eap.es_server.ea_name, pcb->eap.es_server.ea_namelen);
735 INCPTR(pcb->eap.es_server.ea_namelen, outp);
737 ts = (struct t_server *)pcb->eap.es_server.ea_session;
762 ts = (struct t_server *)pcb->eap.es_server.ea_session;
772 ts = (struct t_server *)pcb->eap.es_server.ea_session;
780 cp = (unsigned char *)pcb->eap.es_server.ea_peer;
781 if ((j = i = pcb->eap.es_server.ea_peerlen) > 7)
823 SHA1Update(&ctxt, &pcb->eap.es_server.ea_id, 1);
824 SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,
826 SHA1Update(&ctxt, pcb->eap.es_server.ea_peer,
827 pcb->eap.es_server.ea_peerlen);
834 SHA1Update(&ctxt, &pcb->eap.es_server.ea_id, 1);
835 SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,
846 pcb->eap.es_challen = EAP_MIN_CHALLENGE_LENGTH +
848 magic_random_bytes(pcb->eap.es_challenge, pcb->eap.es_challen);
849 MEMCPY(outp, pcb->eap.es_challenge, pcb->eap.es_challen);
850 INCPTR(pcb->eap.es_challen, outp);
862 ppp_write(pcb, p);
864 pcb->eap.es_server.ea_requests++;
866 if (pcb->settings.eap_timeout_time > 0)
867 TIMEOUT(eap_server_timeout, pcb, pcb->settings.eap_timeout_time);
876 void eap_authpeer(ppp_pcb *pcb, const char *localname) {
879 pcb->eap.es_server.ea_name = localname;
880 pcb->eap.es_server.ea_namelen = strlen(localname);
882 pcb->eap.es_savedtime = pcb->settings.eap_timeout_time;
885 if (pcb->eap.es_server.ea_state == eapInitial ||
886 pcb->eap.es_server.ea_state == eapPending) {
887 pcb->eap.es_server.ea_state = eapPending;
891 pcb->eap.es_server.ea_state = eapPending;
894 eap_send_request(pcb);
902 ppp_pcb *pcb = (ppp_pcb*)arg;
904 if (!eap_server_active(pcb))
908 eap_send_request(pcb);
917 ppp_pcb *pcb = (ppp_pcb*)arg;
919 if (pcb->eap.es_server.ea_state != eapOpen &&
920 pcb->eap.es_server.ea_state != eapSRP4)
923 pcb->eap.es_server.ea_requests = 0;
924 pcb->eap.es_server.ea_state = eapIdentify;
925 eap_figure_next_state(pcb, 0);
926 pcb->eap.es_server.ea_id++;
927 eap_send_request(pcb);
931 ppp_pcb *pcb = (ppp_pcb*)arg;
933 if (pcb->eap.es_server.ea_state != eapOpen ||
934 pcb->eap.es_server.ea_type != EAPT_SRP)
937 pcb->eap.es_server.ea_requests = 0;
938 pcb->eap.es_server.ea_state = eapSRP4;
939 pcb->eap.es_server.ea_id++;
940 eap_send_request(pcb);
952 static void eap_lowerup(ppp_pcb *pcb) {
953 pcb->eap.es_client.ea_state = eapClosed;
955 pcb->eap.es_server.ea_state = eapClosed;
964 static void eap_lowerdown(ppp_pcb *pcb) {
966 if (eap_client_active(pcb) && pcb->settings.eap_req_time > 0) {
967 UNTIMEOUT(eap_client_timeout, pcb);
970 if (eap_server_active(pcb)) {
971 if (pcb->settings.eap_timeout_time > 0) {
972 UNTIMEOUT(eap_server_timeout, pcb);
975 if ((pcb->eap.es_server.ea_state == eapOpen ||
976 pcb->eap.es_server.ea_state == eapSRP4) &&
977 pcb->eap.es_rechallenge > 0) {
978 UNTIMEOUT(eap_rechallenge, (void *)pcb);
980 if (pcb->eap.es_server.ea_state == eapOpen &&
981 pcb->eap.es_lwrechallenge > 0) {
982 UNTIMEOUT(srp_lwrechallenge, (void *)pcb);
986 pcb->eap.es_client.ea_state = pcb->eap.es_server.ea_state = eapInitial;
987 pcb->eap.es_client.ea_requests = pcb->eap.es_server.ea_requests = 0;
997 static void eap_protrej(ppp_pcb *pcb) {
999 if (eap_client_active(pcb)) {
1001 auth_withpeer_fail(pcb, PPP_EAP);
1004 if (eap_server_active(pcb)) {
1006 auth_peer_fail(pcb, PPP_EAP);
1009 eap_lowerdown(pcb);
1015 static void eap_send_response(ppp_pcb *pcb, u_char id, u_char typenum, const u_char *str, int lenstr) {
1035 pcb->eap.es_client.ea_id = id;
1042 ppp_write(pcb, p);
1048 static void eap_chap_response(ppp_pcb *pcb, u_char id, u_char *hash, const char *name, int namelen) {
1069 pcb->eap.es_client.ea_id = id;
1079 ppp_write(pcb, p);
1094 ppp_pcb *pcb = &ppp_pcb_list[pcb->eap.es_unit];
1114 pcb->eap.es_client.ea_id = id;
1122 ppp_write(pcb, p);
1135 ppp_pcb *pcb = &ppp_pcb_list[pcb->eap.es_unit];
1156 pcb->eap.es_client.ea_id = id;
1163 ppp_write(pcb, p);
1167 static void eap_send_nak(ppp_pcb *pcb, u_char id, u_char type) {
1187 pcb->eap.es_client.ea_id = id;
1192 ppp_write(pcb, p);
1273 SHA1Update(&ctxt, pcb->eap.es_client.ea_skey, SESSION_KEY_LEN);
1277 SHA1Update(&ctxt, pcb->eap.es_client.ea_name,
1278 pcb->eap.es_client.ea_namelen);
1300 pcb->eap.es_usedpseudo = 0;
1311 static void eap_request(ppp_pcb *pcb, u_char *inp, int id, int len) {
1334 pcb->eap.es_client.ea_requests++;
1335 if (pcb->settings.eap_allow_req != 0 &&
1336 pcb->eap.es_client.ea_requests > pcb->settings.eap_allow_req) {
1338 if (pcb->settings.eap_req_time > 0) {
1339 UNTIMEOUT(eap_client_timeout, pcb);
1341 auth_withpeer_fail(pcb, PPP_EAP);
1358 if (pcb->eap.es_usepseudo &&
1359 (pcb->eap.es_usedpseudo == 0 ||
1360 (pcb->eap.es_usedpseudo == 1 &&
1361 id == pcb->eap.es_client.ea_id))) {
1362 pcb->eap.es_usedpseudo = 1;
1370 eap_send_response(pcb, id, typenum,
1379 if (pcb->eap.es_usepseudo && pcb->eap.es_usedpseudo != 2) {
1381 pcb->eap.es_usedpseudo = 2;
1384 eap_send_response(pcb, id, typenum, (const u_char*)pcb->eap.es_client.ea_name,
1385 pcb->eap.es_client.ea_namelen);
1391 eap_send_response(pcb, id, typenum, NULL, 0);
1415 eap_send_nak(pcb, id, EAPT_SRP);
1431 if (pcb->settings.explicit_remote ||
1432 (pcb->settings.remote_name[0] != '\0' && vallen == len))
1433 strlcpy(rhostname, pcb->settings.remote_name, sizeof (rhostname));
1440 if (!get_secret(pcb, pcb->eap.es_client.ea_name,
1443 eap_send_nak(pcb, id, EAPT_SRP);
1455 eap_chap_response(pcb, id, hash, pcb->eap.es_client.ea_name,
1456 pcb->eap.es_client.ea_namelen);
1473 if (pcb->eap.es_client.ea_session != NULL) {
1474 tc = (struct t_client *)pcb->eap.es_client.
1481 if (id != pcb->eap.es_client.ea_id) {
1483 pcb->eap.es_client.ea_session = NULL;
1488 pcb->eap.es_client.ea_skey = NULL;
1519 MEMCPY(pcb->eap.es_client.ea_peer, rhostname, rhostnamelen);
1520 pcb->eap.es_client.ea_peer[rhostnamelen] = '\0';
1521 pcb->eap.es_client.ea_peerlen = rhostnamelen;
1566 tc = t_clientopen(pcb->eap.es_client.ea_name,
1569 eap_send_nak(pcb, id, EAPT_MD5CHAP);
1572 pcb->eap.es_client.ea_session = (void *)tc;
1585 tc = (struct t_client *)pcb->eap.es_client.ea_session;
1588 eap_send_nak(pcb, id, EAPT_MD5CHAP);
1591 if (pcb->eap.es_client.ea_skey != NULL) {
1596 if (id != pcb->eap.es_client.ea_id) {
1599 pcb->eap.es_client.ea_id, id);
1602 if (get_srp_secret(pcb->eap.es_unit,
1603 pcb->eap.es_client.ea_name,
1604 pcb->eap.es_client.ea_peer, secret, 0) == 0) {
1610 eap_send_nak(pcb, id, EAPT_MD5CHAP);
1617 pcb->eap.es_client.ea_skey =
1619 if (pcb->eap.es_client.ea_skey == NULL) {
1630 tc = (struct t_client *)pcb->eap.es_client.ea_session;
1631 if (tc == NULL || pcb->eap.es_client.ea_skey == NULL) {
1633 eap_send_nak(pcb, id, EAPT_MD5CHAP);
1641 if (pcb->eap.es_client.ea_state == eapOpen) {
1642 if (id != pcb->eap.es_client.ea_id) {
1645 pcb->eap.es_client.ea_id, id);
1655 GETLONG(pcb->eap.es_client.ea_keyflags, inp);
1657 if (len > 0 && pcb->eap.es_usepseudo) {
1678 SHA1Update(&ctxt, pcb->eap.es_client.ea_skey,
1681 SHA1Update(&ctxt, pcb->eap.es_client.ea_name,
1682 pcb->eap.es_client.ea_namelen);
1690 eap_send_nak(pcb, id, EAPT_MD5CHAP);
1698 eap_send_nak(pcb, id, EAPT_SRP);
1702 if (pcb->settings.eap_req_time > 0) {
1703 UNTIMEOUT(eap_client_timeout, pcb);
1704 TIMEOUT(eap_client_timeout, pcb,
1705 pcb->settings.eap_req_time);
1711 pcb->eap.es_client.ea_state = eapBadAuth;
1712 if (pcb->settings.eap_req_time > 0) {
1715 pcb->eap.es_client.ea_session = NULL;
1717 auth_withpeer_fail(pcb, PPP_EAP);
1725 static void eap_response(ppp_pcb *pcb, u_char *inp, int id, int len) {
1740 if (pcb->eap.es_server.ea_id != id) {
1742 pcb->eap.es_server.ea_id);
1746 pcb->eap.es_server.ea_responses++;
1758 if (pcb->eap.es_server.ea_state != eapIdentify) {
1767 MEMCPY(pcb->eap.es_server.ea_peer, inp, len);
1768 pcb->eap.es_server.ea_peer[len] = '\0';
1769 pcb->eap.es_server.ea_peerlen = len;
1770 eap_figure_next_state(pcb, 0);
1780 eap_figure_next_state(pcb, 1);
1789 !pcb->explicit_remote &&
1791 pcb->eap.es_server.ea_state == eapIdentify){
1793 eap_figure_next_state(pcb, 1);
1800 pcb->eap.es_server.ea_state = eapIdentify;
1801 eap_figure_next_state(pcb, 0);
1805 pcb->eap.es_server.ea_state = eapMD5Chall;
1810 switch (pcb->eap.es_server.ea_state) {
1814 pcb->eap.es_server.ea_state = eapMD5Chall;
1818 pcb->eap.es_server.ea_state = eapIdentify;
1819 eap_figure_next_state(pcb, 0);
1829 if (pcb->eap.es_server.ea_state != eapMD5Chall) {
1831 eap_figure_next_state(pcb, 1);
1836 eap_figure_next_state(pcb, 1);
1843 eap_figure_next_state(pcb, 1);
1868 if (!get_secret(pcb, rhostname,
1869 pcb->eap.es_server.ea_name, secret, &secret_len, 1)) {
1871 eap_send_failure(pcb);
1876 lwip_md5_update(&mdContext, &pcb->eap.es_server.ea_id, 1);
1879 lwip_md5_update(&mdContext, pcb->eap.es_challenge, pcb->eap.es_challen);
1883 eap_send_failure(pcb);
1886 pcb->eap.es_server.ea_type = EAPT_MD5CHAP;
1887 eap_send_success(pcb);
1888 eap_figure_next_state(pcb, 0);
1889 if (pcb->eap.es_rechallenge != 0)
1890 TIMEOUT(eap_rechallenge, pcb, pcb->eap.es_rechallenge);
1897 eap_figure_next_state(pcb, 1);
1904 if (pcb->eap.es_server.ea_state != eapSRP1) {
1906 eap_figure_next_state(pcb, 1);
1911 ts = (struct t_server *)pcb->eap.es_server.ea_session;
1913 pcb->eap.es_server.ea_skey = t_servergetkey(ts, &A);
1914 if (pcb->eap.es_server.ea_skey == NULL) {
1917 eap_send_failure(pcb);
1919 eap_figure_next_state(pcb, 0);
1924 if (pcb->eap.es_server.ea_state != eapSRP2) {
1926 eap_figure_next_state(pcb, 1);
1932 eap_figure_next_state(pcb, 1);
1935 GETLONG(pcb->eap.es_server.ea_keyflags, inp);
1936 ts = (struct t_server *)pcb->eap.es_server.ea_session;
1940 eap_send_failure(pcb);
1943 eap_figure_next_state(pcb, 0);
1947 if (pcb->eap.es_server.ea_state != eapSRP3) {
1952 pcb->eap.es_server.ea_type = EAPT_SRP;
1953 eap_send_success(pcb, esp);
1954 eap_figure_next_state(pcb, 0);
1955 if (pcb->eap.es_rechallenge != 0)
1956 TIMEOUT(eap_rechallenge, pcb,
1957 pcb->eap.es_rechallenge);
1958 if (pcb->eap.es_lwrechallenge != 0)
1959 TIMEOUT(srp_lwrechallenge, pcb,
1960 pcb->eap.es_lwrechallenge);
1964 if (pcb->eap.es_server.ea_state != eapSRP4) {
1976 SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,
1978 SHA1Update(&ctxt, pcb->eap.es_challenge, pcb->eap.es_challen);
1979 SHA1Update(&ctxt, pcb->eap.es_server.ea_peer,
1980 pcb->eap.es_server.ea_peerlen);
1984 eap_send_failure(pcb);
1987 pcb->eap.es_server.ea_state = eapOpen;
1988 if (pcb->eap.es_lwrechallenge != 0)
1990 pcb->eap.es_lwrechallenge);
2002 if (pcb->settings.eap_timeout_time > 0) {
2003 UNTIMEOUT(eap_server_timeout, pcb);
2006 if (pcb->eap.es_server.ea_state != eapBadAuth &&
2007 pcb->eap.es_server.ea_state != eapOpen) {
2008 pcb->eap.es_server.ea_id++;
2009 eap_send_request(pcb);
2017 static void eap_success(ppp_pcb *pcb, u_char *inp, int id, int len) {
2020 if (pcb->eap.es_client.ea_state != eapOpen && !eap_client_active(pcb)) {
2022 eap_state_name(pcb->eap.es_client.ea_state),
2023 pcb->eap.es_client.ea_state);
2027 if (pcb->settings.eap_req_time > 0) {
2028 UNTIMEOUT(eap_client_timeout, pcb);
2036 pcb->eap.es_client.ea_state = eapOpen;
2037 auth_withpeer_success(pcb, PPP_EAP, 0);
2043 static void eap_failure(ppp_pcb *pcb, u_char *inp, int id, int len) {
2046 if (!eap_client_active(pcb)) {
2048 eap_state_name(pcb->eap.es_client.ea_state),
2049 pcb->eap.es_client.ea_state);
2052 if (pcb->settings.eap_req_time > 0) {
2053 UNTIMEOUT(eap_client_timeout, pcb);
2061 pcb->eap.es_client.ea_state = eapBadAuth;
2064 auth_withpeer_fail(pcb, PPP_EAP);
2070 static void eap_input(ppp_pcb *pcb, u_char *inp, int inlen) {
2095 eap_request(pcb, inp, id, len);
2100 eap_response(pcb, inp, id, len);
2105 eap_success(pcb, inp, id, len);
2109 eap_failure(pcb, inp, id, len);