32 #if PPP_SUPPORT && CHAP_SUPPORT   
   47 #define CHAP_CHALLENGE  1 
   48 #define CHAP_RESPONSE   2 
   49 #define CHAP_SUCCESS    3 
   50 #define CHAP_FAILURE    4 
   57 #define CHAP_MICROSOFT          0x80 
   58 #define CHAP_MICROSOFT_V2       0x81 
   64 #define MAX_CHALLENGE_LEN       64 
   65 #define MAX_RESPONSE_LEN        64 
   71 #define CHAL_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_CHALLENGE_LEN + MAXNAMELEN) 
   72 #define RESP_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_RESPONSE_LEN + MAXNAMELEN) 
   76 #define MDTYPE_MICROSOFT_V2     0x1 
   77 #define MDTYPE_MICROSOFT        0x2 
   79 #define MDTYPE_MD5              0x4 
   84 #define CHAP_DIGEST(mdtype) \ 
   85     ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \ 
   86     ((mdtype) & MDTYPE_MICROSOFT_V2)? CHAP_MICROSOFT_V2: \ 
   87     ((mdtype) & MDTYPE_MICROSOFT)? CHAP_MICROSOFT: \ 
   90 #define CHAP_DIGEST(mdtype) \ 
   91     ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \ 
   96 #define CHAP_MDTYPE(mdtype) ((mdtype) ^ ((mdtype) - 1)) & (mdtype) 
  100 #define CHAP_MDTYPE_D(digest) \ 
  101     ((digest) == CHAP_MICROSOFT_V2)? MDTYPE_MICROSOFT_V2: \ 
  102     ((digest) == CHAP_MICROSOFT)? MDTYPE_MICROSOFT: \ 
  103     ((digest) == CHAP_MD5)? MDTYPE_MD5: \ 
  106 #define CHAP_MDTYPE_D(digest) \ 
  107     ((digest) == CHAP_MD5)? MDTYPE_MD5: \ 
  113 #define CHAP_CANDIGEST(mdtype, digest) \ 
  114     ((digest) == CHAP_MICROSOFT_V2)? (mdtype) & MDTYPE_MICROSOFT_V2: \ 
  115     ((digest) == CHAP_MICROSOFT)? (mdtype) & MDTYPE_MICROSOFT: \ 
  116     ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \ 
  119 #define CHAP_CANDIGEST(mdtype, digest) \ 
  120     ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \ 
  127 struct chap_digest_type {
 
  135         void (*generate_challenge)(ppp_pcb *pcb, 
unsigned char *challenge);
 
  136         int (*verify_response)(ppp_pcb *pcb, 
int id, 
const char *
name,
 
  137                 const unsigned char *secret, 
int secret_len,
 
  138                 const unsigned char *challenge, 
const unsigned char *response,
 
  139                 char *message, 
int message_space);
 
  141         void (*make_response)(ppp_pcb *pcb, 
unsigned char *response, 
int id, 
const char *our_name,
 
  142                 const unsigned char *challenge, 
const char *secret, 
int secret_len,
 
  143                 unsigned char *priv);
 
  144         int (*check_success)(ppp_pcb *pcb, 
unsigned char *pkt, 
int len, 
unsigned char *priv);
 
  145         void (*handle_failure)(ppp_pcb *pcb, 
unsigned char *pkt, 
int len);
 
  152 typedef struct chap_client_state {
 
  155         const struct chap_digest_type *digest;
 
  156         unsigned char priv[64];         
 
  160 typedef struct chap_server_state {
 
  164         const struct chap_digest_type *digest;
 
  166         int challenge_pktlen;
 
  167         unsigned char challenge[CHAL_MAX_PKTLEN];
 
  174 extern int (*chap_verify_hook)(
char *
name, 
char *ourname, 
int id,
 
  175                         const struct chap_digest_type *digest,
 
  176                         unsigned char *challenge, 
unsigned char *response,
 
  177                         char *message, 
int message_space);
 
  182 extern void chap_auth_peer(ppp_pcb *pcb, 
const char *our_name, 
int digest_code);
 
  186 extern void chap_auth_with_peer(ppp_pcb *pcb, 
const char *our_name, 
int digest_code);
 
  189 extern const struct protent chap_protent;