1*14414594SDavid du Colombier typedef struct Ticket Ticket; 2*14414594SDavid du Colombier typedef struct Ticketreq Ticketreq; 3*14414594SDavid du Colombier typedef struct Authenticator Authenticator; 4*14414594SDavid du Colombier typedef struct Nvrsafe Nvrsafe; 5*14414594SDavid du Colombier typedef struct Passwordreq Passwordreq; 6*14414594SDavid du Colombier typedef struct Chalstate Chalstate; 7*14414594SDavid du Colombier typedef struct Apopchalstate Apopchalstate; 8*14414594SDavid du Colombier typedef struct Chapreply Chapreply; 9*14414594SDavid du Colombier typedef struct MSchapreply MSchapreply; 10*14414594SDavid du Colombier 11*14414594SDavid du Colombier enum 12*14414594SDavid du Colombier { 13*14414594SDavid du Colombier DOMLEN= 48, /* length of an authentication domain name */ 14*14414594SDavid du Colombier U9AUTH_DESKEYLEN= 7, /* length of a des key for encrypt/decrypt */ 15*14414594SDavid du Colombier CHALLEN= 8, /* length of a challenge */ 16*14414594SDavid du Colombier NETCHLEN= 16, /* max network challenge length */ 17*14414594SDavid du Colombier CONFIGLEN= 14, 18*14414594SDavid du Colombier SECRETLEN= 32, /* max length of a secret */ 19*14414594SDavid du Colombier APOPCHLEN= 256, 20*14414594SDavid du Colombier MD5LEN= 16, 21*14414594SDavid du Colombier 22*14414594SDavid du Colombier KEYDBOFF= 8, /* length of random data at the start of key file */ 23*14414594SDavid du Colombier OKEYDBLEN= U9FS_NAMELEN+U9AUTH_DESKEYLEN+4+2, /* length of an entry in old key file */ 24*14414594SDavid du Colombier KEYDBLEN= OKEYDBLEN+SECRETLEN, /* length of an entry in key file */ 25*14414594SDavid du Colombier U9AUTH_TCPPORT= 567, 26*14414594SDavid du Colombier U9AUTH_ILPORT= 566, 27*14414594SDavid du Colombier }; 28*14414594SDavid du Colombier 29*14414594SDavid du Colombier /* encryption numberings (anti-replay) */ 30*14414594SDavid du Colombier enum 31*14414594SDavid du Colombier { 32*14414594SDavid du Colombier AuthTreq=1, /* ticket request */ 33*14414594SDavid du Colombier AuthChal=2, /* challenge box request */ 34*14414594SDavid du Colombier AuthPass=3, /* change password */ 35*14414594SDavid du Colombier AuthOK=4, /* fixed length reply follows */ 36*14414594SDavid du Colombier AuthErr=5, /* error follows */ 37*14414594SDavid du Colombier AuthMod=6, /* modify user */ 38*14414594SDavid du Colombier AuthApop=7, /* apop authentication for pop3 */ 39*14414594SDavid du Colombier AuthOKvar=9, /* variable length reply follows */ 40*14414594SDavid du Colombier AuthChap=10, /* chap authentication for ppp */ 41*14414594SDavid du Colombier AuthMSchap=11, /* MS chap authentication for ppp */ 42*14414594SDavid du Colombier 43*14414594SDavid du Colombier 44*14414594SDavid du Colombier AuthTs=64, /* ticket encrypted with server's key */ 45*14414594SDavid du Colombier AuthTc, /* ticket encrypted with client's key */ 46*14414594SDavid du Colombier AuthAs, /* server generated authenticator */ 47*14414594SDavid du Colombier AuthAc, /* client generated authenticator */ 48*14414594SDavid du Colombier AuthTp, /* ticket encrypted with clien's key for password change */ 49*14414594SDavid du Colombier }; 50*14414594SDavid du Colombier 51*14414594SDavid du Colombier struct Ticketreq 52*14414594SDavid du Colombier { 53*14414594SDavid du Colombier char type; 54*14414594SDavid du Colombier char authid[U9FS_NAMELEN]; /* server's encryption id */ 55*14414594SDavid du Colombier char authdom[DOMLEN]; /* server's authentication domain */ 56*14414594SDavid du Colombier char chal[CHALLEN]; /* challenge from server */ 57*14414594SDavid du Colombier char hostid[U9FS_NAMELEN]; /* host's encryption id */ 58*14414594SDavid du Colombier char uid[U9FS_NAMELEN]; /* uid of requesting user on host */ 59*14414594SDavid du Colombier }; 60*14414594SDavid du Colombier #define TICKREQLEN (3*U9FS_NAMELEN+CHALLEN+DOMLEN+1) 61*14414594SDavid du Colombier 62*14414594SDavid du Colombier struct Ticket 63*14414594SDavid du Colombier { 64*14414594SDavid du Colombier char num; /* replay protection */ 65*14414594SDavid du Colombier char chal[CHALLEN]; /* server challenge */ 66*14414594SDavid du Colombier char cuid[U9FS_NAMELEN]; /* uid on client */ 67*14414594SDavid du Colombier char suid[U9FS_NAMELEN]; /* uid on server */ 68*14414594SDavid du Colombier char key[U9AUTH_DESKEYLEN]; /* nonce DES key */ 69*14414594SDavid du Colombier }; 70*14414594SDavid du Colombier #define TICKETLEN (CHALLEN+2*U9FS_NAMELEN+U9AUTH_DESKEYLEN+1) 71*14414594SDavid du Colombier 72*14414594SDavid du Colombier struct Authenticator 73*14414594SDavid du Colombier { 74*14414594SDavid du Colombier char num; /* replay protection */ 75*14414594SDavid du Colombier char chal[CHALLEN]; 76*14414594SDavid du Colombier u_long id; /* authenticator id, ++'d with each auth */ 77*14414594SDavid du Colombier }; 78*14414594SDavid du Colombier #define AUTHENTLEN (CHALLEN+4+1) 79*14414594SDavid du Colombier 80*14414594SDavid du Colombier struct Passwordreq 81*14414594SDavid du Colombier { 82*14414594SDavid du Colombier char num; 83*14414594SDavid du Colombier char old[U9FS_NAMELEN]; 84*14414594SDavid du Colombier char new[U9FS_NAMELEN]; 85*14414594SDavid du Colombier char changesecret; 86*14414594SDavid du Colombier char secret[SECRETLEN]; /* new secret */ 87*14414594SDavid du Colombier }; 88*14414594SDavid du Colombier #define PASSREQLEN (2*U9FS_NAMELEN+1+1+SECRETLEN) 89*14414594SDavid du Colombier 90*14414594SDavid du Colombier struct Nvrsafe 91*14414594SDavid du Colombier { 92*14414594SDavid du Colombier char machkey[U9AUTH_DESKEYLEN]; 93*14414594SDavid du Colombier u_char machsum; 94*14414594SDavid du Colombier char authkey[U9AUTH_DESKEYLEN]; 95*14414594SDavid du Colombier u_char authsum; 96*14414594SDavid du Colombier char config[CONFIGLEN]; 97*14414594SDavid du Colombier u_char configsum; 98*14414594SDavid du Colombier char authid[U9FS_NAMELEN]; 99*14414594SDavid du Colombier u_char authidsum; 100*14414594SDavid du Colombier char authdom[DOMLEN]; 101*14414594SDavid du Colombier u_char authdomsum; 102*14414594SDavid du Colombier }; 103*14414594SDavid du Colombier 104*14414594SDavid du Colombier struct Chalstate 105*14414594SDavid du Colombier { 106*14414594SDavid du Colombier int afd; /* /dev/authenticate */ 107*14414594SDavid du Colombier int asfd; /* authdial() */ 108*14414594SDavid du Colombier char chal[NETCHLEN]; /* challenge/response */ 109*14414594SDavid du Colombier }; 110*14414594SDavid du Colombier 111*14414594SDavid du Colombier struct Apopchalstate 112*14414594SDavid du Colombier { 113*14414594SDavid du Colombier int afd; /* /dev/authenticate */ 114*14414594SDavid du Colombier int asfd; /* authdial() */ 115*14414594SDavid du Colombier char chal[APOPCHLEN]; /* challenge/response */ 116*14414594SDavid du Colombier }; 117*14414594SDavid du Colombier 118*14414594SDavid du Colombier struct Chapreply 119*14414594SDavid du Colombier { 120*14414594SDavid du Colombier u_char id; 121*14414594SDavid du Colombier char uid[U9FS_NAMELEN]; 122*14414594SDavid du Colombier char resp[MD5LEN]; 123*14414594SDavid du Colombier }; 124*14414594SDavid du Colombier 125*14414594SDavid du Colombier struct MSchapreply 126*14414594SDavid du Colombier { 127*14414594SDavid du Colombier char uid[U9FS_NAMELEN]; 128*14414594SDavid du Colombier char LMresp[24]; /* Lan Manager response */ 129*14414594SDavid du Colombier char NTresp[24]; /* NT response */ 130*14414594SDavid du Colombier }; 131*14414594SDavid du Colombier 132*14414594SDavid du Colombier extern int convT2M(Ticket*, char*, char*); 133*14414594SDavid du Colombier extern void convM2T(char*, Ticket*, char*); 134*14414594SDavid du Colombier extern void convM2Tnoenc(char*, Ticket*); 135*14414594SDavid du Colombier extern int convA2M(Authenticator*, char*, char*); 136*14414594SDavid du Colombier extern void convM2A(char*, Authenticator*, char*); 137*14414594SDavid du Colombier extern int convTR2M(Ticketreq*, char*); 138*14414594SDavid du Colombier extern void convM2TR(char*, Ticketreq*); 139*14414594SDavid du Colombier extern int convPR2M(Passwordreq*, char*, char*); 140*14414594SDavid du Colombier extern void convM2PR(char*, Passwordreq*, char*); 141*14414594SDavid du Colombier extern u_char nvcsum(void*, int); 142*14414594SDavid du Colombier extern int opasstokey(char*, char*); 143*14414594SDavid du Colombier extern int passtokey(char*, char*); 144*14414594SDavid du Colombier extern int authenticate(int, int); 145*14414594SDavid du Colombier extern int newns(char*, char*); 146*14414594SDavid du Colombier extern int addns(char*, char*); 147*14414594SDavid du Colombier extern int authdial(void); 148*14414594SDavid du Colombier extern int auth(int); 149*14414594SDavid du Colombier extern int srvauth(int, char*); 150*14414594SDavid du Colombier extern int nauth(int, Ticket*); 151*14414594SDavid du Colombier extern int nsrvauth(int, char*, Ticket*); 152*14414594SDavid du Colombier extern int getchal(Chalstate*, char*); 153*14414594SDavid du Colombier extern int chalreply(Chalstate*, char*); 154*14414594SDavid du Colombier extern int amount(int, char*, int, char*); 155*14414594SDavid du Colombier extern int apopchal(Apopchalstate*); 156*14414594SDavid du Colombier extern int apopreply(Apopchalstate*, char*, char*); 157*14414594SDavid du Colombier extern int login(char*, char*, char*); 158*14414594SDavid du Colombier extern int sslnegotiate(int, Ticket*, char**, char**); 159*14414594SDavid du Colombier extern int srvsslnegotiate(int, Ticket*, char**, char**); 160