19a747e4fSDavid du Colombier #pragma src "/sys/src/libauthsrv" 29a747e4fSDavid du Colombier #pragma lib "libauthsrv.a" 39a747e4fSDavid du Colombier 49a747e4fSDavid du Colombier /* 59a747e4fSDavid du Colombier * Interface for talking to authentication server. 69a747e4fSDavid du Colombier */ 79a747e4fSDavid du Colombier typedef struct Ticket Ticket; 89a747e4fSDavid du Colombier typedef struct Ticketreq Ticketreq; 99a747e4fSDavid du Colombier typedef struct Authenticator Authenticator; 109a747e4fSDavid du Colombier typedef struct Nvrsafe Nvrsafe; 119a747e4fSDavid du Colombier typedef struct Passwordreq Passwordreq; 129a747e4fSDavid du Colombier typedef struct OChapreply OChapreply; 139a747e4fSDavid du Colombier typedef struct OMSchapreply OMSchapreply; 149a747e4fSDavid du Colombier 159a747e4fSDavid du Colombier enum 169a747e4fSDavid du Colombier { 17*6822557bSDavid du Colombier ANAMELEN= 28, /* name max size in previous proto */ 18*6822557bSDavid du Colombier AERRLEN= 64, /* errstr max size in previous proto */ 19*6822557bSDavid du Colombier DOMLEN= 48, /* authentication domain name length */ 20*6822557bSDavid du Colombier DESKEYLEN= 7, /* encrypt/decrypt des key length */ 21*6822557bSDavid du Colombier CHALLEN= 8, /* plan9 sk1 challenge length */ 229a747e4fSDavid du Colombier NETCHLEN= 16, /* max network challenge length (used in AS protocol) */ 239a747e4fSDavid du Colombier CONFIGLEN= 14, 24*6822557bSDavid du Colombier SECRETLEN= 32, /* secret max size */ 259a747e4fSDavid du Colombier 26*6822557bSDavid du Colombier KEYDBOFF= 8, /* bytes of random data at key file's start */ 27*6822557bSDavid du Colombier OKEYDBLEN= ANAMELEN+DESKEYLEN+4+2, /* old key file entry length */ 28*6822557bSDavid du Colombier KEYDBLEN= OKEYDBLEN+SECRETLEN, /* key file entry length */ 299a747e4fSDavid du Colombier OMD5LEN= 16, 309a747e4fSDavid du Colombier }; 319a747e4fSDavid du Colombier 329a747e4fSDavid du Colombier /* encryption numberings (anti-replay) */ 339a747e4fSDavid du Colombier enum 349a747e4fSDavid du Colombier { 359a747e4fSDavid du Colombier AuthTreq=1, /* ticket request */ 369a747e4fSDavid du Colombier AuthChal=2, /* challenge box request */ 379a747e4fSDavid du Colombier AuthPass=3, /* change password */ 389a747e4fSDavid du Colombier AuthOK=4, /* fixed length reply follows */ 399a747e4fSDavid du Colombier AuthErr=5, /* error follows */ 409a747e4fSDavid du Colombier AuthMod=6, /* modify user */ 419a747e4fSDavid du Colombier AuthApop=7, /* apop authentication for pop3 */ 429a747e4fSDavid du Colombier AuthOKvar=9, /* variable length reply follows */ 439a747e4fSDavid du Colombier AuthChap=10, /* chap authentication for ppp */ 449a747e4fSDavid du Colombier AuthMSchap=11, /* MS chap authentication for ppp */ 459a747e4fSDavid du Colombier AuthCram=12, /* CRAM verification for IMAP (RFC2195 & rfc2104) */ 469a747e4fSDavid du Colombier AuthHttp=13, /* http domain login */ 479a747e4fSDavid du Colombier AuthVNC=14, /* VNC server login (deprecated) */ 489a747e4fSDavid du Colombier 499a747e4fSDavid du Colombier 509a747e4fSDavid du Colombier AuthTs=64, /* ticket encrypted with server's key */ 519a747e4fSDavid du Colombier AuthTc, /* ticket encrypted with client's key */ 529a747e4fSDavid du Colombier AuthAs, /* server generated authenticator */ 539a747e4fSDavid du Colombier AuthAc, /* client generated authenticator */ 549a747e4fSDavid du Colombier AuthTp, /* ticket encrypted with client's key for password change */ 559a747e4fSDavid du Colombier AuthHr, /* http reply */ 569a747e4fSDavid du Colombier }; 579a747e4fSDavid du Colombier 589a747e4fSDavid du Colombier struct Ticketreq 599a747e4fSDavid du Colombier { 609a747e4fSDavid du Colombier char type; 619a747e4fSDavid du Colombier char authid[ANAMELEN]; /* server's encryption id */ 629a747e4fSDavid du Colombier char authdom[DOMLEN]; /* server's authentication domain */ 639a747e4fSDavid du Colombier char chal[CHALLEN]; /* challenge from server */ 649a747e4fSDavid du Colombier char hostid[ANAMELEN]; /* host's encryption id */ 659a747e4fSDavid du Colombier char uid[ANAMELEN]; /* uid of requesting user on host */ 669a747e4fSDavid du Colombier }; 679a747e4fSDavid du Colombier #define TICKREQLEN (3*ANAMELEN+CHALLEN+DOMLEN+1) 689a747e4fSDavid du Colombier 699a747e4fSDavid du Colombier struct Ticket 709a747e4fSDavid du Colombier { 719a747e4fSDavid du Colombier char num; /* replay protection */ 729a747e4fSDavid du Colombier char chal[CHALLEN]; /* server challenge */ 739a747e4fSDavid du Colombier char cuid[ANAMELEN]; /* uid on client */ 749a747e4fSDavid du Colombier char suid[ANAMELEN]; /* uid on server */ 759a747e4fSDavid du Colombier char key[DESKEYLEN]; /* nonce DES key */ 769a747e4fSDavid du Colombier }; 779a747e4fSDavid du Colombier #define TICKETLEN (CHALLEN+2*ANAMELEN+DESKEYLEN+1) 789a747e4fSDavid du Colombier 799a747e4fSDavid du Colombier struct Authenticator 809a747e4fSDavid du Colombier { 819a747e4fSDavid du Colombier char num; /* replay protection */ 829a747e4fSDavid du Colombier char chal[CHALLEN]; 839a747e4fSDavid du Colombier ulong id; /* authenticator id, ++'d with each auth */ 849a747e4fSDavid du Colombier }; 859a747e4fSDavid du Colombier #define AUTHENTLEN (CHALLEN+4+1) 869a747e4fSDavid du Colombier 879a747e4fSDavid du Colombier struct Passwordreq 889a747e4fSDavid du Colombier { 899a747e4fSDavid du Colombier char num; 909a747e4fSDavid du Colombier char old[ANAMELEN]; 919a747e4fSDavid du Colombier char new[ANAMELEN]; 929a747e4fSDavid du Colombier char changesecret; 939a747e4fSDavid du Colombier char secret[SECRETLEN]; /* new secret */ 949a747e4fSDavid du Colombier }; 959a747e4fSDavid du Colombier #define PASSREQLEN (2*ANAMELEN+1+1+SECRETLEN) 969a747e4fSDavid du Colombier 979a747e4fSDavid du Colombier struct OChapreply 989a747e4fSDavid du Colombier { 999a747e4fSDavid du Colombier uchar id; 1009a747e4fSDavid du Colombier char uid[ANAMELEN]; 1019a747e4fSDavid du Colombier char resp[OMD5LEN]; 1029a747e4fSDavid du Colombier }; 1039a747e4fSDavid du Colombier 1049a747e4fSDavid du Colombier struct OMSchapreply 1059a747e4fSDavid du Colombier { 1069a747e4fSDavid du Colombier char uid[ANAMELEN]; 1079a747e4fSDavid du Colombier char LMresp[24]; /* Lan Manager response */ 1089a747e4fSDavid du Colombier char NTresp[24]; /* NT response */ 1099a747e4fSDavid du Colombier }; 1109a747e4fSDavid du Colombier 1119a747e4fSDavid du Colombier /* 1129a747e4fSDavid du Colombier * convert to/from wire format 1139a747e4fSDavid du Colombier */ 1149a747e4fSDavid du Colombier extern int convT2M(Ticket*, char*, char*); 1159a747e4fSDavid du Colombier extern void convM2T(char*, Ticket*, char*); 1169a747e4fSDavid du Colombier extern void convM2Tnoenc(char*, Ticket*); 1179a747e4fSDavid du Colombier extern int convA2M(Authenticator*, char*, char*); 1189a747e4fSDavid du Colombier extern void convM2A(char*, Authenticator*, char*); 1199a747e4fSDavid du Colombier extern int convTR2M(Ticketreq*, char*); 1209a747e4fSDavid du Colombier extern void convM2TR(char*, Ticketreq*); 1219a747e4fSDavid du Colombier extern int convPR2M(Passwordreq*, char*, char*); 1229a747e4fSDavid du Colombier extern void convM2PR(char*, Passwordreq*, char*); 1239a747e4fSDavid du Colombier 1249a747e4fSDavid du Colombier /* 1259a747e4fSDavid du Colombier * convert ascii password to DES key 1269a747e4fSDavid du Colombier */ 1279a747e4fSDavid du Colombier extern int opasstokey(char*, char*); 1289a747e4fSDavid du Colombier extern int passtokey(char*, char*); 1299a747e4fSDavid du Colombier 1309a747e4fSDavid du Colombier /* 1319a747e4fSDavid du Colombier * Nvram interface 1329a747e4fSDavid du Colombier */ 1339a747e4fSDavid du Colombier enum { 134*6822557bSDavid du Colombier NVread = 0, /* just read */ 1359a747e4fSDavid du Colombier NVwrite = 1<<0, /* always prompt and rewrite nvram */ 1369a747e4fSDavid du Colombier NVwriteonerr = 1<<1, /* prompt and rewrite nvram when corrupt */ 137*6822557bSDavid du Colombier NVwritemem = 1<<2, /* don't prompt, write nvram from argument */ 1389a747e4fSDavid du Colombier }; 1399a747e4fSDavid du Colombier 140*6822557bSDavid du Colombier /* storage layout */ 1419a747e4fSDavid du Colombier struct Nvrsafe 1429a747e4fSDavid du Colombier { 143*6822557bSDavid du Colombier char machkey[DESKEYLEN]; /* was file server's authid's des key */ 1449a747e4fSDavid du Colombier uchar machsum; 145*6822557bSDavid du Colombier char authkey[DESKEYLEN]; /* authid's des key from password */ 1469a747e4fSDavid du Colombier uchar authsum; 147*6822557bSDavid du Colombier /* 148*6822557bSDavid du Colombier * file server config string of device holding full configuration; 149*6822557bSDavid du Colombier * secstore key on non-file-servers. 150*6822557bSDavid du Colombier */ 1519a747e4fSDavid du Colombier char config[CONFIGLEN]; 1529a747e4fSDavid du Colombier uchar configsum; 153*6822557bSDavid du Colombier char authid[ANAMELEN]; /* auth userid, e.g., bootes */ 1549a747e4fSDavid du Colombier uchar authidsum; 155*6822557bSDavid du Colombier char authdom[DOMLEN]; /* auth domain, e.g., cs.bell-labs.com */ 1569a747e4fSDavid du Colombier uchar authdomsum; 1579a747e4fSDavid du Colombier }; 1589a747e4fSDavid du Colombier 1599a747e4fSDavid du Colombier extern uchar nvcsum(void*, int); 1609a747e4fSDavid du Colombier extern int readnvram(Nvrsafe*, int); 1619a747e4fSDavid du Colombier 1629a747e4fSDavid du Colombier /* 1639a747e4fSDavid du Colombier * call up auth server 1649a747e4fSDavid du Colombier */ 1659a747e4fSDavid du Colombier extern int authdial(char *netroot, char *authdom); 1669a747e4fSDavid du Colombier 1679a747e4fSDavid du Colombier /* 1689a747e4fSDavid du Colombier * exchange messages with auth server 1699a747e4fSDavid du Colombier */ 1709a747e4fSDavid du Colombier extern int _asgetticket(int, char*, char*); 1719a747e4fSDavid du Colombier extern int _asrdresp(int, char*, int); 1729a747e4fSDavid du Colombier extern int sslnegotiate(int, Ticket*, char**, char**); 1739a747e4fSDavid du Colombier extern int srvsslnegotiate(int, Ticket*, char**, char**); 174