18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * chap-new.c - New CHAP implementation.
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (c) 2003 Paul Mackerras. All rights reserved.
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Redistribution and use in source and binary forms, with or without
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * modification, are permitted provided that the following conditions
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * are met:
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 2. The name(s) of the authors of this software must not be used to
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    endorse or promote products derived from this software without
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    prior written permission.
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3. Redistributions of any form whatsoever must retain the following
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    acknowledgment:
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *    "This product includes software developed by Paul Mackerras
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *     <paulus@samba.org>".
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * CHAP packets begin with a standard header with code, id, len (2 bytes).
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_HDRLEN	4
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Values for the code field.
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_CHALLENGE	1
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_RESPONSE	2
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_SUCCESS	3
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_FAILURE	4
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * CHAP digest codes.
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_MD5		5
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_MICROSOFT		0x80
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_MICROSOFT_V2	0x81
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Semi-arbitrary limits on challenge and response fields.
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAX_CHALLENGE_LEN	64
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MAX_RESPONSE_LEN	64
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* bitmask of supported algorithms */
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MDTYPE_MICROSOFT_V2	0x1
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MDTYPE_MICROSOFT	0x2
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MDTYPE_MD5		0x4
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define MDTYPE_NONE		0
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* hashes supported by this instance of pppd */
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern int chap_mdtype_all;
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Return the digest alg. ID for the most preferred digest type. */
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_DIGEST(mdtype) \
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((mdtype) & MDTYPE_MICROSOFT_V2)? CHAP_MICROSOFT_V2: \
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((mdtype) & MDTYPE_MICROSOFT)? CHAP_MICROSOFT: \
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    0
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Return the bit flag (lsb set) for our most preferred digest type. */
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_MDTYPE(mdtype) ((mdtype) ^ ((mdtype) - 1)) & (mdtype)
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Return the bit flag for a given digest algorithm ID. */
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_MDTYPE_D(digest) \
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((digest) == CHAP_MICROSOFT_V2)? MDTYPE_MICROSOFT_V2: \
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((digest) == CHAP_MICROSOFT)? MDTYPE_MICROSOFT: \
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((digest) == CHAP_MD5)? MDTYPE_MD5: \
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    0
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Can we do the requested digest? */
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define CHAP_CANDIGEST(mdtype, digest) \
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((digest) == CHAP_MICROSOFT_V2)? (mdtype) & MDTYPE_MICROSOFT_V2: \
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((digest) == CHAP_MICROSOFT)? (mdtype) & MDTYPE_MICROSOFT: \
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    0
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The code for each digest type has to supply one of these.
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct chap_digest_type {
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int code;
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Note: challenge and response arguments below are formatted as
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * a length byte followed by the actual challenge/response data.
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	void (*generate_challenge)(unsigned char *challenge);
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int (*verify_response)(int id, char *name,
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		unsigned char *secret, int secret_len,
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		unsigned char *challenge, unsigned char *response,
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		char *message, int message_space);
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	void (*make_response)(unsigned char *response, int id, char *our_name,
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		unsigned char *challenge, char *secret, int secret_len,
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		unsigned char *priv);
1081286c078a4b93695b3812e8c7fe7918c28ea18b4Adam Langley	int (*check_success)(int id, unsigned char *pkt, int len);
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	void (*handle_failure)(unsigned char *pkt, int len);
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct chap_digest_type *next;
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Hook for a plugin to validate CHAP challenge */
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern int (*chap_verify_hook)(char *name, char *ourname, int id,
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			struct chap_digest_type *digest,
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			unsigned char *challenge, unsigned char *response,
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			char *message, int message_space);
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Called by digest code to register a digest type */
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern void chap_register_digest(struct chap_digest_type *);
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Called by authentication code to start authenticating the peer. */
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern void chap_auth_peer(int unit, char *our_name, int digest_code);
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Called by auth. code to start authenticating us to the peer. */
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern void chap_auth_with_peer(int unit, char *our_name, int digest_code);
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Represents the CHAP protocol to the main pppd code */
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern struct protent chap_protent;
131