19a747e4fSDavid du Colombier #include <u.h> 29a747e4fSDavid du Colombier #include <libc.h> 39a747e4fSDavid du Colombier #include <auth.h> 49a747e4fSDavid du Colombier #include <authsrv.h> 59a747e4fSDavid du Colombier #include <mp.h> 69a747e4fSDavid du Colombier #include <libsec.h> 79a747e4fSDavid du Colombier #include <String.h> 89a747e4fSDavid du Colombier #include <thread.h> /* only for 9p.h */ 99a747e4fSDavid du Colombier #include <fcall.h> 109a747e4fSDavid du Colombier #include <9p.h> 119a747e4fSDavid du Colombier 125d459b5aSDavid du Colombier #pragma varargck type "N" Attr* 135d459b5aSDavid du Colombier 149a747e4fSDavid du Colombier enum 159a747e4fSDavid du Colombier { 169a747e4fSDavid du Colombier Maxname = 128, 179a747e4fSDavid du Colombier Maxrpc = 4096, 189a747e4fSDavid du Colombier 199a747e4fSDavid du Colombier /* common protocol phases; proto-specific phases start at 0 */ 209a747e4fSDavid du Colombier Notstarted = -3, 219a747e4fSDavid du Colombier Broken = -2, 229a747e4fSDavid du Colombier Established = -1, 239a747e4fSDavid du Colombier 249a747e4fSDavid du Colombier /* rpc read/write return values */ 259a747e4fSDavid du Colombier RpcFailure = 0, 269a747e4fSDavid du Colombier RpcNeedkey, 279a747e4fSDavid du Colombier RpcOk, 289a747e4fSDavid du Colombier RpcErrstr, 299a747e4fSDavid du Colombier RpcToosmall, 309a747e4fSDavid du Colombier RpcPhase, 319a747e4fSDavid du Colombier RpcConfirm, 329a747e4fSDavid du Colombier }; 339a747e4fSDavid du Colombier 349a747e4fSDavid du Colombier typedef struct Domain Domain; 359a747e4fSDavid du Colombier typedef struct Fsstate Fsstate; 369a747e4fSDavid du Colombier typedef struct Key Key; 37260f7b65SDavid du Colombier typedef struct Keyinfo Keyinfo; 389a747e4fSDavid du Colombier typedef struct Keyring Keyring; 399a747e4fSDavid du Colombier typedef struct Logbuf Logbuf; 409a747e4fSDavid du Colombier typedef struct Proto Proto; 419a747e4fSDavid du Colombier typedef struct State State; 429a747e4fSDavid du Colombier 4312fd1c83SDavid du Colombier #pragma incomplete State 4412fd1c83SDavid du Colombier 4512fd1c83SDavid du Colombier 469a747e4fSDavid du Colombier struct Fsstate 479a747e4fSDavid du Colombier { 489a747e4fSDavid du Colombier char *sysuser; /* user according to system */ 499a747e4fSDavid du Colombier 509a747e4fSDavid du Colombier /* keylist, protolist */ 519a747e4fSDavid du Colombier int listoff; 529a747e4fSDavid du Colombier 539a747e4fSDavid du Colombier /* per-rpc transient information */ 549a747e4fSDavid du Colombier int pending; 559a747e4fSDavid du Colombier struct { 569a747e4fSDavid du Colombier char *arg, buf[Maxrpc], *verb; 579a747e4fSDavid du Colombier int iverb, narg, nbuf, nwant; 589a747e4fSDavid du Colombier } rpc; 599a747e4fSDavid du Colombier 609a747e4fSDavid du Colombier /* persistent (cross-rpc) information */ 619a747e4fSDavid du Colombier char err[ERRMAX]; 629a747e4fSDavid du Colombier char keyinfo[3*Maxname]; /* key request */ 639a747e4fSDavid du Colombier char **phasename; 649a747e4fSDavid du Colombier int haveai, maxphase, phase, seqnum, started; 659a747e4fSDavid du Colombier Attr *attr; 669a747e4fSDavid du Colombier AuthInfo ai; 679a747e4fSDavid du Colombier Proto *proto; 689a747e4fSDavid du Colombier State *ps; 699a747e4fSDavid du Colombier struct { /* pending or finished key confirmations */ 709a747e4fSDavid du Colombier Key *key; 719a747e4fSDavid du Colombier int canuse; 729a747e4fSDavid du Colombier ulong tag; 739a747e4fSDavid du Colombier } *conf; 749a747e4fSDavid du Colombier int nconf; 759a747e4fSDavid du Colombier }; 769a747e4fSDavid du Colombier 779a747e4fSDavid du Colombier struct Key 789a747e4fSDavid du Colombier { 799a747e4fSDavid du Colombier int ref; 809a747e4fSDavid du Colombier Attr *attr; 819a747e4fSDavid du Colombier Attr *privattr; /* private attributes, like *data */ 829a747e4fSDavid du Colombier Proto *proto; 839a747e4fSDavid du Colombier 849a747e4fSDavid du Colombier void *priv; /* protocol-specific; a parsed key, perhaps */ 85*6822557bSDavid du Colombier ulong successes; 869a747e4fSDavid du Colombier }; 879a747e4fSDavid du Colombier 88260f7b65SDavid du Colombier struct Keyinfo /* for findkey */ 89260f7b65SDavid du Colombier { 90260f7b65SDavid du Colombier Fsstate *fss; 91260f7b65SDavid du Colombier char *user; 92260f7b65SDavid du Colombier int noconf; 93260f7b65SDavid du Colombier int skip; 94260f7b65SDavid du Colombier int usedisabled; 95260f7b65SDavid du Colombier Attr *attr; 96260f7b65SDavid du Colombier }; 97260f7b65SDavid du Colombier 989a747e4fSDavid du Colombier struct Keyring 999a747e4fSDavid du Colombier { 1009a747e4fSDavid du Colombier Key **key; 1019a747e4fSDavid du Colombier int nkey; 1029a747e4fSDavid du Colombier }; 1039a747e4fSDavid du Colombier 1049a747e4fSDavid du Colombier struct Logbuf 1059a747e4fSDavid du Colombier { 1069a747e4fSDavid du Colombier Req *wait; 1079a747e4fSDavid du Colombier Req **waitlast; 1089a747e4fSDavid du Colombier int rp; 1099a747e4fSDavid du Colombier int wp; 1109a747e4fSDavid du Colombier char *msg[128]; 1119a747e4fSDavid du Colombier }; 1129a747e4fSDavid du Colombier 1139a747e4fSDavid du Colombier struct Proto 1149a747e4fSDavid du Colombier { 1159a747e4fSDavid du Colombier char *name; 1169a747e4fSDavid du Colombier int (*init)(Proto*, Fsstate*); 11770b8e010SDavid du Colombier int (*addkey)(Key*, int); 1189a747e4fSDavid du Colombier void (*closekey)(Key*); 1199a747e4fSDavid du Colombier int (*write)(Fsstate*, void*, uint); 1209a747e4fSDavid du Colombier int (*read)(Fsstate*, void*, uint*); 1219a747e4fSDavid du Colombier void (*close)(Fsstate*); 1229a747e4fSDavid du Colombier char *keyprompt; 1239a747e4fSDavid du Colombier }; 1249a747e4fSDavid du Colombier 125d9306527SDavid du Colombier extern char *invoker; 1269a747e4fSDavid du Colombier extern char *owner; 1279a747e4fSDavid du Colombier extern char *authdom; 1289a747e4fSDavid du Colombier 1299a747e4fSDavid du Colombier extern char Easproto[]; 1309a747e4fSDavid du Colombier extern char Ebadarg[]; 1319a747e4fSDavid du Colombier extern char Ebadkey[]; 1329a747e4fSDavid du Colombier extern char Enegotiation[]; 1339a747e4fSDavid du Colombier extern char Etoolarge[]; 1349a747e4fSDavid du Colombier 1359a747e4fSDavid du Colombier /* confirm.c */ 1369a747e4fSDavid du Colombier void confirmread(Req*); 1379a747e4fSDavid du Colombier void confirmflush(Req*); 1389a747e4fSDavid du Colombier int confirmwrite(char*); 1399a747e4fSDavid du Colombier void confirmqueue(Req*, Fsstate*); 1409a747e4fSDavid du Colombier void needkeyread(Req*); 1419a747e4fSDavid du Colombier void needkeyflush(Req*); 1429a747e4fSDavid du Colombier int needkeywrite(char*); 1439a747e4fSDavid du Colombier int needkeyqueue(Req*, Fsstate*); 1449a747e4fSDavid du Colombier 1459a747e4fSDavid du Colombier /* fs.c */ 1469a747e4fSDavid du Colombier extern int askforkeys; 1479a747e4fSDavid du Colombier extern char *authaddr; 1489a747e4fSDavid du Colombier extern int *confirminuse; 1499a747e4fSDavid du Colombier extern int debug; 1509a747e4fSDavid du Colombier extern int gflag; 1519a747e4fSDavid du Colombier extern int kflag; 1529a747e4fSDavid du Colombier extern int *needkeyinuse; 1539a747e4fSDavid du Colombier extern int sflag; 1549a747e4fSDavid du Colombier extern int uflag; 1559a747e4fSDavid du Colombier extern char *mtpt; 1569a747e4fSDavid du Colombier extern char *service; 1579a747e4fSDavid du Colombier extern Proto *prototab[]; 1589a747e4fSDavid du Colombier extern Keyring *ring; 1599a747e4fSDavid du Colombier 1609a747e4fSDavid du Colombier /* log.c */ 1619a747e4fSDavid du Colombier void flog(char*, ...); 1629a747e4fSDavid du Colombier #pragma varargck argpos flog 1 1639a747e4fSDavid du Colombier void logread(Req*); 1649a747e4fSDavid du Colombier void logflush(Req*); 1659a747e4fSDavid du Colombier void logbufflush(Logbuf*, Req*); 1669a747e4fSDavid du Colombier void logbufread(Logbuf*, Req*); 1679a747e4fSDavid du Colombier void logbufproc(Logbuf*); 1689a747e4fSDavid du Colombier void logbufappend(Logbuf*, char*); 1699a747e4fSDavid du Colombier void needkeyread(Req*); 1709a747e4fSDavid du Colombier void needkeyflush(Req*); 1719a747e4fSDavid du Colombier int needkeywrite(char*); 1729a747e4fSDavid du Colombier int needkeyqueue(Req*, Fsstate*); 1739a747e4fSDavid du Colombier 1749a747e4fSDavid du Colombier /* rpc.c */ 17570b8e010SDavid du Colombier int ctlwrite(char*, int); 1769a747e4fSDavid du Colombier void rpcrdwrlog(Fsstate*, char*, uint, int, int); 1779a747e4fSDavid du Colombier void rpcstartlog(Attr*, Fsstate*, int); 1789a747e4fSDavid du Colombier void rpcread(Req*); 1799a747e4fSDavid du Colombier void rpcwrite(Req*); 1809a747e4fSDavid du Colombier 1819a747e4fSDavid du Colombier /* secstore.c */ 1829a747e4fSDavid du Colombier int havesecstore(void); 1839a747e4fSDavid du Colombier int secstorefetch(char*); 1849a747e4fSDavid du Colombier 1859a747e4fSDavid du Colombier /* util.c */ 1869a747e4fSDavid du Colombier #define emalloc emalloc9p 1879a747e4fSDavid du Colombier #define estrdup estrdup9p 1889a747e4fSDavid du Colombier #define erealloc erealloc9p 1899a747e4fSDavid du Colombier #pragma varargck argpos failure 2 190260f7b65SDavid du Colombier #pragma varargck argpos findkey 3 1919a747e4fSDavid du Colombier #pragma varargck argpos setattr 2 1929a747e4fSDavid du Colombier 1939a747e4fSDavid du Colombier int _authdial(char*, char*); 1949a747e4fSDavid du Colombier void askuser(char*); 1955d459b5aSDavid du Colombier int attrnamefmt(Fmt *fmt); 1969a747e4fSDavid du Colombier int canusekey(Fsstate*, Key*); 1979a747e4fSDavid du Colombier void closekey(Key*); 1989a747e4fSDavid du Colombier uchar *convAI2M(AuthInfo*, uchar*, int); 199260f7b65SDavid du Colombier void disablekey(Key*); 2002ebbfa15SDavid du Colombier char *estrappend(char*, char*, ...); 2012ebbfa15SDavid du Colombier #pragma varargck argpos estrappend 2 2029a747e4fSDavid du Colombier int failure(Fsstate*, char*, ...); 203260f7b65SDavid du Colombier Keyinfo* mkkeyinfo(Keyinfo*, Fsstate*, Attr*); 204260f7b65SDavid du Colombier int findkey(Key**, Keyinfo*, char*, ...); 2059a747e4fSDavid du Colombier int findp9authkey(Key**, Fsstate*); 2069a747e4fSDavid du Colombier Proto *findproto(char*); 2079a747e4fSDavid du Colombier char *getnvramkey(int, char**); 2083ff48bf5SDavid du Colombier void initcap(void); 2099a747e4fSDavid du Colombier int isclient(char*); 2109a747e4fSDavid du Colombier int matchattr(Attr*, Attr*, Attr*); 2119a747e4fSDavid du Colombier void memrandom(void*, int); 2123ff48bf5SDavid du Colombier char *mkcap(char*, char*); 2139a747e4fSDavid du Colombier int phaseerror(Fsstate*, char*); 2149a747e4fSDavid du Colombier char *phasename(Fsstate*, int, char*); 2159a747e4fSDavid du Colombier void promptforhostowner(void); 2162ebbfa15SDavid du Colombier char *readcons(char*, char*, int); 21770b8e010SDavid du Colombier int replacekey(Key*, int before); 2189a747e4fSDavid du Colombier char *safecpy(char*, char*, int); 2199a747e4fSDavid du Colombier int secdial(void); 2209a747e4fSDavid du Colombier Attr *setattr(Attr*, char*, ...); 2219a747e4fSDavid du Colombier Attr *setattrs(Attr*, Attr*); 2229a747e4fSDavid du Colombier void sethostowner(void); 2239a747e4fSDavid du Colombier void setmalloctaghere(void*); 2249a747e4fSDavid du Colombier int smatch(char*, char*); 2259a747e4fSDavid du Colombier Attr *sortattr(Attr*); 2269a747e4fSDavid du Colombier int toosmall(Fsstate*, uint); 2279a747e4fSDavid du Colombier void writehostowner(char*); 2289a747e4fSDavid du Colombier 2299a747e4fSDavid du Colombier /* protocols */ 2309a747e4fSDavid du Colombier extern Proto apop, cram; /* apop.c */ 2319a747e4fSDavid du Colombier extern Proto p9any, p9sk1, p9sk2; /* p9sk.c */ 2329a747e4fSDavid du Colombier extern Proto chap, mschap; /* chap.c */ 2339a747e4fSDavid du Colombier extern Proto p9cr, vnc; /* p9cr.c */ 2349a747e4fSDavid du Colombier extern Proto pass; /* pass.c */ 2352ebbfa15SDavid du Colombier extern Proto rsa; /* rsa.c */ 236fb7f0c93SDavid du Colombier extern Proto wep; /* wep.c */ 23749eeb88aSDavid du Colombier /* extern Proto srs; /* srs.c */ 2385ab4dd4cSDavid du Colombier extern Proto httpdigest; /* httpdigest.c */ 239