From c9c2783223e0a4f6a2b708141b4097df61333d16 Mon Sep 17 00:00:00 2001 From: brian Date: Tue, 7 Nov 2000 23:32:05 +0000 Subject: Pass the correct option data to the compression modules Init function rather than the data associated with the first protocol REQuested. Initiate MPPE session keys correctly based on whether we're client or server --- usr.sbin/ppp/ppp/ccp.c | 25 ++++++++++++++++++++++--- usr.sbin/ppp/ppp/ccp.h | 6 +++--- usr.sbin/ppp/ppp/chap.c | 15 +++++++++------ usr.sbin/ppp/ppp/mppe.c | 9 ++++++--- usr.sbin/ppp/ppp/mppe.h | 3 ++- 5 files changed, 42 insertions(+), 16 deletions(-) (limited to 'usr.sbin/ppp') diff --git a/usr.sbin/ppp/ppp/ccp.c b/usr.sbin/ppp/ppp/ccp.c index 7a98e451b08..6c58c8edd34 100644 --- a/usr.sbin/ppp/ppp/ccp.c +++ b/usr.sbin/ppp/ppp/ccp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $OpenBSD: ccp.c,v 1.15 2000/11/02 00:54:33 brian Exp $ + * $OpenBSD: ccp.c,v 1.16 2000/11/07 23:32:04 brian Exp $ * * TODO: * o Support other compression protocols @@ -376,7 +376,20 @@ static void CcpLayerFinish(struct fsm *fp) { /* We're now down */ + struct ccp *ccp = fsm2ccp(fp); + struct ccp_opt *next; + log_Printf(LogCCP, "%s: LayerFinish.\n", fp->link->name); + + /* + * Nuke options that may be left over from sending a REQ but never + * coming up. + */ + while (ccp->out.opt) { + next = ccp->out.opt->next; + free(ccp->out.opt); + ccp->out.opt = next; + } } /* Called when CCP has reached the OPEN state */ @@ -385,6 +398,8 @@ CcpLayerUp(struct fsm *fp) { /* We're now up */ struct ccp *ccp = fsm2ccp(fp); + struct ccp_opt **o; + int f; log_Printf(LogCCP, "%s: LayerUp.\n", fp->link->name); @@ -400,10 +415,14 @@ CcpLayerUp(struct fsm *fp) } } + o = &ccp->out.opt; + for (f = 0; f < ccp->out.algorithm; f++) + if (IsEnabled(ccp->cfg.neg[algorithm[f]->Neg])) + o = &(*o)->next; + if (ccp->out.state == NULL && ccp->out.algorithm >= 0 && ccp->out.algorithm < NALGORITHMS) { - ccp->out.state = (*algorithm[ccp->out.algorithm]->o.Init) - (&ccp->out.opt->val); + ccp->out.state = (*algorithm[ccp->out.algorithm]->o.Init)(&(*o)->val); if (ccp->out.state == NULL) { log_Printf(LogERROR, "%s: %s (out) initialisation failure\n", fp->link->name, protoname(ccp->my_proto)); diff --git a/usr.sbin/ppp/ppp/ccp.h b/usr.sbin/ppp/ppp/ccp.h index 95f3ff15c06..5127a33614e 100644 --- a/usr.sbin/ppp/ppp/ccp.h +++ b/usr.sbin/ppp/ppp/ccp.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $OpenBSD: ccp.h,v 1.6 2000/11/02 00:54:33 brian Exp $ + * $OpenBSD: ccp.h,v 1.7 2000/11/07 23:32:04 brian Exp $ * * TODO: */ @@ -82,13 +82,13 @@ struct ccp { struct { int algorithm; /* Algorithm in use */ void *state; /* Returned by implementations Init() */ - struct lcp_opt opt; /* Set by implementations OptInit() */ + struct lcp_opt opt; /* Set by implementation's OptInit() */ } in; struct { int algorithm; /* Algorithm in use */ void *state; /* Returned by implementations Init() */ - struct ccp_opt *opt; /* Set by implementations OptInit() */ + struct ccp_opt *opt; /* Set by implementation's OptInit() */ } out; u_int32_t his_reject; /* Request codes rejected by peer */ diff --git a/usr.sbin/ppp/ppp/chap.c b/usr.sbin/ppp/ppp/chap.c index c7cad849796..53c778ec53c 100644 --- a/usr.sbin/ppp/ppp/chap.c +++ b/usr.sbin/ppp/ppp/chap.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $OpenBSD: chap.c,v 1.24 2000/11/02 00:54:33 brian Exp $ + * $OpenBSD: chap.c,v 1.25 2000/11/07 23:32:04 brian Exp $ * * TODO: */ @@ -203,7 +203,7 @@ chap_BuildAnswer(char *name, char *key, u_char id, char *challenge, u_char type expkey, klen * 2, ntresponse); /* Generate MPPE MASTERKEY */ - GetMasterKey(pwdhashhash, ntresponse, MPPE_MasterKey); + GetMasterKey(pwdhashhash, ntresponse, MPPE_MasterKey); /* XXX Global ! */ /* Generate AUTHRESPONSE to verify on auth success */ GenerateAuthenticatorResponse(expkey, klen * 2, ntresponse, @@ -371,6 +371,7 @@ chap_Respond(struct chap *chap, char *name, char *key, u_char type ans, *ans + 1 + strlen(name), name); #ifdef HAVE_DES chap->NTRespSent = !lm; + MPPE_IsServer = 0; /* XXX Global ! */ #endif free(ans); } else @@ -536,7 +537,7 @@ chap_Success(struct authinfo *authp) #ifdef HAVE_DES if (authp->physical->link.lcp.want_authtype == 0x81) { msg = auth2chap(authp)->authresponse; - MPPE_MasterKeyValid = 1; + MPPE_MasterKeyValid = 1; /* XXX Global ! */ } else #endif msg = "Welcome!!"; @@ -857,9 +858,11 @@ chap_Input(struct bundle *bundle, struct link *l, struct mbuf *bp) p->link.lcp.want_authtype #ifdef HAVE_DES , chap->challenge.peer, - chap->authresponse, lanman -#endif + chap->authresponse, lanman); + MPPE_IsServer = 1; /* XXX Global ! */ +#else ); +#endif if (myans == NULL) key = NULL; else { @@ -896,7 +899,7 @@ chap_Input(struct bundle *bundle, struct link *l, struct mbuf *bp) } else { /* Successful login */ - MPPE_MasterKeyValid = 1; + MPPE_MasterKeyValid = 1; /* XXX Global ! */ datalink_AuthOk(p->dl); } } else diff --git a/usr.sbin/ppp/ppp/mppe.c b/usr.sbin/ppp/ppp/mppe.c index 275c6057edf..daad8b2295c 100644 --- a/usr.sbin/ppp/ppp/mppe.c +++ b/usr.sbin/ppp/ppp/mppe.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $OpenBSD: mppe.c,v 1.1 2000/11/02 00:54:34 brian Exp $ + * $OpenBSD: mppe.c,v 1.2 2000/11/07 23:32:04 brian Exp $ */ #include @@ -67,6 +67,7 @@ struct mppe_state { }; int MPPE_MasterKeyValid = 0; +int MPPE_IsServer = 0; char MPPE_MasterKey[MPPE_KEY_LEN]; static void @@ -340,7 +341,8 @@ MPPEInitInput(struct lcp_opt *o) log_Printf(LogDEBUG, "MPPE: InitInput: %d-bits\n", mip->keybits); - GetAsymetricStartKey(MPPE_MasterKey, mip->mastkey, mip->keylen, 0, 0); + GetAsymetricStartKey(MPPE_MasterKey, mip->mastkey, mip->keylen, 0, + MPPE_IsServer); GetNewKeyFromSHA(mip->mastkey, mip->mastkey, mip->keylen, mip->sesskey); MPPEReduceSessionKey(mip); @@ -381,7 +383,8 @@ MPPEInitOutput(struct lcp_opt *o) log_Printf(LogDEBUG, "MPPE: InitOutput: %d-bits\n", mop->keybits); - GetAsymetricStartKey(MPPE_MasterKey, mop->mastkey, mop->keylen, 1, 0); + GetAsymetricStartKey(MPPE_MasterKey, mop->mastkey, mop->keylen, 1, + MPPE_IsServer); GetNewKeyFromSHA(mop->mastkey, mop->mastkey, mop->keylen, mop->sesskey); MPPEReduceSessionKey(mop); diff --git a/usr.sbin/ppp/ppp/mppe.h b/usr.sbin/ppp/ppp/mppe.h index 499da5e0059..8e868791791 100644 --- a/usr.sbin/ppp/ppp/mppe.h +++ b/usr.sbin/ppp/ppp/mppe.h @@ -23,10 +23,11 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $OpenBSD: mppe.h,v 1.1 2000/11/02 00:54:34 brian Exp $ + * $OpenBSD: mppe.h,v 1.2 2000/11/07 23:32:04 brian Exp $ */ #define MPPE_KEY_LEN 16 extern const struct ccp_algorithm MPPEAlgorithm; extern int MPPE_MasterKeyValid; +extern int MPPE_IsServer; extern char MPPE_MasterKey[]; -- cgit v1.2.3