diff options
Diffstat (limited to 'appl/cmd/auth/verify.b')
| -rw-r--r-- | appl/cmd/auth/verify.b | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/appl/cmd/auth/verify.b b/appl/cmd/auth/verify.b new file mode 100644 index 00000000..d829a76c --- /dev/null +++ b/appl/cmd/auth/verify.b @@ -0,0 +1,85 @@ +implement Verify; + +include "sys.m"; + sys: Sys; + +include "keyring.m"; + kr: Keyring; + +include "draw.m"; + +Verify: module +{ + init: fn(ctxt: ref Draw->Context, argv: list of string); +}; + +stderr, stdin: ref Sys->FD; + +pro := array[] of { + "alpha", "bravo", "charlie", "delta", "echo", "foxtrot", "golf", + "hotel", "india", "juliet", "kilo", "lima", "mike", "nancy", "oscar", + "papa", "quebec", "romeo", "sierra", "tango", "uniform", + "victor", "whisky", "xray", "yankee", "zulu" +}; + +init(nil: ref Draw->Context, args: list of string) +{ + sys = load Sys Sys->PATH; + kr = load Keyring Keyring->PATH; + + stdin = sys->fildes(0); + stderr = sys->fildes(2); + + if(args != nil) + args = tl args; + if(args == nil){ + sys->fprint(stderr, "usage: verify boxid\n"); + raise "fail:usage"; + } + + sys->pctl(Sys->FORKNS, nil); + if(sys->chdir("/keydb") < 0){ + sys->fprint(stderr, "signer: no key database\n"); + raise "fail:no keydb"; + } + + boxid := hd args; + file := "signed/"+boxid; + fd := sys->open(file, Sys->OREAD); + if(fd == nil){ + sys->fprint(stderr, "signer: can't open %s: %r\n", file); + raise "fail:no certificate"; + } + certbuf := kr->getmsg(fd); + digest := kr->getmsg(fd); + if(digest == nil || certbuf == nil){ + sys->fprint(stderr, "signer: can't read %s: %r\n", file); + raise "fail:bad certificate"; + } + + s: string; + for(i := 0; i < len digest; i++){ + s = s + (string (2*i)) + ": " + pro[((int digest[i])>>4)%len pro] + "\t"; + s = s + (string (2*i+1)) + ": " + pro[(int digest[i])%len pro] + "\n"; + } + + sys->print("%s\naccept (y or n)? ", s); + buf := array[5] of byte; + n := sys->read(stdin, buf, len buf); + if(n < 1 || buf[0] != byte 'y'){ + sys->print("\nrejected\n"); + raise "fail:rejected"; + } + sys->print("\naccepted\n"); + + nfile := "countersigned/"+boxid; + fd = sys->create(nfile, Sys->OWRITE, 8r600); + if(fd == nil){ + sys->fprint(stderr, "signer: can't create %s: %r\n", nfile); + raise "fail:create"; + } + if(kr->sendmsg(fd, certbuf, len certbuf) < 0){ + sys->fprint(stderr, "signer: can't write %s: %r\n", nfile); + raise "fail:write"; + } +} |
