plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

auth.3 (8688B)


      1 .TH AUTH 3
      2 .SH NAME
      3 auth_proxy, fauth_proxy, auth_allocrpc, auth_freerpc, auth_rpc, auth_getkey, amount_getkey, auth_freeAI, auth_chuid, auth_challenge, auth_response, auth_freechal, auth_respond, auth_userpasswd, auth_getuserpasswd, auth_getinfo, fsauth_proxy, fsfauth_proxy, fsamount, nsamount\- routines for authenticating users
      4 .SH SYNOPSIS
      5 .nf
      6 .PP
      7 .ft L
      8 #include <u.h>
      9 #include <libc.h>
     10 #include <auth.h>
     11 .fi
     12 .ta 11n +4n +4n +4n +4n +4n +4n
     13 .\" .PP
     14 .\" .B
     15 .\" int		newns(char *user, char *nsfile);
     16 .\" .PP
     17 .\" .B
     18 .\" int		addns(char *user, char *nsfile);
     19 .\" .PP
     20 .\" .B
     21 .\" int		amount(int fd, char *old, int flag, char *aname);
     22 .\" .PP
     23 .\" .B
     24 .\" int		login(char *user, char *password, char *namespace);
     25 .\" .PP
     26 .\" .B
     27 .\" int		noworld(char *user);
     28 .PP
     29 .B
     30 AuthInfo*	auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...);
     31 .PP
     32 .B
     33 AuthInfo*	fauth_proxy(int fd, AuthRpc *rpc, AuthGetkey *getkey,
     34 .br
     35 .B			char *params);
     36 .PP
     37 .B
     38 AuthRpc*	auth_allocrpc(void);
     39 .PP
     40 .B
     41 void		auth_freerpc(AuthRpc *rpc);
     42 .PP
     43 .B
     44 uint		auth_rpc(AuthRpc *rpc, char *verb, void *a, int n);
     45 .PP
     46 .B
     47 int		auth_getkey(char *proto, char *dom);
     48 .PP
     49 .B
     50 int		(*amount_getkey)(char*, char*);
     51 .PP
     52 .B
     53 void		auth_freeAI(AuthInfo *ai);
     54 .PP
     55 .B
     56 int			auth_chuid(AuthInfo *ai, char *ns);
     57 .PP
     58 .B
     59 Chalstate*	auth_challenge(char *fmt, ...);
     60 .PP
     61 .B
     62 AuthInfo*	auth_response(Chalstate*);
     63 .PP
     64 .B
     65 void		auth_freechal(Chalstate*);
     66 .PP
     67 .B
     68 int			auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nresp, AuthGetkey *getkey, char *fmt, ...);
     69 .PP
     70 .B
     71 AuthInfo*	auth_userpasswd(char*user, char*password);
     72 .PP
     73 .B
     74 UserPasswd*	auth_getuserpasswd(AuthGetkey *getkey, char*fmt, ...);
     75 .PP
     76 .B
     77 AuthInfo*	auth_getinfo(AuthRpc *rpc);
     78 .PP
     79 .B
     80 #include <9pclient.h>
     81 .PP
     82 .B
     83 AuthInfo*	fsauth_proxy(CFid *fid, AuthGetkey *getkey, char *fmt, ...);
     84 .PP
     85 .B
     86 AuthInfo*	fsfauth_proxy(CFid *fid, AuthRpc *rpc, AuthGetkey *getkey,
     87 .br
     88 .B			char *params);
     89 .PP
     90 .B
     91 CFsys*	fsamount(int fd, char *aname);
     92 .PP
     93 .B
     94 CFsys*	nsamount(char *name, char *aname);
     95 .SH DESCRIPTION
     96 .PP
     97 This library, in concert with
     98 .MR factotum (4) ,
     99 is used to authenticate users.
    100 It provides the primary interface to
    101 .IR factotum .
    102 .\" .PP
    103 .\" .I Newns
    104 .\" builds a name space for
    105 .\" .IR user .
    106 .\" It opens the file
    107 .\" .I nsfile
    108 .\" .RB ( /lib/namespace
    109 .\" is used if
    110 .\" .I nsfile
    111 .\" is null),
    112 .\" copies the old environment, erases the current name space,
    113 .\" sets the environment variables
    114 .\" .B user
    115 .\" and
    116 .\" .BR home ,
    117 .\" and interprets the commands in
    118 .\" .IR nsfile .
    119 .\" The format of
    120 .\" .I nsfile
    121 .\" is described in
    122 .\" .IR namespace (6).
    123 .\" .PP
    124 .\" .I Addns
    125 .\" also interprets and executes the commands in
    126 .\" .IR nsfile .
    127 .\" Unlike
    128 .\" .I newns
    129 .\" it applies the command to the current name space
    130 .\" rather than starting from scratch.
    131 .\" .PP
    132 .\" .I Amount
    133 .\" is like
    134 .\" .I mount
    135 .\" but performs any authentication required.
    136 .\" It should be used instead of
    137 .\" .I mount
    138 .\" whenever the file server being mounted requires authentication.
    139 .\" See
    140 .\" .IR bind (2)
    141 .\" for a definition of the arguments to
    142 .\" .I mount
    143 .\" and
    144 .\" .IR amount .
    145 .\" .PP
    146 .\" .I Login
    147 .\" changes the user id of the process
    148 .\" .I user
    149 .\" and recreates the namespace using the file
    150 .\" .I namespace
    151 .\" (default
    152 .\" .BR /lib/nnamespace ).
    153 .\" It uses
    154 .\" .I auth_userpassword
    155 .\" and
    156 .\" .IR auth_chuid .
    157 .\" .PP
    158 .\" .I Noworld
    159 .\" returns 1 if the user is in the group
    160 .\" .B noworld
    161 .\" in
    162 .\" .BR /adm/users .
    163 .\" Otherwise, it returns 0.
    164 .\" .I Noworld
    165 .\" is used by telnetd and ftpd to provide sandboxed
    166 .\" access for some users.
    167 .PP
    168 The following routines use the
    169 .B AuthInfo
    170 structure returned after a successful authentication by
    171 .MR factotum (4) .
    172 .PP
    173 .ne 8
    174 .EX
    175 .ta 4n +4n +4n +4n +4n +4n +4n +4n +4n
    176 typedef struct
    177 {
    178 	char	*cuid;		/* caller id */
    179 	char	*suid;		/* server id */
    180 	char	*cap;			/* capability */
    181 	int	nsecret;		/* length of secret */
    182 	uchar	*secret;		/* secret */
    183 } AuthInfo;
    184 .EE
    185 .sp
    186 The fields
    187 .B cuid
    188 and
    189 .B suid
    190 point to the authenticated ids of the client and server.
    191 .B Cap
    192 is a capability returned only to the server.
    193 It is meaningful only on Plan 9.
    194 .\" It can be passed to the
    195 .\" .IR cap (3)
    196 .\" device to change the user id of the process.
    197 .B Secret
    198 is an
    199 .BR nsecret -byte
    200 shared secret that can be used by the client and server to
    201 create encryption and hashing keys for the rest of the
    202 conversation.
    203 .PP
    204 .I Auth_proxy
    205 proxies an authentication conversation between a remote
    206 server reading and writing
    207 .I fd
    208 and a
    209 .I factotum
    210 file, as opened by
    211 .IR auth_allocrpc.
    212 An
    213 .B sprint
    214 (see
    215 .MR print (3) )
    216 of 
    217 .I fmt
    218 and the variable arg list yields a key template (see
    219 .MR factotum (4) )
    220 specifying the key to use.
    221 The template must specify at least the protocol (
    222 .BI proto= xxx )
    223 and the role (either
    224 .B role=client
    225 or
    226 .BR role=server ).
    227 .I Auth_proxy
    228 either returns an allocated
    229 .B AuthInfo
    230 structure, or sets the error string and
    231 returns nil.
    232 .PP
    233 .I Fauth_proxy
    234 can be used instead of
    235 .I auth_proxy
    236 if a single connection to
    237 .I factotum
    238 will be used for multiple authentications.
    239 This is necessary, for example, for
    240 .I newns
    241 which must open the
    242 .I factotum
    243 file before wiping out the namespace.
    244 .I Fauth_proxy
    245 takes as an argument a pointer to an
    246 .B AuthRpc
    247 structure which contains an fd for an open connection to
    248 .I factotum
    249 in addition to storage and state information for
    250 the protocol.
    251 An
    252 .B AuthRpc
    253 structure is obtained by calling
    254 .IR auth_allocrpc .
    255 .I Auth_allocrpc
    256 arranges a connection to
    257 .IR factotum ,
    258 either by opening
    259 .B /mnt/factotum/rpc
    260 or by using 
    261 .MR 9pclient (3)
    262 to connect to a
    263 .B factotum
    264 service posted in the current name space.
    265 The returned connection 
    266 is freed using
    267 .IR auth_freerpc .
    268 Individual commands can be sent to
    269 .MR factotum (4)
    270 by invoking
    271 .IR auth_rpc .
    272 .PP
    273 Both
    274 .I auth_proxy
    275 and
    276 .I fauth_proxy
    277 take a pointer to a routine,
    278 .IR getkey ,
    279 to invoke should
    280 .I factotum
    281 not posess a key for the authentication.  If
    282 .I getkey
    283 is nil, the authentication fails.
    284 .I Getkey
    285 is called with a key template for the desired
    286 key.
    287 We have provided a generic routine,
    288 .IR auth_getkey ,
    289 which queries the user for
    290 the key information and passes it to
    291 .IR factotum .
    292 This is the default for the global variable,
    293 .IR amount_getkey ,
    294 which holds a pointer to the key prompting routine used by
    295 .IR amount .
    296 .PP
    297 .I Auth_chuid
    298 uses the
    299 .B cuid
    300 and
    301 .B cap
    302 fields of an
    303 .B AuthInfo
    304 structure to change the user id of the current
    305 process and uses
    306 .IR ns ,
    307 default
    308 .BR /lib/namespace ,
    309 to build it a new name space.
    310 .PP
    311 .I Auth_challenge
    312 and
    313 .I auth_response
    314 perform challenge/response protocols with
    315 .IR factotum .
    316 State between the challenge and response phase are
    317 kept in the
    318 .B Chalstate
    319 structure:
    320 .sp
    321 .EX
    322 struct Chalstate
    323 {
    324 	char	*user;
    325 	char	chal[MAXCHLEN];
    326 	int	nchal;
    327 	void	*resp;
    328 	int	nresp;
    329 
    330 /* for implementation only */
    331 	int	afd;
    332 	AuthRpc	*rpc;
    333 	char	userbuf[MAXNAMELEN];
    334 	int	userinchal;
    335 };
    336 .EE
    337 .sp
    338 .I Auth_challenge
    339 requires a key template generated by an
    340 .B sprint
    341 of
    342 .I fmt
    343 and the variable arguments.  It must contain the protocol
    344 (\fBproto=\fIxxx\fR)
    345 and depending on the protocol, the user name (
    346 .BI user= xxx \fR).\fP
    347 .B P9cr
    348 and
    349 .B vnc
    350 expect the user specified as an attribute in
    351 the key template and
    352 .BR apop ,
    353 .BR cram ,
    354 and
    355 .BR chap
    356 expect it in the 
    357 .B user
    358 field of the arg to
    359 .IR auth_response .
    360 For all protocols, the response is returned
    361 to
    362 .I auth_response
    363 in the
    364 .I resp
    365 field of the
    366 .BR Chalstate .
    367 .I Chalstate.nresp
    368 must be the length of the response.
    369 .PP
    370 Supply to
    371 .I auth_respond
    372 a challenge string and the fmt and args specifying a key,
    373 and it will use
    374 .I factotum
    375 to return the proper user and response.
    376 .PP
    377 .I Auth_userpasswd
    378 verifies a simple user/password pair.
    379 .I Auth_getuserpasswd
    380 retrieves a user/password pair from
    381 .I factotum
    382 if permitted.
    383 .PP
    384 .I Auth_getinfo
    385 reads an
    386 .B AuthInfo
    387 message from factotum
    388 and converts it into a structure.  It is only
    389 used by the other routines in this library when
    390 communicating with
    391 .IR factotum .
    392 .PP
    393 .ne 8
    394 .EX
    395 .ta 4n +4n +4n +4n +4n +4n +4n +4n +4n
    396 typedef struct UserPasswd {
    397 	char	*user;
    398 	char	*passwd;
    399 } UserPasswd;
    400 .EE
    401 .sp
    402 .PP
    403 .I Auth_freeAI
    404 is used to free an
    405 .B AuthInfo
    406 structure returned by one of these routines.
    407 Similary
    408 .I auth_freechal
    409 frees a challenge/response state.
    410 .PP
    411 .I Fsauth_proxy
    412 and
    413 .I fsfauth_proxy
    414 are like
    415 .I auth_proxy
    416 and
    417 .I fauth_proxy
    418 but execute the protocol on a
    419 .B CFid*
    420 (see
    421 .MR 9pclient (3) )
    422 instead of a file descriptor.
    423 .PP
    424 .I Fsamount
    425 and
    426 .I nsamount
    427 are like
    428 .I fsmount
    429 and
    430 .I nsmount
    431 (see
    432 .MR 9pclient (3) )
    433 but use
    434 .I factotum
    435 to authenticate to the file servers.
    436 .SH SOURCE
    437 .B \*9/src/libauth
    438 .SH SEE ALSO
    439 .MR factotum (4) ,
    440 .MR authsrv (3)
    441 .SH DIAGNOSTICS
    442 These routines set
    443 .IR errstr .