| /* |
| * Copyright (c) 1997-2007 The Stanford SRP Authentication Project |
| * All Rights Reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining |
| * a copy of this software and associated documentation files (the |
| * "Software"), to deal in the Software without restriction, including |
| * without limitation the rights to use, copy, modify, merge, publish, |
| * distribute, sublicense, and/or sell copies of the Software, and to |
| * permit persons to whom the Software is furnished to do so, subject to |
| * the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be |
| * included in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY |
| * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. |
| * |
| * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INCIDENTAL, |
| * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER |
| * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF |
| * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT |
| * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| * |
| * Redistributions in source or binary form must retain an intact copy |
| * of this copyright notice. |
| */ |
| |
| #ifndef T_PWD_H |
| #define T_PWD_H |
| |
| #include <stdio.h> |
| #include "cstr.h" |
| |
| #define MAXPARAMBITS 2048 |
| #define MAXPARAMLEN ((MAXPARAMBITS + 7) / 8) |
| #define MAXB64PARAMLEN ((MAXPARAMBITS + 5) / 6 + 1) |
| #define MAXHEXPARAMLEN ((MAXPARAMBITS + 3) / 4 + 1) |
| #define MAXOCTPARAMLEN ((MAXPARAMBITS + 2) / 3 + 1) |
| |
| #define MAXUSERLEN 32 |
| #define MAXSALTLEN 32 |
| #define MAXB64SALTLEN 44 /* 256 bits in b64 + null */ |
| #define SALTLEN 10 /* Normally 80 bits */ |
| |
| #define RESPONSE_LEN 20 /* 160-bit proof hashes */ |
| #define SESSION_KEY_LEN (2 * RESPONSE_LEN) /* 320-bit session key */ |
| |
| #define DEFAULT_PASSWD "/etc/tpasswd" |
| #define DEFAULT_CONF "/etc/tpasswd.conf" |
| |
| struct t_num { /* Standard byte-oriented integer representation */ |
| int len; |
| unsigned char * data; |
| }; |
| |
| struct t_preconf { /* Structure returned by t_getpreparam() */ |
| char * mod_b64; |
| char * gen_b64; |
| char * comment; |
| |
| struct t_num modulus; |
| struct t_num generator; |
| }; |
| |
| /* |
| * The built-in (known good) parameters access routines |
| * |
| * "t_getprecount" returns the number of precompiled parameter sets. |
| * "t_getpreparam" returns the indicated parameter set. |
| * Memory is statically allocated - callers need not perform any memory mgmt. |
| */ |
| _TYPE( int ) t_getprecount(); |
| _TYPE( struct t_preconf * ) t_getpreparam P((int)); |
| |
| struct t_confent { /* One configuration file entry (index, N, g) */ |
| int index; |
| struct t_num modulus; |
| struct t_num generator; |
| }; |
| |
| struct t_conf { /* An open configuration file */ |
| FILE * instream; |
| char close_on_exit; |
| cstr * modbuf; |
| cstr * genbuf; |
| struct t_confent tcbuf; |
| }; |
| |
| /* |
| * The configuration file routines are designed along the lines of the |
| * "getpw" functions in the standard C library. |
| * |
| * "t_openconf" accepts a stdio stream and interprets it as a config file. |
| * "t_openconfbyname" accepts a filename and does the same thing. |
| * "t_closeconf" closes the config file. |
| * "t_getconfent" fetches the next sequential configuration entry. |
| * "t_getconfbyindex" fetches the configuration entry whose index |
| * matches the one supplied, or NULL if one can't be found. |
| * "t_getconflast" fetches the last configuration entry in the file. |
| * "t_makeconfent" generates a set of configuration entry parameters |
| * randomly. |
| * "t_newconfent" returns an empty configuration entry. |
| * "t_cmpconfent" compares two configuration entries a la strcmp. |
| * "t_checkconfent" verifies that a set of configuration parameters |
| * are suitable. N must be prime and should be a safe prime. |
| * "t_putconfent" writes a configuration entry to a stream. |
| */ |
| _TYPE( struct t_conf * ) t_openconf P((FILE *)); |
| _TYPE( struct t_conf * ) t_openconfbyname P((const char *)); |
| _TYPE( void ) t_closeconf P((struct t_conf *)); |
| _TYPE( void ) t_rewindconf P((struct t_conf *)); |
| _TYPE( struct t_confent * ) t_getconfent P((struct t_conf *)); |
| _TYPE( struct t_confent * ) t_getconfbyindex P((struct t_conf *, int)); |
| _TYPE( struct t_confent * ) t_getconflast P((struct t_conf *)); |
| _TYPE( struct t_confent * ) t_makeconfent P((struct t_conf *, int)); |
| _TYPE( struct t_confent * ) t_makeconfent_c P((struct t_conf *, int)); |
| _TYPE( struct t_confent * ) t_newconfent P((struct t_conf *)); |
| _TYPE( int ) t_cmpconfent P((const struct t_confent *, const struct t_confent *)); |
| _TYPE( int ) t_checkconfent P((const struct t_confent *)); |
| _TYPE( void ) t_putconfent P((const struct t_confent *, FILE *)); |
| |
| /* libc-style system conf file access */ |
| _TYPE( struct t_confent *) gettcent(); |
| _TYPE( struct t_confent *) gettcid P((int)); |
| _TYPE( void ) settcent(); |
| _TYPE( void ) endtcent(); |
| |
| #ifdef ENABLE_NSW |
| extern struct t_confent * _gettcent(); |
| extern struct t_confent * _gettcid P((int)); |
| extern void _settcent(); |
| extern void _endtcent(); |
| #endif |
| |
| /* A hack to support '+'-style entries in the passwd file */ |
| |
| typedef enum fstate { |
| FILE_ONLY, /* Ordinary file, don't consult NIS ever */ |
| FILE_NIS, /* Currently accessing file, use NIS if encountered */ |
| IN_NIS, /* Currently in a '+' entry; use NIS for getXXent */ |
| } FILE_STATE; |
| |
| struct t_pwent { /* A single password file entry */ |
| char * name; |
| struct t_num password; |
| struct t_num salt; |
| int index; |
| }; |
| |
| struct t_pw { /* An open password file */ |
| FILE * instream; |
| char close_on_exit; |
| FILE_STATE state; |
| char userbuf[MAXUSERLEN]; |
| cstr * pwbuf; |
| unsigned char saltbuf[SALTLEN]; |
| struct t_pwent pebuf; |
| }; |
| |
| /* |
| * The password manipulation routines are patterned after the getpw* |
| * standard C library function calls. |
| * |
| * "t_openpw" reads a stream as if it were a password file. |
| * "t_openpwbyname" opens the named file as a password file. |
| * "t_closepw" closes an open password file. |
| * "t_rewindpw" starts the internal file pointer from the beginning |
| * of the password file. |
| * "t_getpwent" retrieves the next sequential password entry. |
| * "t_getpwbyname" looks up the password entry corresponding to the |
| * specified user. |
| * "t_makepwent" constructs a password entry from a username, password, |
| * numeric salt, and configuration entry. |
| * "t_putpwent" writes a password entry to a stream. |
| */ |
| _TYPE( struct t_pw * ) t_newpw(); |
| _TYPE( struct t_pw * ) t_openpw P((FILE *)); |
| _TYPE( struct t_pw * ) t_openpwbyname P((const char *)); |
| _TYPE( void ) t_closepw P((struct t_pw *)); |
| _TYPE( void ) t_rewindpw P((struct t_pw *)); |
| _TYPE( struct t_pwent * ) t_getpwent P((struct t_pw *)); |
| _TYPE( struct t_pwent * ) t_getpwbyname P((struct t_pw *, const char *)); |
| _TYPE( struct t_pwent * ) t_makepwent P((struct t_pw *, const char *, |
| const char *, const struct t_num *, |
| const struct t_confent *)); |
| _TYPE( void ) t_putpwent P((const struct t_pwent *, FILE *)); |
| |
| struct t_passwd { |
| struct t_pwent tp; |
| struct t_confent tc; |
| }; |
| |
| /* libc-style system password file access */ |
| _TYPE( struct t_passwd * ) gettpent(); |
| _TYPE( struct t_passwd * ) gettpnam P((const char *)); |
| _TYPE( void ) settpent(); |
| _TYPE( void ) endtpent(); |
| |
| #ifdef ENABLE_NSW |
| extern struct t_passwd * _gettpent(); |
| extern struct t_passwd * _gettpnam P((const char *)); |
| extern void _settpent(); |
| extern void _endtpent(); |
| #endif |
| |
| /* |
| * Utility functions |
| * |
| * "t_verifypw" accepts a username and password, and checks against the |
| * system password file to see if the password for that user is correct. |
| * Returns > 0 if it is correct, 0 if not, and -1 if some error occurred |
| * (i.e. the user doesn't exist on the system). This is intended ONLY |
| * for local authentication; for remote authentication, look at the |
| * t_client and t_server source. (That's the whole point of SRP!) |
| * "t_changepw" modifies the specified file, substituting the given password |
| * entry for the one already in the file. If no matching entry is found, |
| * the new entry is simply appended to the file. |
| * "t_deletepw" removes the specified user from the specified file. |
| */ |
| _TYPE( int ) t_verifypw P((const char *, const char *)); |
| _TYPE( int ) t_changepw P((const char *, const struct t_pwent *)); |
| _TYPE( int ) t_deletepw P((const char *, const char *)); |
| |
| /* Conversion utilities */ |
| |
| /* |
| * All these calls accept output as the first parameter. In the case of |
| * t_tohex and t_tob64, the last argument is the length of the byte-string |
| * input. |
| */ |
| _TYPE( char * ) t_tohex P((char *, const char *, unsigned)); |
| _TYPE( int ) t_fromhex P((char *, const char *)); |
| _TYPE( char * ) t_tob64 P((char *, const char *, unsigned)); |
| _TYPE( int ) t_fromb64 P((char *, const char *)); |
| |
| /* These functions put their output in a cstr object */ |
| _TYPE( char * ) t_tohexcstr P((cstr *, const char *, unsigned)); |
| _TYPE( int ) t_cstrfromhex P((cstr *, const char *)); |
| _TYPE( char * ) t_tob64cstr P((cstr *, const char *, unsigned)); |
| _TYPE( int ) t_cstrfromb64 P((cstr *, const char *)); |
| |
| /* Miscellaneous utilities (moved to t_defines.h) */ |
| |
| #endif |