xref: /inferno-os/appl/cmd/auth/verify.b (revision d6b4eae8eb0a5ca3119414005e483fedd63a62d6)
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