/* * Tiny version of secstore, for a local KFS. */ #include #include #include #include #include #define max(X, Y) ((X) > (Y) ? (X) : (Y)) #define min(X, Y) ((X) < (Y) ? (X) : (Y)) void usage(void) { fprint(2, "Usage: µsecstore [-u user] {-r|-w} file.\n"); exits("usage"); } char * getpass(char *u, char *s) { UserPasswd *p; p = auth_getuserpasswd(auth_getkey, "proto=pass service=µsecstore server=%q user=%q", s, u); if (p == nil) { exits("no key"); } return(p->passwd); } char * mkkey(char *p) { uchar digest[MD5dlen]; static char tmp[128]; md5((uchar *)p, strlen(p), digest, nil); enc16(tmp, sizeof tmp, digest, sizeof digest); return(tmp); } void µsread(char *f) { close(0); if (open(f, OREAD) < 0) { sysfatal("can't redirect input from %s: %r\n", f); } } void µswrite(char *f) { int fd; close(1); fd = open(f, OWRITE | OTRUNC); if (fd < 0) { fd = create(f, OWRITE, 0600); } if (fd < 0) { sysfatal("couldn't open or create %s: %r"); } } void main(int argc, char *argv[]) { char *f, *o, *p, *s, *u; void (*m)(char *f); m = nil; u = getuser(); s = sysname(); if (s == nil) { s = "localhost"; } ARGBEGIN { case 'u': u = EARGF(usage); break; case 'r': if (m != nil) usage(); o = "-d"; m = µsread; break; case 'w': if (m != nil) usage(); o = "-e"; m = µswrite; break; } ARGEND f = argv[0]; if (f == nil || m == nil || u == nil || s == nil) { usage(); } p = getpass(u, s); rfork(RFCENVG); (*m)(f); putenv("HEX", mkkey(p)); execl("/bin/auth/aescbc", "aescbc", o, nil); exits(0); }