]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/eap.c
Create a new API to abstract the crypto functions used by pppd.
[ppp.git] / pppd / eap.c
index 54c3d42b85fe82edce41c3571e3a6af937b8dbae..8e0a4497f756b678c05fb12d574161554be01e80 100644 (file)
 
 #include "pppd.h"
 #include "pathnames.h"
-#include "md5.h"
+#include "ppp-crypto.h"
 #include "eap.h"
-#ifdef USE_PEAP
+#ifdef PPP_WITH_PEAP
 #include "peap.h"
-#endif /* USE_PEAP */
+#endif /* PPP_WITH_PEAP */
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
 #ifdef HAVE_TIME_H
 #include <time.h>
 #endif
 #include <t_pwd.h>
 #include <t_server.h>
 #include <t_client.h>
-#include "pppcrypt.h"
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 
 #ifndef SHA_DIGESTSIZE
 #define        SHA_DIGESTSIZE 20
 #endif
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
 #include "eap-tls.h"
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
-#ifdef CHAPMS
+#ifdef PPP_WITH_CHAPMS
 #include "chap_ms.h"
 #include "chap-new.h"
 
 extern int chapms_strip_domain;
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
 eap_state eap_states[NUM_PPP];         /* EAP state; one for each unit */
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
 static char *pn_secret = NULL;         /* Pseudonym generating secret */
 #endif
 
@@ -115,7 +114,7 @@ static option_t eap_option_list[] = {
       "Set max number of EAP Requests allows (client)" },
     { "eap-interval", o_int, &eap_states[0].es_rechallenge,
       "Set interval for EAP rechallenge" },
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
     { "srp-interval", o_int, &eap_states[0].es_lwrechallenge,
       "Set interval for SRP lightweight rechallenge" },
     { "srp-pn-secret", o_string, &pn_secret,
@@ -157,7 +156,7 @@ struct protent eap_protent = {
        NULL                    /* say whether to bring up link for this pkt */
 };
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
 /*
  * A well-known 2048 bit modulus.
  */
@@ -195,7 +194,7 @@ static const u_char wkmodulus[] = {
        0x9B, 0x65, 0xE3, 0x72, 0xFC, 0xD6, 0x8E, 0xF2,
        0x0F, 0xA7, 0x11, 0x1F, 0x9E, 0x4A, 0xFF, 0x73
 };
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 
 /* Local forward declarations. */
 static void eap_server_timeout (void *arg);
@@ -227,10 +226,10 @@ eap_init(int unit)
        esp->es_server.ea_id = (u_char)(drand48() * 0x100);
        esp->es_client.ea_timeout = EAP_DEFREQTIME;
        esp->es_client.ea_maxrequests = EAP_DEFALLOWREQ;
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        esp->es_client.ea_using_eaptls = 0;
-#endif /* USE_EAPTLS */
-#ifdef CHAPMS
+#endif /* PPP_WITH_EAPTLS */
+#ifdef PPP_WITH_CHAPMS
        esp->es_client.digest = chap_find_digest(CHAP_MICROSOFT_V2);
        esp->es_server.digest = chap_find_digest(CHAP_MICROSOFT_V2);
 #endif
@@ -327,7 +326,7 @@ eap_send_success(eap_state *esp)
            esp->es_server.ea_peer, esp->es_server.ea_peerlen);
 }
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
 /*
  * Set DES key according to pseudonym-generating secret and current
  * date.
@@ -337,20 +336,30 @@ pncrypt_setkey(int timeoffs)
 {
        struct tm *tp;
        char tbuf[9];
-       SHA1_CTX ctxt;
+    PPP_MD_CTX *ctxt;
        u_char dig[SHA_DIGESTSIZE];
+    int diglen = sizeof(dig);
        time_t reftime;
 
        if (pn_secret == NULL)
                return (0);
        reftime = time(NULL) + timeoffs;
        tp = localtime(&reftime);
-       SHA1Init(&ctxt);
-       SHA1Update(&ctxt, pn_secret, strlen(pn_secret));
-       strftime(tbuf, sizeof (tbuf), "%Y%m%d", tp);
-       SHA1Update(&ctxt, tbuf, strlen(tbuf));
-       SHA1Final(dig, &ctxt);
-       return (DesSetkey(dig));
+    ctxt = PPP_MD_CTX_new();
+    if (ctxt) {
+
+           strftime(tbuf, sizeof (tbuf), "%Y%m%d", tp);
+
+        PPP_DigestInit(ctxt, PPP_sha1());
+        PPP_DigestUpdate(ctxt, pn_secret, strlen(pn_secret));
+        PPP_DigestUpdate(ctxt, tbuf, strlen(tbuf));
+        PPP_DigestFinal(ctxt, dig, &diglen);
+
+        PPP_MD_CTX_free(ctxt);
+           return (DesSetkey(dig));
+   }
+
+   return (0);
 }
 
 static char base64[] =
@@ -423,7 +432,7 @@ b64dec(struct b64state *bs, u_char *inp, int inlen, u_char *outp)
        }
        return (outlen);
 }
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 
 /*
  * Assume that current waiting server state is complete and figure
@@ -434,7 +443,7 @@ b64dec(struct b64state *bs, u_char *inp, int inlen, u_char *outp)
 static void
 eap_figure_next_state(eap_state *esp, int status)
 {
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
        unsigned char secbuf[MAXWORDLEN], clear[8], *sp, *dp;
        struct t_pw tpw;
        struct t_confent *tce, mytce;
@@ -443,23 +452,23 @@ eap_figure_next_state(eap_state *esp, int status)
        int id, i, plen, toffs;
        u_char vals[2];
        struct b64state bs;
-#endif /* USE_SRP */
-#ifdef USE_EAPTLS
+#endif /* PPP_WITH_SRP */
+#ifdef PPP_WITH_EAPTLS
        struct eaptls_session *ets;
        int secret_len;
        char secret[MAXWORDLEN];
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
        esp->es_server.ea_timeout = esp->es_savedtime;
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        esp->es_server.ea_prev_state = esp->es_server.ea_state;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
        switch (esp->es_server.ea_state) {
        case eapBadAuth:
                return;
 
        case eapIdentify:
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
                /* Discard any previous session. */
                ts = (struct t_server *)esp->es_server.ea_session;
                if (ts != NULL) {
@@ -467,12 +476,12 @@ eap_figure_next_state(eap_state *esp, int status)
                        esp->es_server.ea_session = NULL;
                        esp->es_server.ea_skey = NULL;
                }
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
                if (status != 0) {
                        esp->es_server.ea_state = eapBadAuth;
                        break;
                }
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
                /* If we've got a pseudonym, try to decode to real name. */
                if (esp->es_server.ea_peerlen > SRP_PSEUDO_LEN &&
                    strncmp(esp->es_server.ea_peer, SRP_PSEUDO_ID,
@@ -577,20 +586,20 @@ eap_figure_next_state(eap_state *esp, int status)
                        t_servergenexp(ts);
                        break;
                }
-#endif /* USE_SRP */
-#ifdef USE_EAPTLS
+#endif /* PPP_WITH_SRP */
+#ifdef PPP_WITH_EAPTLS
                 if (!get_secret(esp->es_unit, esp->es_server.ea_peer,
                     esp->es_server.ea_name, secret, &secret_len, 1)) {
 
                        esp->es_server.ea_state = eapTlsStart;
                        break;
                }
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
                esp->es_server.ea_state = eapMD5Chall;
                break;
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        case eapTlsStart:
                /* Initialize ssl session */
                if(!eaptls_init_ssl_server(esp)) {
@@ -651,17 +660,17 @@ eap_figure_next_state(eap_state *esp, int status)
        case eapTlsSendAlert:
                esp->es_server.ea_state = eapTlsRecvAlertAck;
                break;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
        case eapSRP1:
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
                ts = (struct t_server *)esp->es_server.ea_session;
                if (ts != NULL && status != 0) {
                        t_serverclose(ts);
                        esp->es_server.ea_session = NULL;
                        esp->es_server.ea_skey = NULL;
                }
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
                if (status == 1) {
                        esp->es_server.ea_state = eapMD5Chall;
                } else if (status != 0 || esp->es_server.ea_session == NULL) {
@@ -672,14 +681,14 @@ eap_figure_next_state(eap_state *esp, int status)
                break;
 
        case eapSRP2:
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
                ts = (struct t_server *)esp->es_server.ea_session;
                if (ts != NULL && status != 0) {
                        t_serverclose(ts);
                        esp->es_server.ea_session = NULL;
                        esp->es_server.ea_skey = NULL;
                }
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
                if (status != 0 || esp->es_server.ea_session == NULL) {
                        esp->es_server.ea_state = eapBadAuth;
                } else {
@@ -689,14 +698,14 @@ eap_figure_next_state(eap_state *esp, int status)
 
        case eapSRP3:
        case eapSRP4:
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
                ts = (struct t_server *)esp->es_server.ea_session;
                if (ts != NULL && status != 0) {
                        t_serverclose(ts);
                        esp->es_server.ea_session = NULL;
                        esp->es_server.ea_skey = NULL;
                }
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
                if (status != 0 || esp->es_server.ea_session == NULL) {
                        esp->es_server.ea_state = eapBadAuth;
                } else {
@@ -704,7 +713,7 @@ eap_figure_next_state(eap_state *esp, int status)
                }
                break;
 
-#ifdef CHAPMS
+#ifdef PPP_WITH_CHAPMS
        case eapMSCHAPv2Chall:
 #endif
        case eapMD5Chall:
@@ -722,12 +731,12 @@ eap_figure_next_state(eap_state *esp, int status)
        if (esp->es_server.ea_state == eapBadAuth)
                eap_send_failure(esp);
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        dbglog("EAP id=0x%2x '%s' -> '%s'", esp->es_server.ea_id, eap_state_name(esp->es_server.ea_prev_state), eap_state_name(esp->es_server.ea_state));
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 }
 
-#if CHAPMS
+#if PPP_WITH_CHAPMS
 /*
  * eap_chap_verify_response - check whether the peer's response matches
  * what we think it should be.  Returns 1 if it does (authentication
@@ -795,7 +804,7 @@ eap_chapms2_send_request(eap_state *esp, u_char id,
                auth_peer_fail(esp->es_unit, PPP_EAP);
        }
 }
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
 /*
  * Format an EAP Request message and send it to the peer.  Message
@@ -810,13 +819,13 @@ eap_send_request(eap_state *esp)
        int outlen;
        int challen;
        char *str;
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
        struct t_server *ts;
        u_char clear[8], cipher[8], dig[SHA_DIGESTSIZE], *optr, *cp;
-       int i, j;
+       int i, j, diglen;
        struct b64state b64;
-       SHA1_CTX ctxt;
-#endif /* USE_SRP */
+       PPP_MD_CTX *ctxt;
+#endif /* PPP_WITH_SRP */
 
        /* Handle both initial auth and restart */
        if (esp->es_server.ea_state < eapIdentify &&
@@ -882,7 +891,7 @@ eap_send_request(eap_state *esp)
                INCPTR(esp->es_server.ea_namelen, outp);
                break;
 
-#ifdef CHAPMS
+#ifdef PPP_WITH_CHAPMS
        case eapMSCHAPv2Chall:
                esp->es_server.digest->generate_challenge(esp->es_challenge);
                challen = esp->es_challenge[0];
@@ -903,9 +912,9 @@ eap_send_request(eap_state *esp)
                                esp->es_server.ea_namelen);
                INCPTR(esp->es_server.ea_namelen, outp);
                break;
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        case eapTlsStart:
                PUTCHAR(EAPT_TLS, outp);
                PUTCHAR(EAP_TLS_FLAGS_START, outp);
@@ -927,9 +936,9 @@ eap_send_request(eap_state *esp)
                eaptls_send(esp->es_server.ea_session, &outp);
                eap_figure_next_state(esp, 0);
                break;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
        case eapSRP1:
                PUTCHAR(EAPT_SRP, outp);
                PUTCHAR(EAPSRP_CHALLENGE, outp);
@@ -1025,24 +1034,33 @@ eap_send_request(eap_state *esp)
                        }
 
                        /* Obscure the pseudonym with SHA1 hash */
-                       SHA1Init(&ctxt);
-                       SHA1Update(&ctxt, &esp->es_server.ea_id, 1);
-                       SHA1Update(&ctxt, esp->es_server.ea_skey,
-                           SESSION_KEY_LEN);
-                       SHA1Update(&ctxt, esp->es_server.ea_peer,
-                           esp->es_server.ea_peerlen);
-                       while (optr < outp) {
-                               SHA1Final(dig, &ctxt);
-                               cp = dig;
-                               while (cp < dig + SHA_DIGESTSIZE)
-                                       *optr++ ^= *cp++;
-                               SHA1Init(&ctxt);
-                               SHA1Update(&ctxt, &esp->es_server.ea_id, 1);
-                               SHA1Update(&ctxt, esp->es_server.ea_skey,
-                                   SESSION_KEY_LEN);
-                               SHA1Update(&ctxt, optr - SHA_DIGESTSIZE,
-                                   SHA_DIGESTSIZE);
-                       }
+            ctxt = PPP_MD_CTX_new();
+            if (ctxt) {
+
+                PPP_DigestInit(ctxt, PPP_sha1());
+                PPP_DigestUpdate(ctxt, &esp->es_server.ea_id, 1);
+                PPP_DigestUpdate(ctxt, &esp->es_server.ea_skey,
+                        SESSION_KEY_LEN);
+                PPP_DigestUpdate(ctxt,  esp->es_server.ea_peer,
+                        esp->es_server.ea_peerlen);
+
+                while (optr < outp) {
+                    diglen = SHA_DIGEST_LENGTH;
+                    PPP_DigestFinal(ctxt, dig, &diglen);
+                    cp = dig;
+                    while (cp < dig + SHA_DIGEST_LENGTH)
+                        *optr++ ^= *cp++;
+
+                    PPP_DigestInit(ctxt, PPP_sha1());
+                    PPP_DigestUpdate(ctxt, &esp->es_server.ea_id, 1);
+                    PPP_DigestUpdate(ctxt, esp->es_server.ea_skey,
+                            SESSION_KEY_LEN);
+                    PPP_DigestUpdate(ctxt, optr - SHA_DIGEST_LENGTH,
+                            SHA_DIGEST_LENGTH);
+                           }
+
+                PPP_MD_CTX_free(ctxt);
+            }
                }
                break;
 
@@ -1058,7 +1076,7 @@ eap_send_request(eap_state *esp)
                BCOPY(esp->es_challenge, outp, esp->es_challen);
                INCPTR(esp->es_challen, outp);
                break;
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 
        default:
                return;
@@ -1112,18 +1130,18 @@ eap_authpeer(int unit, char *localname)
 static void
 eap_server_timeout(void *arg)
 {
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        u_char *outp;
        u_char *lenloc;
        int outlen;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
        eap_state *esp = (eap_state *) arg;
 
        if (!eap_server_active(esp))
                return;
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        switch(esp->es_server.ea_prev_state) {
 
        /*
@@ -1161,7 +1179,7 @@ eap_server_timeout(void *arg)
        default:
                break;
        }
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
        /* EAP ID number must not change on timeout. */
        eap_send_request(esp);
@@ -1322,7 +1340,7 @@ eap_chap_response(eap_state *esp, u_char id, u_char *hash,
        int msglen;
 
        outp = outpacket_buf;
-    
+
        MAKEHEADER(outp, PPP_EAP);
 
        PUTCHAR(EAP_RESPONSE, outp);
@@ -1342,7 +1360,7 @@ eap_chap_response(eap_state *esp, u_char id, u_char *hash,
        output(esp->es_unit, outpacket_buf, PPP_HDRLEN + msglen);
 }
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
 /*
  * Format and send a SRP EAP Response message.
  */
@@ -1397,9 +1415,9 @@ eap_srpval_response(eap_state *esp, u_char id, u_int32_t flags, u_char *str)
 
        output(esp->es_unit, outpacket_buf, PPP_HDRLEN + msglen);
 }
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
 /*
  * Send an EAP-TLS response message with tls data
  */
@@ -1466,7 +1484,7 @@ eap_tls_sendack(eap_state *esp, u_char id)
 
        output(esp->es_unit, outpacket_buf, PPP_HDRLEN + outlen);
 }
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
 static void
 eap_send_nak(eap_state *esp, u_char id, u_char type)
@@ -1489,7 +1507,7 @@ eap_send_nak(eap_state *esp, u_char id, u_char type)
        output(esp->es_unit, outpacket_buf, PPP_HDRLEN + msglen);
 }
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
 static char *
 name_of_pn_file(void)
 {
@@ -1503,7 +1521,7 @@ name_of_pn_file(void)
                errno = EINVAL;
                return (NULL);
        }
-       file = _PATH_PSEUDONYM;
+       file = PPP_PATH_PSEUDONYM;
        pl = strlen(user) + strlen(file) + 2;
        path = malloc(pl);
        if (path == NULL)
@@ -1547,9 +1565,9 @@ write_pseudonym(eap_state *esp, u_char *inp, int len, int id)
 {
        u_char val;
        u_char *datp, *digp;
-       SHA1_CTX ctxt;
+       PPP_MD_CTX *ctxt;
        u_char dig[SHA_DIGESTSIZE];
-       int dsize, fd, olen = len;
+       int dsize, fd, olen = len, diglen = sizeof(dig);
 
        /*
         * Do the decoding by working backwards.  This eliminates the need
@@ -1561,18 +1579,26 @@ write_pseudonym(eap_state *esp, u_char *inp, int len, int id)
                        dsize = SHA_DIGESTSIZE;
                len -= dsize;
                datp = inp + len;
-               SHA1Init(&ctxt);
-               SHA1Update(&ctxt, &val, 1);
-               SHA1Update(&ctxt, esp->es_client.ea_skey, SESSION_KEY_LEN);
-               if (len > 0) {
-                       SHA1Update(&ctxt, datp, SHA_DIGESTSIZE);
-               } else {
-                       SHA1Update(&ctxt, esp->es_client.ea_name,
-                           esp->es_client.ea_namelen);
-               }
-               SHA1Final(dig, &ctxt);
-               for (digp = dig; digp < dig + SHA_DIGESTSIZE; digp++)
-                       *datp++ ^= *digp;
+        ctxt = PPP_MD_CTX_new();
+        if (ctxt) {
+
+            PPP_DigestInit(ctxt, PPP_sha1());
+            PPP_DigestUpdate(ctxt, &val, 1);
+            PPP_DigestUpdate(ctxt, esp->es_client.ea_skey,
+                    SESSION_KEY_LEN);
+            if (len > 0) {
+                PPP_DigestUpdate(ctxt, datp, SHA_DIGESTSIZE);
+            } else {
+                PPP_DigestUpdate(ctxt, esp->es_client.ea_name,
+                    esp->es_client.ea_namelen);
+            }
+            PPP_DigestFinal(ctxt, dig, &diglen);
+
+            for (digp = dig; digp < dig + SHA_DIGEST_LENGTH; digp++)
+                *datp++ ^= *digp;
+
+            PPP_MD_CTX_free(ctxt);
+        }
        }
 
        /* Now check that the result is sane */
@@ -1596,9 +1622,9 @@ write_pseudonym(eap_state *esp, u_char *inp, int len, int id)
                remove_pn_file();
        }
 }
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 
-#if CHAPMS
+#if PPP_WITH_CHAPMS
 /*
  * Format and send an CHAPV2-Challenge EAP Response message.
  */
@@ -1642,21 +1668,23 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
        int secret_len;
        char secret[MAXWORDLEN];
        char rhostname[256];
-       MD5_CTX mdContext;
+    PPP_MD_CTX *mdctx;
        u_char hash[MD5_SIGNATURE_SIZE];
-#ifdef USE_EAPTLS
+    int hashlen = MD5_SIGNATURE_SIZE;
+#ifdef PPP_WITH_EAPTLS
        u_char flags;
        struct eaptls_session *ets = esp->es_client.ea_session;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
        struct t_client *tc;
        struct t_num sval, gval, Nval, *Ap, Bval;
        u_char vals[2];
-       SHA1_CTX ctxt;
+       PPP_MD_CTX *ctxt;
        u_char dig[SHA_DIGESTSIZE];
+    int diglen = sizeof(dig);
        int fd;
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 
        /*
         * Ignore requests if we're not open
@@ -1693,7 +1721,7 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
        case EAPT_IDENTITY:
                if (len > 0)
                        info("EAP: Identity prompt \"%.*q\"", len, inp);
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
                if (esp->es_usepseudo &&
                    (esp->es_usedpseudo == 0 ||
                        (esp->es_usedpseudo == 1 &&
@@ -1719,7 +1747,7 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
                        remove_pn_file();
                        esp->es_usedpseudo = 2;
                }
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
                eap_send_response(esp, id, typenum, (u_char *)esp->es_client.ea_name,
                    esp->es_client.ea_namelen);
                break;
@@ -1780,18 +1808,32 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
                        eap_send_nak(esp, id, EAPT_SRP);
                        break;
                }
-               MD5_Init(&mdContext);
-               typenum = id;
-               MD5_Update(&mdContext, &typenum, 1);
-               MD5_Update(&mdContext, (u_char *)secret, secret_len);
-               BZERO(secret, sizeof (secret));
-               MD5_Update(&mdContext, inp, vallen);
-               MD5_Final(hash, &mdContext);
-               eap_chap_response(esp, id, hash, esp->es_client.ea_name,
-                   esp->es_client.ea_namelen);
+
+        mdctx = PPP_MD_CTX_new();
+        if (mdctx != NULL) {
+            if (PPP_DigestInit(mdctx, PPP_md5())) {
+                typenum = id;
+                if (PPP_DigestUpdate(mdctx, &typenum, 1)) {
+                    if (PPP_DigestUpdate(mdctx, secret, secret_len)) {
+                        BZERO(secret, sizeof(secret));
+                        if (PPP_DigestUpdate(mdctx, inp, vallen)) {
+                            if (PPP_DigestFinal(mdctx, hash, &hashlen)) {
+                                eap_chap_response(esp, id, hash, esp->es_client.ea_name,
+                                    esp->es_client.ea_namelen);
+                                PPP_MD_CTX_free(mdctx);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            PPP_MD_CTX_free(mdctx);
+        }
+        dbglog("EAP: Invalid MD5 checksum");
+        eap_send_nak(esp, id, EAPT_SRP);
                break;
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        case EAPT_TLS:
 
                switch(esp->es_client.ea_state) {
@@ -1859,7 +1901,7 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
 
                        /* Check if TLS handshake is finished */
                        if(eaptls_is_init_finished(ets)) {
-#ifdef MPPE
+#ifdef PPP_WITH_MPPE
                                eaptls_gen_mppe_keys(ets, 1);
 #endif
                                eaptls_free_session(ets);
@@ -1879,9 +1921,9 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
                }
 
                break;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
        case EAPT_SRP:
                if (len < 1) {
                        error("EAP: received empty SRP Request");
@@ -2092,18 +2134,25 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
                                warn("EAP: malformed Lightweight rechallenge");
                                return;
                        }
-                       SHA1Init(&ctxt);
-                       vals[0] = id;
-                       SHA1Update(&ctxt, vals, 1);
-                       SHA1Update(&ctxt, esp->es_client.ea_skey,
-                           SESSION_KEY_LEN);
-                       SHA1Update(&ctxt, inp, len);
-                       SHA1Update(&ctxt, esp->es_client.ea_name,
-                           esp->es_client.ea_namelen);
-                       SHA1Final(dig, &ctxt);
-                       eap_srp_response(esp, id, EAPSRP_LWRECHALLENGE, dig,
-                           SHA_DIGESTSIZE);
-                       break;
+                       ctxt = PPP_MD_CTX_new();
+            if (ctxt) {
+
+                vals[0] = id;
+                PPP_DigestInit(ctxt, PPP_sha1());
+                PPP_DigestUpdate(ctxt, vals, 1);
+                PPP_DigestUpdate(ctxt, esp->es_client.ea_skey,
+                        SESSION_KEY_LEN);
+                PPP_DigestUpdate(ctxt, inp, len);
+                PPP_DigestUpdate(ctxt, esp->es_client.ea_name,
+                        esp->es_client.ea_namelen);
+                PPP_DigestFinal(ctxt, dig, &diglen);
+
+                PPP_MD_CTX_free(ctxt);
+
+                eap_srp_response(esp, id, EAPSRP_LWRECHALLENGE, dig,
+                    SHA_DIGESTSIZE);
+                       }
+            break;
 
                default:
                        error("EAP: unknown SRP Subtype %d", vallen);
@@ -2111,9 +2160,9 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
                        break;
                }
                break;
-#endif /* USE_SRP */
-    
-#ifdef CHAPMS
+#endif /* PPP_WITH_SRP */
+
+#ifdef PPP_WITH_CHAPMS
         case EAPT_MSCHAPV2:
            if (len < 4) {
                error("EAP: received invalid MSCHAPv2 packet, too short");
@@ -2182,6 +2231,7 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
                    eap_send_nak(esp, id, EAPT_SRP);
                    break;
                }
+               esp->es_client.ea_namelen = strlen(esp->es_client.ea_name);
 
                /* Create the MSCHAPv2 response (and add to cache) */
                unsigned char response[MS_CHAP2_RESPONSE_LEN+1]; // VLEN + VALUE
@@ -2218,8 +2268,8 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
            }
 
            break;
-#endif /* CHAPMS */
-#ifdef USE_PEAP
+#endif /* PPP_WITH_CHAPMS */
+#ifdef PPP_WITH_PEAP
        case EAPT_PEAP:
 
                /* Initialize the PEAP context (if not already initialized) */
@@ -2240,7 +2290,7 @@ eap_request(eap_state *esp, u_char *inp, int id, int len)
                }
 
                break;
-#endif /* USE_PEAP */
+#endif // PPP_WITH_PEAP
 
        default:
                info("EAP: unknown authentication type %d; Naking", typenum);
@@ -2261,10 +2311,10 @@ client_failure:
                UNTIMEOUT(eap_client_timeout, (void *)esp);
        }
        esp->es_client.ea_session = NULL;
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
        t_clientclose(tc);
        auth_withpeer_fail(esp->es_unit, PPP_EAP);
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 }
 
 /*
@@ -2278,25 +2328,27 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
        int secret_len;
        char secret[MAXSECRETLEN];
        char rhostname[256];
-       MD5_CTX mdContext;
+    PPP_MD_CTX *mdctx;
        u_char hash[MD5_SIGNATURE_SIZE];
-#ifdef USE_SRP
+    int hashlen = MD5_SIGNATURE_SIZE;
+#ifdef PPP_WITH_SRP
        struct t_server *ts;
        struct t_num A;
-       SHA1_CTX ctxt;
+       PPP_MD_CTX *ctxt;
        u_char dig[SHA_DIGESTSIZE];
-#endif /* USE_SRP */
+    int diglen = sizeof(dig);
+#endif /* PPP_WITH_SRP */
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        struct eaptls_session *ets;
        u_char flags;
-#endif /* USE_EAPTLS */
-#ifdef CHAPMS
+#endif /* PPP_WITH_EAPTLS */
+#ifdef PPP_WITH_CHAPMS
        u_char opcode;
        int (*chap_verifier)(char *, char *, int, struct chap_digest_type *,
                unsigned char *, unsigned char *, char *, int);
        char response_message[256];
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
        /*
         * Ignore responses if we're not open
@@ -2343,7 +2395,7 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
                eap_figure_next_state(esp, 0);
                break;
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        case EAPT_TLS:
                switch(esp->es_server.ea_state) {
 
@@ -2373,7 +2425,7 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
                                GETCHAR(flags, inp);
 
                                if(len == 1 && !flags) {        /* Ack = ok */
-#ifdef MPPE
+#ifdef PPP_WITH_MPPE
                                        eaptls_gen_mppe_keys( esp->es_server.ea_session, 0 );
 #endif
                                        eap_send_success(esp);
@@ -2399,7 +2451,7 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
                        break;
                }
                break;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
        case EAPT_NOTIFICATION:
                dbglog("EAP unexpected Notification; response discarded");
@@ -2432,14 +2484,14 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
                        esp->es_server.ea_state = eapMD5Chall;
                        break;
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
                        /* Send EAP-TLS start packet */
                case EAPT_TLS:
                        esp->es_server.ea_state = eapTlsStart;
                        break;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
-#ifdef CHAPMS
+#ifdef PPP_WITH_CHAPMS
                case EAPT_MSCHAPV2:
                        info("EAP: peer proposes MSCHAPv2");
                        /* If MSCHAPv2 digest was not found, NAK the packet */
@@ -2450,7 +2502,7 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
                        }
                        esp->es_server.ea_state = eapMSCHAPv2Chall;
                        break;
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
                default:
                        dbglog("EAP: peer requesting unknown Type %d", vallen);
@@ -2516,24 +2568,46 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
                        eap_send_failure(esp);
                        break;
                }
-               MD5_Init(&mdContext);
-               MD5_Update(&mdContext, &esp->es_server.ea_id, 1);
-               MD5_Update(&mdContext, (u_char *)secret, secret_len);
-               BZERO(secret, sizeof (secret));
-               MD5_Update(&mdContext, esp->es_challenge, esp->es_challen);
-               MD5_Final(hash, &mdContext);
-               if (BCMP(hash, inp, MD5_SIGNATURE_SIZE) != 0) {
-                       eap_send_failure(esp);
-                       break;
-               }
-               esp->es_server.ea_type = EAPT_MD5CHAP;
-               eap_send_success(esp);
-               eap_figure_next_state(esp, 0);
-               if (esp->es_rechallenge != 0)
-                       TIMEOUT(eap_rechallenge, esp, esp->es_rechallenge);
+
+        mdctx = PPP_MD_CTX_new();
+        if (mdctx != NULL) {
+
+            if (PPP_DigestInit(mdctx, PPP_md5())) {
+
+                if (PPP_DigestUpdate(mdctx, &esp->es_server.ea_id, 1)) {
+
+                    if (PPP_DigestUpdate(mdctx, &secret, secret_len)) {
+
+                        BZERO(secret, sizeof(secret));
+                        if (PPP_DigestUpdate(mdctx, esp->es_challenge, esp->es_challen)) {
+
+                            if (PPP_DigestFinal(mdctx, hash, &hashlen)) {
+
+                                if (BCMP(hash, inp, MD5_SIGNATURE_SIZE) == 0) {
+
+                                    esp->es_server.ea_type = EAPT_MD5CHAP;
+                                    eap_send_success(esp);
+                                    eap_figure_next_state(esp, 0);
+
+                                    if (esp->es_rechallenge != 0) {
+                                        TIMEOUT(eap_rechallenge, esp, esp->es_rechallenge);
+                                    }
+                                    PPP_MD_CTX_free(mdctx);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            PPP_MD_CTX_free(mdctx);
+        }
+
+               eap_send_failure(esp);
                break;
 
-#ifdef CHAPMS
+#ifdef PPP_WITH_CHAPMS
        case EAPT_MSCHAPV2:
                if (len < 1) {
                        error("EAP: received MSCHAPv2 with no data");
@@ -2636,9 +2710,9 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
                }
 
                break;
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
        case EAPT_SRP:
                if (len < 1) {
                        error("EAP: empty SRP Response");
@@ -2718,28 +2792,36 @@ eap_response(eap_state *esp, u_char *inp, int id, int len)
                                    "response");
                                return;
                        }
-                       SHA1Init(&ctxt);
-                       vallen = id;
-                       SHA1Update(&ctxt, &vallen, 1);
-                       SHA1Update(&ctxt, esp->es_server.ea_skey,
-                           SESSION_KEY_LEN);
-                       SHA1Update(&ctxt, esp->es_challenge, esp->es_challen);
-                       SHA1Update(&ctxt, esp->es_server.ea_peer,
-                           esp->es_server.ea_peerlen);
-                       SHA1Final(dig, &ctxt);
-                       if (BCMP(dig, inp, SHA_DIGESTSIZE) != 0) {
-                               error("EAP: failed Lightweight rechallenge");
-                               eap_send_failure(esp);
-                               break;
-                       }
-                       esp->es_server.ea_state = eapOpen;
-                       if (esp->es_lwrechallenge != 0)
-                               TIMEOUT(srp_lwrechallenge, esp,
-                                   esp->es_lwrechallenge);
+            ctxt = PPP_MD_CTX_new();
+            if (ctxt) {
+                           vallen = id;
+
+                PPP_DigestInit(ctxt, PPP_sha1());
+                PPP_DigestUpdate(ctxt, &vallen, 1);
+                PPP_DigestUpdate(ctxt, esp->es_server.ea_skey,
+                    SESSION_KEY_LEN);
+                PPP_DigestUpdate(ctxt, esp->es_challenge, esp->es_challen);
+                PPP_DigestUpdate(ctxt, esp->es_server.ea_peer,
+                    esp->es_server.ea_peerlen);
+                PPP_DigestFinal(ctxt, dig, &diglen);
+
+                PPP_MD_CTX_free(ctxt);
+
+                if (BCMP(dig, inp, SHA_DIGEST_LENGTH) != 0) {
+                    error("EAP: failed Lightweight rechallenge");
+                    eap_send_failure(esp);
+                    break;
+                }
+
+                esp->es_server.ea_state = eapOpen;
+                if (esp->es_lwrechallenge != 0)
+                    TIMEOUT(srp_lwrechallenge, esp,
+                        esp->es_lwrechallenge);
+            }
                        break;
                }
                break;
-#endif /* USE_SRP */
+#endif /* PPP_WITH_SRP */
 
        default:
                /* This can't happen. */
@@ -2765,9 +2847,9 @@ static void
 eap_success(eap_state *esp, u_char *inp, int id, int len)
 {
        if (esp->es_client.ea_state != eapOpen && !eap_client_active(esp)
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
                && esp->es_client.ea_state != eapTlsRecvSuccess
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
                ) {
                dbglog("EAP unexpected success message in state %s (%d)",
                    eap_state_name(esp->es_client.ea_state),
@@ -2775,7 +2857,7 @@ eap_success(eap_state *esp, u_char *inp, int id, int len)
                return;
        }
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        if(esp->es_client.ea_using_eaptls && esp->es_client.ea_state !=
                eapTlsRecvSuccess) {
                dbglog("EAP-TLS unexpected success message in state %s (%d)",
@@ -2783,7 +2865,7 @@ eap_success(eap_state *esp, u_char *inp, int id, int len)
                     esp->es_client.ea_state);
                return;
        }
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
        if (esp->es_client.ea_timeout > 0) {
                UNTIMEOUT(eap_client_timeout, (void *)esp);
@@ -2794,7 +2876,7 @@ eap_success(eap_state *esp, u_char *inp, int id, int len)
                PRINTMSG(inp, len);
        }
 
-#ifdef USE_PEAP
+#ifdef PPP_WITH_PEAP
        peap_finish(&esp->ea_peap);
 #endif
 
@@ -2833,7 +2915,7 @@ eap_failure(eap_state *esp, u_char *inp, int id, int len)
 
        error("EAP: peer reports authentication failure");
 
-#ifdef USE_PEAP
+#ifdef PPP_WITH_PEAP
        peap_finish(&esp->ea_peap);
 #endif
 
@@ -2917,12 +2999,12 @@ eap_printpkt(u_char *inp, int inlen,
        int code, id, len, rtype, vallen;
        u_char *pstart;
        u_int32_t uval;
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
        u_char flags;
-#endif /* USE_EAPTLS */
-#ifdef CHAPMS
+#endif /* PPP_WITH_EAPTLS */
+#ifdef PPP_WITH_CHAPMS
        u_char opcode;
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
        if (inlen < EAP_HEADERLEN)
                return (0);
@@ -2987,7 +3069,7 @@ eap_printpkt(u_char *inp, int inlen,
                        }
                        break;
 
-#ifdef CHAPMS
+#ifdef PPP_WITH_CHAPMS
                case EAPT_MSCHAPV2:
                        if (len <= 0)
                                break;
@@ -3040,9 +3122,9 @@ eap_printpkt(u_char *inp, int inlen,
                                break;
                        }
                        break;
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
                case EAPT_TLS:
                        if (len < 1)
                                break;
@@ -3058,9 +3140,9 @@ eap_printpkt(u_char *inp, int inlen,
                        printer(arg, flags & EAP_TLS_FLAGS_MF ? "M":"-");
                        printer(arg, flags & EAP_TLS_FLAGS_START ? "S":"- ");
                        break;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
                case EAPT_SRP:
                        if (len < 3)
                                goto truncated;
@@ -3148,7 +3230,7 @@ eap_printpkt(u_char *inp, int inlen,
                                break;
                        }
                        break;
-#endif  /* USE_SRP */
+#endif  /* PPP_WITH_SRP */
                }
                break;
 
@@ -3173,7 +3255,7 @@ eap_printpkt(u_char *inp, int inlen,
                        }
                        break;
 
-#ifdef USE_EAPTLS
+#ifdef PPP_WITH_EAPTLS
                case EAPT_TLS:
                        if (len < 1)
                                break;
@@ -3190,7 +3272,7 @@ eap_printpkt(u_char *inp, int inlen,
                        printer(arg, flags & EAP_TLS_FLAGS_START ? "S":"- ");
 
                        break;
-#endif /* USE_EAPTLS */
+#endif /* PPP_WITH_EAPTLS */
 
                case EAPT_NAK:
                        if (len <= 0) {
@@ -3229,7 +3311,7 @@ eap_printpkt(u_char *inp, int inlen,
                        }
                        break;
 
-#ifdef CHAPMS
+#ifdef PPP_WITH_CHAPMS
                case EAPT_MSCHAPV2:
                        if (len <= 0)
                                break;
@@ -3272,9 +3354,9 @@ eap_printpkt(u_char *inp, int inlen,
                                break;
                        }
                        break;
-#endif /* CHAPMS */
+#endif /* PPP_WITH_CHAPMS */
 
-#ifdef USE_SRP
+#ifdef PPP_WITH_SRP
                case EAPT_SRP:
                        if (len < 1)
                                goto truncated;
@@ -3319,7 +3401,7 @@ eap_printpkt(u_char *inp, int inlen,
                                break;
                        }
                        break;
-#endif  /* USE_SRP */
+#endif  /* PPP_WITH_SRP */
                }
                break;