1 #ifdef PLAN9
2 #pragma	src	"/sys/src/libauth"
3 #pragma	lib	"libauth.a"
4 #endif
5 
6 /*
7  * Interface for typical callers.
8  */
9 
10 typedef struct	AuthInfo	AuthInfo;
11 typedef struct	Chalstate	Chalstate;
12 typedef struct	Chapreply	Chapreply;
13 typedef struct	MSchapreply	MSchapreply;
14 typedef struct	UserPasswd	UserPasswd;
15 typedef struct	AuthRpc		AuthRpc;
16 
17 enum
18 {
19 	MAXCHLEN=	256,		/* max challenge length	*/
20 	AMAXNAMELEN=	256,		/* maximum name length */
21 	MD5LEN=		16,
22 
23 	ARok = 0,			/* rpc return values */
24 	ARdone,
25 	ARerror,
26 	ARneedkey,
27 	ARbadkey,
28 	ARwritenext,
29 	ARtoosmall,
30 	ARtoobig,
31 	ARrpcfailure,
32 	ARphase,
33 
34 	AuthRpcMax = 4096,
35 };
36 
37 struct AuthRpc
38 {
39 	int afd;
40 	char ibuf[AuthRpcMax];
41 	char obuf[AuthRpcMax];
42 	char *arg;
43 	uint narg;
44 };
45 
46 struct AuthInfo
47 {
48 	char	*cuid;		/* caller id */
49 	char	*suid;		/* server id */
50 	char	*cap;		/* capability (only valid on server side) */
51 	int	nsecret;	/* length of secret */
52 	uchar	*secret;	/* secret */
53 };
54 
55 struct Chalstate
56 {
57 	char	*user;
58 	char	chal[MAXCHLEN];
59 	int	nchal;
60 	void	*resp;
61 	int	nresp;
62 
63 /* for implementation only */
64 	int	afd;			/* to factotum */
65 	AuthRpc	*rpc;			/* to factotum */
66 	char	userbuf[AMAXNAMELEN];	/* temp space if needed */
67 	int	userinchal;		/* user was sent to obtain challenge */
68 };
69 
70 struct	Chapreply		/* for protocol "chap" */
71 {
72 	uchar	id;
73 	char	resp[MD5LEN];
74 };
75 
76 struct	MSchapreply	/* for protocol "mschap" */
77 {
78 	char	LMresp[24];		/* Lan Manager response */
79 	char	NTresp[24];		/* NT response */
80 };
81 
82 struct	UserPasswd
83 {
84 	char	*user;
85 	char	*passwd;
86 };
87 
88 extern	int	newns(char*, char*);
89 extern	int	addns(char*, char*);
90 
91 extern	int	noworld(char*);
92 extern	int	amount(int, char*, int, char*);
93 
94 /* these two may get generalized away -rsc */
95 extern	int	login(char*, char*, char*);
96 extern	int	httpauth(char*, char*);
97 
98 typedef struct Attr Attr;
99 typedef struct String String;
100 enum {
101 	AttrNameval,		/* name=val -- when matching, must have name=val */
102 	AttrQuery,		/* name? -- when matching, must be present */
103 	AttrDefault,		/* name:=val -- when matching, if present must match INTERNAL */
104 };
105 struct Attr
106 {
107 	int type;
108 	Attr *next;
109 	char *name;
110 	char *val;
111 };
112 
113 typedef int AuthGetkey(char*);
114 
115 int	_attrfmt(Fmt*);
116 Attr	*_copyattr(Attr*);
117 Attr	*_delattr(Attr*, char*);
118 Attr	*_findattr(Attr*, char*);
119 void	_freeattr(Attr*);
120 Attr	*_mkattr(int, char*, char*, Attr*);
121 Attr	*_parseattr(char*);
122 char	*_strfindattr(Attr*, char*);
123 #ifdef VARARGCK
124 #pragma varargck type "A" Attr*
125 #endif
126 
127 extern AuthInfo*	fauth_proxy(int, AuthRpc *rpc, AuthGetkey *getkey, char *params);
128 extern AuthInfo*	auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...);
129 extern int		auth_getkey(char*);
130 extern int		(*amount_getkey)(char*);
131 extern void		auth_freeAI(AuthInfo *ai);
132 extern int		auth_chuid(AuthInfo *ai, char *ns);
133 extern Chalstate	*auth_challenge(char*, ...);
134 extern AuthInfo*	auth_response(Chalstate*);
135 extern int		auth_respond(void*, uint, char*, uint, void*, uint, AuthGetkey *getkey, char*, ...);
136 extern void		auth_freechal(Chalstate*);
137 extern AuthInfo*	auth_userpasswd(char *user, char *passwd);
138 extern UserPasswd*	auth_getuserpasswd(AuthGetkey *getkey, char*, ...);
139 extern AuthInfo*	auth_getinfo(AuthRpc *rpc);
140 extern AuthRpc*		auth_allocrpc(int afd);
141 extern Attr*		auth_attr(AuthRpc *rpc);
142 extern void		auth_freerpc(AuthRpc *rpc);
143 extern uint		auth_rpc(AuthRpc *rpc, char *verb, void *a, int n);
144 extern int		auth_wep(char*, char*, ...);
145 
146 #ifdef VARARGCK
147 #pragma varargck argpos auth_proxy 3
148 #pragma varargck argpos auth_challenge 1
149 #pragma varargck argpos auth_respond 3
150 #pragma varargck argpos auth_getuserpasswd 2
151 #endif
152