Merge from vendor branch TNF:
[pkgsrcv2.git] / net / ppp-mppe / patches / patch-bm
1 $NetBSD$
2
3 --- pppd/lcp.c.orig     Fri Aug 13 08:46:14 1999
4 +++ pppd/lcp.c  Wed Dec  8 14:54:55 1999
5 @@ -35,6 +35,8 @@
6  
7  static const char rcsid[] = RCSID;
8  
9 +extern bool refuse_chap;
10 +
11  /*
12   * LCP-related command-line options.
13   */
14 @@ -277,19 +279,47 @@
15      wo->asyncmap = 0;
16      wo->neg_chap = 0;                  /* Set to 1 on server */
17      wo->neg_upap = 0;                  /* Set to 1 on server */
18 +    wo->use_digest = 1;
19 +#ifdef CHAPMS
20 +    if(wo->use_chapms_v2)
21 +       wo->chap_mdtype = CHAP_MICROSOFT_V2;
22 +    else if(wo->use_chapms)
23 +       wo->chap_mdtype = CHAP_MICROSOFT;
24 +    else
25 +#endif
26 +    if(wo->use_digest)
27      wo->chap_mdtype = CHAP_DIGEST_MD5;
28 +    else
29 +       refuse_chap = 1;
30      wo->neg_magicnumber = 1;
31      wo->neg_pcompression = 1;
32      wo->neg_accompression = 1;
33      wo->neg_lqr = 0;                   /* no LQR implementation yet */
34 +#ifdef CBCP_SUPPORT
35 +    wo->neg_cbcp = 1;
36 +#else
37      wo->neg_cbcp = 0;
38 +#endif
39  
40      ao->neg_mru = 1;
41      ao->mru = MAXMRU;
42      ao->neg_asyncmap = 1;
43      ao->asyncmap = 0;
44      ao->neg_chap = 1;
45 +    ao->use_digest = 1;
46 +#ifdef CHAPMS
47 +    ao->use_chapms_v2 = ao->use_chapms = 1;
48 +    if(ao->use_chapms_v2)
49 +       ao->chap_mdtype = CHAP_MICROSOFT_V2;
50 +    else if(ao->use_chapms)
51 +       ao->chap_mdtype = CHAP_MICROSOFT;
52 +    else
53 +#else
54 +    if(ao->use_digest)
55      ao->chap_mdtype = CHAP_DIGEST_MD5;
56 +    else
57 +       refuse_chap = 1;
58 +#endif
59      ao->neg_upap = 1;
60      ao->neg_magicnumber = 1;
61      ao->neg_pcompression = 1;
62 @@ -557,6 +587,18 @@
63       * NB: we only ask for one of CHAP and UPAP, even if we will
64       * accept either.
65       */
66 +#ifdef CHAPMS
67 +    if(go->use_chapms_v2)
68 +       go->chap_mdtype = CHAP_MICROSOFT_V2;
69 +    else if(go->use_chapms)
70 +       go->chap_mdtype = CHAP_MICROSOFT;
71 +    else
72 +#endif
73 +    if(go->use_digest)
74 +       go->chap_mdtype = CHAP_DIGEST_MD5;
75 +    else
76 +       go->neg_chap = 0;
77 +
78      return (LENCISHORT(go->neg_mru && go->mru != DEFMRU) +
79             LENCILONG(go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF) +
80             LENCICHAP(go->neg_chap) +
81 @@ -922,7 +964,34 @@
82                  * algorithm.  If they can't do MD5, we'll have to stop
83                  * asking for CHAP.
84                  */
85 -               if (cichar != go->chap_mdtype)
86 +               if (go->chap_mdtype == CHAP_MICROSOFT_V2)
87 +               {
88 +                   try.use_chapms_v2 = 0;
89 +                   if(try.use_chapms)
90 +                       try.chap_mdtype = CHAP_MICROSOFT;
91 +                   else if(try.use_digest)
92 +                       try.chap_mdtype = CHAP_DIGEST_MD5;
93 +                   else
94 +                       try.neg_chap = 0;
95 +               }
96 +               else if(go->chap_mdtype == CHAP_MICROSOFT)
97 +               {
98 +                   try.use_chapms = 0;
99 +                   if(try.use_digest)
100 +                       try.chap_mdtype = CHAP_DIGEST_MD5;
101 +                   else
102 +                       try.neg_chap = 0;
103 +               }
104 +               else if(go->chap_mdtype == CHAP_DIGEST_MD5)
105 +               {
106 +                   try.use_digest = 0;
107 +                   try.neg_chap = 0;
108 +               }
109 +               else
110 +                   try.neg_chap = 0;
111 +               if ((cichar != CHAP_MICROSOFT_V2) &&
112 +                   (cichar != CHAP_MICROSOFT) &&
113 +                   (cichar != CHAP_DIGEST_MD5))
114                     try.neg_chap = 0;
115             } else {
116                 /*
117 @@ -1133,8 +1202,22 @@
118         /* Check rejected value. */ \
119         if (cishort != val || cichar != digest) \
120             goto bad; \
121 +       switch(digest) \
122 +       { \
123 +           case CHAP_MICROSOFT_V2: \
124 +               try.use_chapms_v2 = 0; \
125 +               break; \
126 +           case CHAP_MICROSOFT: \
127 +               try.use_chapms = 0; \
128 +               break; \
129 +           case CHAP_DIGEST_MD5: \
130 +               try.use_digest = 0; \
131 +       } \
132 +       if(!try.use_chapms_v2 && !try.use_chapms && !try.use_digest) \
133 +       { \
134         try.neg = 0; \
135         try.neg_upap = 0; \
136 +       } \
137      }
138  #define REJCILONG(opt, neg, val) \
139      if (go->neg && \
140 @@ -1370,9 +1453,10 @@
141                 if (cichar != CHAP_DIGEST_MD5
142  #ifdef CHAPMS
143                     && cichar != CHAP_MICROSOFT
144 +                   && cichar != CHAP_MICROSOFT_V2
145  #endif
146                     ) {
147 -                   orc = CONFNAK;
148 +                   orc = CONFREJ; /* !!! CONFNAK !!! */
149                     PUTCHAR(CI_AUTHTYPE, nakp);
150                     PUTCHAR(CILEN_CHAP, nakp);
151                     PUTSHORT(PPP_CHAP, nakp);
152 @@ -1449,6 +1533,23 @@
153             ho->magicnumber = cilong;
154             break;
155  
156 +#ifdef CBCP_SUPPORT
157 +       case CI_CALLBACK:
158 +           LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd CBCP"));
159 +           if (!ao->neg_cbcp ||
160 +               cilen != CILEN_CHAR) {
161 +               orc = CONFREJ;
162 +               break;
163 +           }
164 +           GETCHAR(cichar, p);
165 +           if(cichar != CBCP_OPT)
166 +           {
167 +               orc = CONFREJ;
168 +               break;
169 +           }
170 +           ho->neg_cbcp = 1;
171 +           break;
172 +#endif
173  
174         case CI_PCOMPRESSION:
175             if (!ao->neg_pcompression ||
176 @@ -1721,20 +1822,23 @@
177                     }
178                 }
179                 break;
180 +#ifdef CBCP_SUPPORT
181             case CI_CALLBACK:
182 -               if (olen >= CILEN_CHAR) {
183 +               if (olen == CILEN_CHAR) {
184 +                   u_char cichar;
185                     p += 2;
186                     printer(arg, "callback ");
187 -                   GETCHAR(cishort, p);
188 -                   switch (cishort) {
189 +                   GETCHAR(cichar, p);
190 +                   switch (cichar) {
191                     case CBCP_OPT:
192                         printer(arg, "CBCP");
193                         break;
194                     default:
195 -                       printer(arg, "0x%x", cishort);
196 +                       printer(arg, "0x%x", cichar);
197                     }
198                 }
199                 break;
200 +#endif
201             case CI_MAGICNUMBER:
202                 if (olen == CILEN_LONG) {
203                     p += 2;