• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/accel-pptp/src/pppd/
1/*
2 * chap-new.c - New CHAP implementation.
3 *
4 * Copyright (c) 2003 Paul Mackerras. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 *
13 * 2. The name(s) of the authors of this software must not be used to
14 *    endorse or promote products derived from this software without
15 *    prior written permission.
16 *
17 * 3. Redistributions of any form whatsoever must retain the following
18 *    acknowledgment:
19 *    "This product includes software developed by Paul Mackerras
20 *     <paulus@samba.org>".
21 *
22 * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
23 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
24 * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
25 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
26 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
27 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
28 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
29 */
30
31/*
32 * CHAP packets begin with a standard header with code, id, len (2 bytes).
33 */
34#define CHAP_HDRLEN	4
35
36/*
37 * Values for the code field.
38 */
39#define CHAP_CHALLENGE	1
40#define CHAP_RESPONSE	2
41#define CHAP_SUCCESS	3
42#define CHAP_FAILURE	4
43
44/*
45 * CHAP digest codes.
46 */
47#define CHAP_MD5		5
48#define CHAP_MICROSOFT		0x80
49#define CHAP_MICROSOFT_V2	0x81
50
51/*
52 * Semi-arbitrary limits on challenge and response fields.
53 */
54#define MAX_CHALLENGE_LEN	64
55#define MAX_RESPONSE_LEN	64
56
57/* bitmask of supported algorithms */
58#define MDTYPE_MICROSOFT_V2	0x1
59#define MDTYPE_MD5		0x2
60#define MDTYPE_MICROSOFT	0x4
61#define MDTYPE_NONE		0
62
63/* hashes supported by this instance of pppd */
64extern int chap_mdtype_all;
65
66/* Return the digest alg. ID for the most preferred digest type. */
67#define CHAP_DIGEST(mdtype) \
68    ((mdtype) & MDTYPE_MICROSOFT_V2)? CHAP_MICROSOFT_V2: \
69    ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \
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_MICROSOFT_V2)? MDTYPE_MICROSOFT_V2: \
79    ((digest) == CHAP_MICROSOFT)? MDTYPE_MICROSOFT: \
80    ((digest) == CHAP_MD5)? MDTYPE_MD5: \
81    0
82
83/* Can we do the requested digest? */
84#define CHAP_CANDIGEST(mdtype, digest) \
85    ((digest) == CHAP_MICROSOFT_V2)? (mdtype) & MDTYPE_MICROSOFT_V2: \
86    ((digest) == CHAP_MICROSOFT)? (mdtype) & MDTYPE_MICROSOFT: \
87    ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \
88    0
89
90/*
91 * The code for each digest type has to supply one of these.
92 */
93struct chap_digest_type {
94	int code;
95
96	/*
97	 * Note: challenge and response arguments below are formatted as
98	 * a length byte followed by the actual challenge/response data.
99	 */
100	void (*generate_challenge)(unsigned char *challenge);
101	int (*verify_response)(int id, char *name,
102		unsigned char *secret, int secret_len,
103		unsigned char *challenge, unsigned char *response,
104		char *message, int message_space);
105	void (*make_response)(unsigned char *response, int id, char *our_name,
106		unsigned char *challenge, char *secret, int secret_len);
107	int (*check_success)(int id, unsigned char *pkt, int len);
108	void (*handle_failure)(unsigned char *pkt, int len);
109
110	struct chap_digest_type *next;
111};
112
113/* Hook for a plugin to validate CHAP challenge */
114extern int (*chap_verify_hook)(char *name, char *ourname, int id,
115			struct chap_digest_type *digest,
116			unsigned char *challenge, unsigned char *response,
117			char *message, int message_space);
118
119/* Called by digest code to register a digest type */
120extern void chap_register_digest(struct chap_digest_type *);
121
122/* Called by authentication code to start authenticating the peer. */
123extern void chap_auth_peer(int unit, char *our_name, int digest_code);
124
125/* Called by auth. code to start authenticating us to the peer. */
126extern void chap_auth_with_peer(int unit, char *our_name, int digest_code);
127
128/* Represents the CHAP protocol to the main pppd code */
129extern struct protent chap_protent;
130