1implement Verify; 2 3include "sys.m"; 4 sys: Sys; 5 6include "keyring.m"; 7 kr: Keyring; 8 9include "draw.m"; 10 11Verify: module 12{ 13 init: fn(ctxt: ref Draw->Context, argv: list of string); 14}; 15 16stderr, stdin: ref Sys->FD; 17 18pro := array[] of { 19 "alpha", "bravo", "charlie", "delta", "echo", "foxtrot", "golf", 20 "hotel", "india", "juliet", "kilo", "lima", "mike", "nancy", "oscar", 21 "papa", "quebec", "romeo", "sierra", "tango", "uniform", 22 "victor", "whisky", "xray", "yankee", "zulu" 23}; 24 25init(nil: ref Draw->Context, args: list of string) 26{ 27 sys = load Sys Sys->PATH; 28 kr = load Keyring Keyring->PATH; 29 30 stdin = sys->fildes(0); 31 stderr = sys->fildes(2); 32 33 if(args != nil) 34 args = tl args; 35 if(args == nil){ 36 sys->fprint(stderr, "usage: verify boxid\n"); 37 raise "fail:usage"; 38 } 39 40 sys->pctl(Sys->FORKNS, nil); 41 if(sys->chdir("/keydb") < 0){ 42 sys->fprint(stderr, "signer: no key database\n"); 43 raise "fail:no keydb"; 44 } 45 46 boxid := hd args; 47 file := "signed/"+boxid; 48 fd := sys->open(file, Sys->OREAD); 49 if(fd == nil){ 50 sys->fprint(stderr, "signer: can't open %s: %r\n", file); 51 raise "fail:no certificate"; 52 } 53 certbuf := kr->getmsg(fd); 54 digest := kr->getmsg(fd); 55 if(digest == nil || certbuf == nil){ 56 sys->fprint(stderr, "signer: can't read %s: %r\n", file); 57 raise "fail:bad certificate"; 58 } 59 60 s: string; 61 for(i := 0; i < len digest; i++){ 62 s = s + (string (2*i)) + ": " + pro[((int digest[i])>>4)%len pro] + "\t"; 63 s = s + (string (2*i+1)) + ": " + pro[(int digest[i])%len pro] + "\n"; 64 } 65 66 sys->print("%s\naccept (y or n)? ", s); 67 buf := array[5] of byte; 68 n := sys->read(stdin, buf, len buf); 69 if(n < 1 || buf[0] != byte 'y'){ 70 sys->print("\nrejected\n"); 71 raise "fail:rejected"; 72 } 73 sys->print("\naccepted\n"); 74 75 nfile := "countersigned/"+boxid; 76 fd = sys->create(nfile, Sys->OWRITE, 8r600); 77 if(fd == nil){ 78 sys->fprint(stderr, "signer: can't create %s: %r\n", nfile); 79 raise "fail:create"; 80 } 81 if(kr->sendmsg(fd, certbuf, len certbuf) < 0){ 82 sys->fprint(stderr, "signer: can't write %s: %r\n", nfile); 83 raise "fail:write"; 84 } 85} 86