Patch from Frank Cusack to add support for MSCHAPv2.
[ppp.git] / pppd / chap.h
1 /*
2  * chap.h - Challenge Handshake Authentication Protocol definitions.
3  *
4  * Copyright (c) 1993 The Australian National University.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms are permitted
8  * provided that the above copyright notice and this paragraph are
9  * duplicated in all such forms and that any documentation,
10  * advertising materials, and other materials related to such
11  * distribution and use acknowledge that the software was developed
12  * by the Australian National University.  The name of the University
13  * may not be used to endorse or promote products derived from this
14  * software without specific prior written permission.
15  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18  *
19  * Copyright (c) 1991 Gregory M. Christy
20  * All rights reserved.
21  *
22  * Redistribution and use in source and binary forms are permitted
23  * provided that the above copyright notice and this paragraph are
24  * duplicated in all such forms and that any documentation,
25  * advertising materials, and other materials related to such
26  * distribution and use acknowledge that the software was developed
27  * by the author.
28  *
29  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
30  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
31  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
32  *
33  * $Id: chap.h,v 1.12 2002/04/02 13:54:59 dfs Exp $
34  */
35
36 #ifndef __CHAP_INCLUDE__
37
38 /* Code + ID + length */
39 #define CHAP_HEADERLEN          4
40
41 /*
42  * CHAP codes.
43  */
44
45 #define CHAP_DIGEST_MD5         5       /* use MD5 algorithm */
46 #define MD5_SIGNATURE_SIZE      16      /* 16 bytes in a MD5 message digest */
47 #define CHAP_MICROSOFT          0x80    /* use Microsoft-compatible alg. */
48 #define CHAP_MICROSOFT_V2       0x81    /* use Microsoft-compatible alg. */
49
50 /*
51  * Digest type and selection.
52  */
53
54 /* bitmask of supported algorithms */
55 #define MDTYPE_MD5              0x1
56 #define MDTYPE_MICROSOFT_V2     0x2
57 #define MDTYPE_MICROSOFT        0x4
58
59 #ifdef CHAPMS
60 #define MDTYPE_ALL (MDTYPE_MD5 | MDTYPE_MICROSOFT_V2 | MDTYPE_MICROSOFT)
61 #else
62 #define MDTYPE_ALL (MDTYPE_MD5)
63 #endif
64 #define MDTYPE_NONE 0
65
66 /* Return the digest alg. ID for the most preferred digest type. */
67 #define CHAP_DIGEST(mdtype) \
68     ((mdtype) & MDTYPE_MD5)? CHAP_DIGEST_MD5: \
69     ((mdtype) & MDTYPE_MICROSOFT_V2)? CHAP_MICROSOFT_V2: \
70     ((mdtype) & MDTYPE_MICROSOFT)? CHAP_MICROSOFT: \
71     0
72
73 /* Return the bit flag (lsb set) for our most preferred digest type. */
74 #define CHAP_MDTYPE(mdtype) ((mdtype) ^ ((mdtype) - 1)) & (mdtype)
75
76 /* Return the bit flag for a given digest algorithm ID. */
77 #define CHAP_MDTYPE_D(digest) \
78     ((digest) == CHAP_DIGEST_MD5)? MDTYPE_MD5: \
79     ((digest) == CHAP_MICROSOFT_V2)? MDTYPE_MICROSOFT_V2: \
80     ((digest) == CHAP_MICROSOFT)? MDTYPE_MICROSOFT: \
81     0
82
83 /* Can we do the requested digest? */
84 #define CHAP_CANDIGEST(mdtype, digest) \
85     ((digest) == CHAP_DIGEST_MD5)? (mdtype) & MDTYPE_MD5: \
86     ((digest) == CHAP_MICROSOFT_V2)? (mdtype) & MDTYPE_MICROSOFT_V2: \
87     ((digest) == CHAP_MICROSOFT)? (mdtype) & MDTYPE_MICROSOFT: \
88     0
89
90 #define CHAP_CHALLENGE          1
91 #define CHAP_RESPONSE           2
92 #define CHAP_SUCCESS            3
93 #define CHAP_FAILURE            4
94
95 /*
96  *  Challenge lengths (for challenges we send) and other limits.
97  */
98 #define MIN_CHALLENGE_LENGTH    16
99 #define MAX_CHALLENGE_LENGTH    24      /* sufficient for MS-CHAP Peer Chal. */
100 #define MAX_RESPONSE_LENGTH     64      /* sufficient for MD5 or MS-CHAP */
101 #define MS_AUTH_RESPONSE_LENGTH 40      /* MS-CHAPv2 authenticator response, */
102                                         /* as ASCII */
103
104 /*
105  * Each interface is described by a chap structure.
106  */
107
108 typedef struct chap_state {
109     int unit;                   /* Interface unit number */
110     int clientstate;            /* Client state */
111     int serverstate;            /* Server state */
112     u_char challenge[MAX_CHALLENGE_LENGTH]; /* last challenge string sent */
113     u_char chal_len;            /* challenge length */
114     u_char chal_id;             /* ID of last challenge */
115     u_char chal_type;           /* hash algorithm for challenges */
116     u_char id;                  /* Current id */
117     char *chal_name;            /* Our name to use with challenge */
118     int chal_interval;          /* Time until we challenge peer again */
119     int timeouttime;            /* Timeout time in seconds */
120     int max_transmits;          /* Maximum # of challenge transmissions */
121     int chal_transmits;         /* Number of transmissions of challenge */
122     int resp_transmits;         /* Number of transmissions of response */
123     u_char response[MAX_RESPONSE_LENGTH];       /* Response to send */
124     char saresponse[MS_AUTH_RESPONSE_LENGTH+1]; /* Auth response to send */
125     char earesponse[MS_AUTH_RESPONSE_LENGTH+1]; /* Auth response expected */
126                                                 /* +1 for null terminator */
127     u_char resp_length;         /* length of response */
128     u_char resp_id;             /* ID for response messages */
129     u_char resp_type;           /* hash algorithm for responses */
130     char *resp_name;            /* Our name to send with response */
131 } chap_state;
132
133 /* We need the declaration of chap_state to use this prototype */
134 extern int (*chap_auth_hook) __P((char *user, u_char *remmd,
135                                   int remmd_len, chap_state *cstate));
136
137 /*
138  * Client (peer) states.
139  */
140 #define CHAPCS_INITIAL          0       /* Lower layer down, not opened */
141 #define CHAPCS_CLOSED           1       /* Lower layer up, not opened */
142 #define CHAPCS_PENDING          2       /* Auth us to peer when lower up */
143 #define CHAPCS_LISTEN           3       /* Listening for a challenge */
144 #define CHAPCS_RESPONSE         4       /* Sent response, waiting for status */
145 #define CHAPCS_OPEN             5       /* We've received Success */
146
147 /*
148  * Server (authenticator) states.
149  */
150 #define CHAPSS_INITIAL          0       /* Lower layer down, not opened */
151 #define CHAPSS_CLOSED           1       /* Lower layer up, not opened */
152 #define CHAPSS_PENDING          2       /* Auth peer when lower up */
153 #define CHAPSS_INITIAL_CHAL     3       /* We've sent the first challenge */
154 #define CHAPSS_OPEN             4       /* We've sent a Success msg */
155 #define CHAPSS_RECHALLENGE      5       /* We've sent another challenge */
156 #define CHAPSS_BADAUTH          6       /* We've sent a Failure msg */
157
158 /*
159  * Timeouts.
160  */
161 #define CHAP_DEFTIMEOUT         3       /* Timeout time in seconds */
162 #define CHAP_DEFTRANSMITS       10      /* max # times to send challenge */
163
164 extern chap_state chap[];
165
166 void ChapAuthWithPeer __P((int, char *, int));
167 void ChapAuthPeer __P((int, char *, int));
168
169 extern struct protent chap_protent;
170
171 #define __CHAP_INCLUDE__
172 #endif /* __CHAP_INCLUDE__ */