|  | #ifndef __AUTHSRV_H__ | 
|  | #define __AUTHSRV_H__ 1 | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  | /* | 
|  | #pragma	src	"/sys/src/libauthsrv" | 
|  | #pragma	lib	"libauthsrv.a" | 
|  | */ | 
|  | AUTOLIB(authsrv) | 
|  |  | 
|  | /* | 
|  | * Interface for talking to authentication server. | 
|  | */ | 
|  | typedef struct	Ticket		Ticket; | 
|  | typedef struct	Ticketreq	Ticketreq; | 
|  | typedef struct	Authenticator	Authenticator; | 
|  | typedef struct	Nvrsafe		Nvrsafe; | 
|  | typedef struct	Passwordreq	Passwordreq; | 
|  | typedef struct	OChapreply	OChapreply; | 
|  | typedef struct	OMSchapreply	OMSchapreply; | 
|  |  | 
|  | enum | 
|  | { | 
|  | ANAMELEN=	28,		/* maximum size of name in previous proto */ | 
|  | AERRLEN=	64,		/* maximum size of errstr in previous proto */ | 
|  | DOMLEN=		48,		/* length of an authentication domain name */ | 
|  | DESKEYLEN=	7,		/* length of a des key for encrypt/decrypt */ | 
|  | CHALLEN=	8,		/* length of a plan9 sk1 challenge */ | 
|  | NETCHLEN=	16,		/* max network challenge length (used in AS protocol) */ | 
|  | CONFIGLEN=	14, | 
|  | SECRETLEN=	32,		/* max length of a secret */ | 
|  |  | 
|  | KEYDBOFF=	8,		/* length of random data at the start of key file */ | 
|  | OKEYDBLEN=	ANAMELEN+DESKEYLEN+4+2,	/* length of an entry in old key file */ | 
|  | KEYDBLEN=	OKEYDBLEN+SECRETLEN,	/* length of an entry in key file */ | 
|  | OMD5LEN=	16 | 
|  | }; | 
|  |  | 
|  | /* encryption numberings (anti-replay) */ | 
|  | enum | 
|  | { | 
|  | AuthTreq=1,	/* ticket request */ | 
|  | AuthChal=2,	/* challenge box request */ | 
|  | AuthPass=3,	/* change password */ | 
|  | AuthOK=4,	/* fixed length reply follows */ | 
|  | AuthErr=5,	/* error follows */ | 
|  | AuthMod=6,	/* modify user */ | 
|  | AuthApop=7,	/* apop authentication for pop3 */ | 
|  | AuthOKvar=9,	/* variable length reply follows */ | 
|  | AuthChap=10,	/* chap authentication for ppp */ | 
|  | AuthMSchap=11,	/* MS chap authentication for ppp */ | 
|  | AuthCram=12,	/* CRAM verification for IMAP (RFC2195 & rfc2104) */ | 
|  | AuthHttp=13,	/* http domain login */ | 
|  | AuthVNC=14,	/* VNC server login (deprecated) */ | 
|  |  | 
|  |  | 
|  | AuthTs=64,	/* ticket encrypted with server's key */ | 
|  | AuthTc,		/* ticket encrypted with client's key */ | 
|  | AuthAs,		/* server generated authenticator */ | 
|  | AuthAc,		/* client generated authenticator */ | 
|  | AuthTp,		/* ticket encrypted with client's key for password change */ | 
|  | AuthHr		/* http reply */ | 
|  | }; | 
|  |  | 
|  | struct Ticketreq | 
|  | { | 
|  | char	type; | 
|  | char	authid[ANAMELEN];	/* server's encryption id */ | 
|  | char	authdom[DOMLEN];	/* server's authentication domain */ | 
|  | char	chal[CHALLEN];		/* challenge from server */ | 
|  | char	hostid[ANAMELEN];	/* host's encryption id */ | 
|  | char	uid[ANAMELEN];		/* uid of requesting user on host */ | 
|  | }; | 
|  | #define	TICKREQLEN	(3*ANAMELEN+CHALLEN+DOMLEN+1) | 
|  |  | 
|  | struct Ticket | 
|  | { | 
|  | char	num;			/* replay protection */ | 
|  | char	chal[CHALLEN];		/* server challenge */ | 
|  | char	cuid[ANAMELEN];		/* uid on client */ | 
|  | char	suid[ANAMELEN];		/* uid on server */ | 
|  | char	key[DESKEYLEN];		/* nonce DES key */ | 
|  | }; | 
|  | #define	TICKETLEN	(CHALLEN+2*ANAMELEN+DESKEYLEN+1) | 
|  |  | 
|  | struct Authenticator | 
|  | { | 
|  | char	num;			/* replay protection */ | 
|  | char	chal[CHALLEN]; | 
|  | ulong	id;			/* authenticator id, ++'d with each auth */ | 
|  | }; | 
|  | #define	AUTHENTLEN	(CHALLEN+4+1) | 
|  |  | 
|  | struct Passwordreq | 
|  | { | 
|  | char	num; | 
|  | char	old[ANAMELEN]; | 
|  | char	new[ANAMELEN]; | 
|  | char	changesecret; | 
|  | char	secret[SECRETLEN];	/* new secret */ | 
|  | }; | 
|  | #define	PASSREQLEN	(2*ANAMELEN+1+1+SECRETLEN) | 
|  |  | 
|  | struct	OChapreply | 
|  | { | 
|  | uchar	id; | 
|  | char	uid[ANAMELEN]; | 
|  | char	resp[OMD5LEN]; | 
|  | }; | 
|  |  | 
|  | struct	OMSchapreply | 
|  | { | 
|  | char	uid[ANAMELEN]; | 
|  | char	LMresp[24];		/* Lan Manager response */ | 
|  | char	NTresp[24];		/* NT response */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | *  convert to/from wire format | 
|  | */ | 
|  | extern	int	convT2M(Ticket*, char*, char*); | 
|  | extern	void	convM2T(char*, Ticket*, char*); | 
|  | extern	void	convM2Tnoenc(char*, Ticket*); | 
|  | extern	int	convA2M(Authenticator*, char*, char*); | 
|  | extern	void	convM2A(char*, Authenticator*, char*); | 
|  | extern	int	convTR2M(Ticketreq*, char*); | 
|  | extern	void	convM2TR(char*, Ticketreq*); | 
|  | extern	int	convPR2M(Passwordreq*, char*, char*); | 
|  | extern	void	convM2PR(char*, Passwordreq*, char*); | 
|  |  | 
|  | /* | 
|  | *  convert ascii password to DES key | 
|  | */ | 
|  | extern	int	opasstokey(char*, char*); | 
|  | extern	int	passtokey(char*, char*); | 
|  |  | 
|  | /* | 
|  | *  Nvram interface | 
|  | */ | 
|  | enum { | 
|  | NVwrite = 1<<0,		/* always prompt and rewrite nvram */ | 
|  | NVwriteonerr = 1<<1	/* prompt and rewrite nvram when corrupt */ | 
|  | }; | 
|  |  | 
|  | struct Nvrsafe | 
|  | { | 
|  | char	machkey[DESKEYLEN]; | 
|  | uchar	machsum; | 
|  | char	authkey[DESKEYLEN]; | 
|  | uchar	authsum; | 
|  | char	config[CONFIGLEN]; | 
|  | uchar	configsum; | 
|  | char	authid[ANAMELEN]; | 
|  | uchar	authidsum; | 
|  | char	authdom[DOMLEN]; | 
|  | uchar	authdomsum; | 
|  | }; | 
|  |  | 
|  | extern	uchar	nvcsum(void*, int); | 
|  | extern int	readnvram(Nvrsafe*, int); | 
|  |  | 
|  | /* | 
|  | *  call up auth server | 
|  | */ | 
|  | extern	int	authdial(char *netroot, char *authdom); | 
|  |  | 
|  | /* | 
|  | *  exchange messages with auth server | 
|  | */ | 
|  | extern	int	_asgetticket(int, char*, char*); | 
|  | extern	int	_asrdresp(int, char*, int); | 
|  | extern	int	sslnegotiate(int, Ticket*, char**, char**); | 
|  | extern	int	srvsslnegotiate(int, Ticket*, char**, char**); | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  | #endif |