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