Annotation of embedaddon/libpdel/ppp/ppp_auth.h, revision 1.1

1.1     ! misho       1: 
        !             2: /*
        !             3:  * Copyright (c) 2001-2002 Packet Design, LLC.
        !             4:  * All rights reserved.
        !             5:  * 
        !             6:  * Subject to the following obligations and disclaimer of warranty,
        !             7:  * use and redistribution of this software, in source or object code
        !             8:  * forms, with or without modifications are expressly permitted by
        !             9:  * Packet Design; provided, however, that:
        !            10:  * 
        !            11:  *    (i)  Any and all reproductions of the source or object code
        !            12:  *         must include the copyright notice above and the following
        !            13:  *         disclaimer of warranties; and
        !            14:  *    (ii) No rights are granted, in any manner or form, to use
        !            15:  *         Packet Design trademarks, including the mark "PACKET DESIGN"
        !            16:  *         on advertising, endorsements, or otherwise except as such
        !            17:  *         appears in the above copyright notice or in the software.
        !            18:  * 
        !            19:  * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
        !            20:  * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
        !            21:  * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
        !            22:  * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
        !            23:  * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
        !            24:  * OR NON-INFRINGEMENT.  PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
        !            25:  * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
        !            26:  * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
        !            27:  * RELIABILITY OR OTHERWISE.  IN NO EVENT SHALL PACKET DESIGN BE
        !            28:  * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
        !            29:  * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
        !            30:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
        !            31:  * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
        !            32:  * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
        !            33:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            34:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
        !            35:  * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
        !            36:  * THE POSSIBILITY OF SUCH DAMAGE.
        !            37:  *
        !            38:  * Author: Archie Cobbs <archie@freebsd.org>
        !            39:  */
        !            40: 
        !            41: #ifndef _PDEL_PPP_PPP_AUTH_H_
        !            42: #define _PDEL_PPP_PPP_AUTH_H_
        !            43: 
        !            44: struct ppp_auth_config;
        !            45: struct ppp_fsm_option;
        !            46: struct ppp_link;
        !            47: struct ppp_log;
        !            48: 
        !            49: /* Types of authentication (in reverse order of preference) */
        !            50: enum ppp_auth_index {
        !            51:        PPP_AUTH_NONE = 0,
        !            52:        PPP_AUTH_PAP,
        !            53:        PPP_AUTH_CHAP_MSV1,
        !            54:        PPP_AUTH_CHAP_MSV2,
        !            55:        PPP_AUTH_CHAP_MD5,
        !            56:        PPP_AUTH_MAX
        !            57: };
        !            58: 
        !            59: #ifndef MD5_DIGEST_LENGTH
        !            60: #define MD5_DIGEST_LENGTH              16
        !            61: #endif
        !            62: 
        !            63: /* Max authorization username and password length */
        !            64: #define PPP_MAX_AUTHNAME               64
        !            65: #define PPP_MAX_AUTHPASS               64
        !            66: 
        !            67: /* Max challenge/response data length */
        !            68: #define PPP_MAX_AUTHVALUE              64
        !            69: 
        !            70: /* Microsoft stuff */
        !            71: #define PPP_MSOFT_LM_HASH_LEN          24
        !            72: #define PPP_MSOFT_NT_HASH_LEN          24
        !            73: #define PPP_MSOFTV1_CHAL_LEN           8
        !            74: #define PPP_MSOFTV2_CHAL_LEN           16
        !            75: #define PPP_MSOFT_RESP_LEN             49
        !            76: #define PPP_MSOFTV2_AUTHRESP_LEN       20
        !            77: 
        !            78: #define PPP_MPPE_DATA_MAX      MAX(PPP_MSOFTV1_CHAL_LEN, PPP_MSOFT_NT_HASH_LEN)
        !            79: 
        !            80: /***********************************************************************
        !            81:                        AUTHORIZATION CREDENTIALS
        !            82: ***********************************************************************/
        !            83: 
        !            84: /* Credentials for PAP */
        !            85: struct ppp_auth_cred_pap {
        !            86:        char            name[PPP_MAX_AUTHNAME];
        !            87:        char            password[PPP_MAX_AUTHPASS];
        !            88: };
        !            89: 
        !            90: /* Response data for MD5 CHAP */
        !            91: struct ppp_auth_cred_chap_md5 {
        !            92:        u_char          id;
        !            93:        u_char          hash[MD5_DIGEST_LENGTH];
        !            94: };
        !            95: 
        !            96: /* Response data for MSoft CHAPv1 */
        !            97: struct ppp_auth_cred_chap_msv1 {
        !            98:        u_char          lm_hash[PPP_MSOFT_LM_HASH_LEN];
        !            99:        u_char          nt_hash[PPP_MSOFT_NT_HASH_LEN];
        !           100:        u_char          use_nt;
        !           101: };
        !           102: 
        !           103: /* Response data for MSoft CHAPv2 */
        !           104: struct ppp_auth_cred_chap_msv2 {
        !           105:        u_char          peer_chal[PPP_MSOFTV2_CHAL_LEN];
        !           106:        u_char          reserved[8];
        !           107:        u_char          nt_response[PPP_MSOFT_NT_HASH_LEN];
        !           108:        u_char          flags;
        !           109: };
        !           110: 
        !           111: /* Credentials for CHAP */
        !           112: struct ppp_auth_cred_chap {
        !           113:        char            name[PPP_MAX_AUTHNAME];
        !           114:        u_char          chal_len;
        !           115:        u_char          chal_data[PPP_MAX_AUTHVALUE];
        !           116:        union {
        !           117:                struct ppp_auth_cred_chap_md5   md5;
        !           118:                struct ppp_auth_cred_chap_msv1  msv1;
        !           119:                struct ppp_auth_cred_chap_msv2  msv2;
        !           120:        }               u;
        !           121: };
        !           122: 
        !           123: /* Authorization credentials info */
        !           124: struct ppp_auth_cred {
        !           125:        enum ppp_auth_index     type;
        !           126:        union {
        !           127:                struct ppp_auth_cred_pap        pap;
        !           128:                struct ppp_auth_cred_chap       chap;
        !           129:        }               u;
        !           130: };
        !           131: 
        !           132: /***********************************************************************
        !           133:                        AUTHORIZATION RESPONSE
        !           134: ***********************************************************************/
        !           135: 
        !           136: /* Microsoft MPPE information derived from CHAP exchange */
        !           137: struct ppp_auth_mppe_chapv1 {
        !           138:        u_char          key_64[8];              /* lan-man hash (40, 56 bits) */
        !           139:        u_char          key_128[16];            /* start key (128 bits) */
        !           140: };
        !           141: 
        !           142: struct ppp_auth_mppe_chapv2 {
        !           143:        u_char          keys[2][16];            /* server xmit key is first */
        !           144: };
        !           145: 
        !           146: union ppp_auth_mppe {
        !           147:        struct ppp_auth_mppe_chapv1     msv1;
        !           148:        struct ppp_auth_mppe_chapv2     msv2;
        !           149: };
        !           150: 
        !           151: /* Authorization response info */
        !           152: struct ppp_auth_resp {
        !           153:        u_char                  authresp[PPP_MSOFTV2_AUTHRESP_LEN];
        !           154:        union ppp_auth_mppe     mppe;           /* mppe keys */
        !           155:        char                    errmsg[64];     /* error message */
        !           156: };
        !           157: 
        !           158: /***********************************************************************
        !           159:                        CREDENTIALS CALLBACKS
        !           160: ***********************************************************************/
        !           161: 
        !           162: /*
        !           163:  * Function type for acquiring credentials. Any name and/or challenge
        !           164:  * data will already be present in the credentials structure.
        !           165:  *
        !           166:  * Note: if type is PPP_AUTH_CHAP_MSV2, the caller MUST fill in the
        !           167:  * "authresp" array with the 20 byte MS-CHAPv2 authenticator response.
        !           168:  *
        !           169:  * Note: if type is PPP_AUTH_CHAP_MSV1 or PPP_AUTH_CHAP_MSV2, the caller
        !           170:  * SHOULD fill in the "mppe" structure with the MPPE key(s).
        !           171:  *
        !           172:  * Note: this function will be called in a separate thread that may
        !           173:  * be canceled at any time; it should be prepared to clean up if so.
        !           174:  *
        !           175:  * Note: 'resp' has been zeroed out when this function is invoked.
        !           176:  * The MPPE key fields should remain zeroed out unless valid keys
        !           177:  * are present.
        !           178:  *
        !           179:  * Returns:
        !           180:  *      0      Credentials found
        !           181:  *     -1      Credentials can't be found. Set errno or resp->errmsg.
        !           182:  */
        !           183: typedef int    ppp_auth_acquire_t(struct ppp_link *link,
        !           184:                        struct ppp_auth_cred *creds,
        !           185:                        struct ppp_auth_resp *resp);
        !           186: 
        !           187: /*
        !           188:  * Function type for checking credentials.
        !           189:  *
        !           190:  * Note: if type is PPP_AUTH_CHAP_MSV2, the caller must fill in the
        !           191:  * "authresp" array with the 20 byte MS-CHAPv2 authenticator response.
        !           192:  *
        !           193:  * Note: if type is PPP_AUTH_CHAP_MSV1 or PPP_AUTH_CHAP_MSV2, the caller
        !           194:  * SHOULD fill in the "mppe" structure with the MPPE key(s).
        !           195:  *
        !           196:  * Note: this function will be called in a separate thread that may
        !           197:  * be canceled at any time; it should be prepared to clean up if so.
        !           198:  *
        !           199:  * Note: 'resp' has been zeroed out when this function is invoked.
        !           200:  * The MPPE key fields should remain zeroed out unless valid keys
        !           201:  * are present.
        !           202:  *
        !           203:  * Returns:
        !           204:  *      0      Credentials are valid
        !           205:  *     -1      Credentials can't be validated. Set errno or resp->errmsg.
        !           206:  */
        !           207: typedef int    ppp_auth_check_t(struct ppp_link *link,
        !           208:                        const struct ppp_auth_cred *creds,
        !           209:                        struct ppp_auth_resp *resp);
        !           210: 
        !           211: /*
        !           212:  * Authorization information supplied by caller.
        !           213:  */
        !           214: struct ppp_auth_meth {
        !           215:        ppp_auth_acquire_t      *acquire;
        !           216:        ppp_auth_check_t        *check;
        !           217: };
        !           218: 
        !           219: /* Authorization configuration for a link */
        !           220: struct ppp_auth_config {
        !           221:        struct ppp_auth_meth    *meth;          /* auth_config callbacks */
        !           222:        u_int32_t               allow[2];       /* auth types allowed (bits) */
        !           223: };
        !           224: 
        !           225: /***********************************************************************
        !           226:                        PPP PRIVATE STUFF
        !           227: ***********************************************************************/
        !           228: 
        !           229: #ifdef _PDEL_PPP_PRIVATE_H_
        !           230: 
        !           231: /*
        !           232:  * Authorization type methods
        !           233:  */
        !           234: typedef void   *ppp_authtype_start_t(struct pevent_ctx *ev_ctx,
        !           235:                        struct ppp_link *link, pthread_mutex_t *mutex,
        !           236:                        int dir, u_int16_t *protop, struct ppp_log *log);
        !           237: typedef void   ppp_authtype_cancel_t(void *arg);
        !           238: typedef void   ppp_authtype_input_t(void *arg,
        !           239:                        int dir, void *data, size_t len);
        !           240: 
        !           241: /* Authorization type descriptor */
        !           242: struct ppp_auth_type {
        !           243:        const char              *name;          /* name */
        !           244:        enum ppp_auth_index     index;          /* auth type index */
        !           245:        ppp_authtype_start_t    *start;         /* start method */
        !           246:        ppp_authtype_cancel_t   *cancel;        /* cancel method */
        !           247:        ppp_authtype_input_t    *input;         /* input packet method */
        !           248:        u_int                   len;            /* length of option data */
        !           249:        const u_char            data[8];        /* option data */
        !           250: };
        !           251: 
        !           252: __BEGIN_DECLS
        !           253: 
        !           254: /* Authorization type functions */
        !           255: extern const   struct ppp_auth_type *ppp_auth_by_option(
        !           256:                        const struct ppp_fsm_option *opt);
        !           257: extern const   struct ppp_auth_type *ppp_auth_by_index(
        !           258:                        enum ppp_auth_index index);
        !           259: 
        !           260: extern opt_pr_t        ppp_auth_print;
        !           261: 
        !           262: __END_DECLS
        !           263: 
        !           264: #endif /* _PDEL_PPP_PRIVATE_H_ */
        !           265: 
        !           266: #endif /* _PDEL_PPP_PPP_AUTH_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>