xref: /plan9/sys/src/cmd/auth/netkey.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier #include <auth.h>
4*219b2ee8SDavid du Colombier 
5*219b2ee8SDavid du Colombier int	readln(char*, char*, int);
6*219b2ee8SDavid du Colombier 
7*219b2ee8SDavid du Colombier void
8*219b2ee8SDavid du Colombier error(char *fmt, ...)
9*219b2ee8SDavid du Colombier {
10*219b2ee8SDavid du Colombier 	char buf[8192], *s;
11*219b2ee8SDavid du Colombier 
12*219b2ee8SDavid du Colombier 	s = buf;
13*219b2ee8SDavid du Colombier 	s += sprint(s, "netkey: ");
14*219b2ee8SDavid du Colombier 	s = doprint(s, buf + sizeof(buf) / sizeof(*buf), fmt, &fmt + 1);
15*219b2ee8SDavid du Colombier 	*s++ = '\n';
16*219b2ee8SDavid du Colombier 	write(2, buf, s - buf);
17*219b2ee8SDavid du Colombier 	exits(buf);
18*219b2ee8SDavid du Colombier }
19*219b2ee8SDavid du Colombier 
20*219b2ee8SDavid du Colombier void
21*219b2ee8SDavid du Colombier usage(void)
22*219b2ee8SDavid du Colombier {
23*219b2ee8SDavid du Colombier 	fprint(2, "usage: netkey\n");
24*219b2ee8SDavid du Colombier 	exits("usage");
25*219b2ee8SDavid du Colombier }
26*219b2ee8SDavid du Colombier 
27*219b2ee8SDavid du Colombier void
28*219b2ee8SDavid du Colombier main(int argc, char *argv[])
29*219b2ee8SDavid du Colombier {
30*219b2ee8SDavid du Colombier 	char buf[32], pass[32], key[DESKEYLEN];
31*219b2ee8SDavid du Colombier 	char *s;
32*219b2ee8SDavid du Colombier 	int n;
33*219b2ee8SDavid du Colombier 
34*219b2ee8SDavid du Colombier 	ARGBEGIN{
35*219b2ee8SDavid du Colombier 	default:
36*219b2ee8SDavid du Colombier 		usage();
37*219b2ee8SDavid du Colombier 	}ARGEND
38*219b2ee8SDavid du Colombier 	if(argc)
39*219b2ee8SDavid du Colombier 		usage();
40*219b2ee8SDavid du Colombier 
41*219b2ee8SDavid du Colombier 	s = getenv("service");
42*219b2ee8SDavid du Colombier 	if(s && strcmp(s, "cpu") == 0){
43*219b2ee8SDavid du Colombier 		fprint(2, "netkey must not be run on the cpu server\n");
44*219b2ee8SDavid du Colombier 		exits("boofhead");
45*219b2ee8SDavid du Colombier 	}
46*219b2ee8SDavid du Colombier 
47*219b2ee8SDavid du Colombier 	readln("Password: ", pass, sizeof pass);
48*219b2ee8SDavid du Colombier 	passtokey(key, pass);
49*219b2ee8SDavid du Colombier 
50*219b2ee8SDavid du Colombier 	for(;;){
51*219b2ee8SDavid du Colombier 		print("challenge: ");
52*219b2ee8SDavid du Colombier 		n = read(0, buf, sizeof buf - 1);
53*219b2ee8SDavid du Colombier 		if(n <= 0)
54*219b2ee8SDavid du Colombier 			exits(0);
55*219b2ee8SDavid du Colombier 		buf[n] = '\0';
56*219b2ee8SDavid du Colombier 		n = strtol(buf, 0, 10);
57*219b2ee8SDavid du Colombier 		sprint(buf, "%d", n);
58*219b2ee8SDavid du Colombier 		netcrypt(key, buf);
59*219b2ee8SDavid du Colombier 		print("response: %s\n", buf);
60*219b2ee8SDavid du Colombier 	}
61*219b2ee8SDavid du Colombier }
62*219b2ee8SDavid du Colombier 
63*219b2ee8SDavid du Colombier int
64*219b2ee8SDavid du Colombier readln(char *prompt, char *line, int len)
65*219b2ee8SDavid du Colombier {
66*219b2ee8SDavid du Colombier 	char *p;
67*219b2ee8SDavid du Colombier 	int fd, ctl, n, nr;
68*219b2ee8SDavid du Colombier 
69*219b2ee8SDavid du Colombier 	fd = open("/dev/cons", ORDWR);
70*219b2ee8SDavid du Colombier 	if(fd < 0)
71*219b2ee8SDavid du Colombier 		error("couldn't open cons");
72*219b2ee8SDavid du Colombier 	ctl = open("/dev/consctl", OWRITE);
73*219b2ee8SDavid du Colombier 	if(ctl < 0)
74*219b2ee8SDavid du Colombier 		error("couldn't set raw mode");
75*219b2ee8SDavid du Colombier 	write(ctl, "rawon", 5);
76*219b2ee8SDavid du Colombier 	fprint(fd, "%s", prompt);
77*219b2ee8SDavid du Colombier 	nr = 0;
78*219b2ee8SDavid du Colombier 	p = line;
79*219b2ee8SDavid du Colombier 	for(;;){
80*219b2ee8SDavid du Colombier 		n = read(fd, p, 1);
81*219b2ee8SDavid du Colombier 		if(n < 0){
82*219b2ee8SDavid du Colombier 			close(fd);
83*219b2ee8SDavid du Colombier 			close(ctl);
84*219b2ee8SDavid du Colombier 			return -1;
85*219b2ee8SDavid du Colombier 		}
86*219b2ee8SDavid du Colombier 		if(n == 0 || *p == '\n' || *p == '\r'){
87*219b2ee8SDavid du Colombier 			*p = '\0';
88*219b2ee8SDavid du Colombier 			write(fd, "\n", 1);
89*219b2ee8SDavid du Colombier 			close(fd);
90*219b2ee8SDavid du Colombier 			close(ctl);
91*219b2ee8SDavid du Colombier 			return nr;
92*219b2ee8SDavid du Colombier 		}
93*219b2ee8SDavid du Colombier 		if(*p == '\b'){
94*219b2ee8SDavid du Colombier 			if(nr > 0){
95*219b2ee8SDavid du Colombier 				nr--;
96*219b2ee8SDavid du Colombier 				p--;
97*219b2ee8SDavid du Colombier 			}
98*219b2ee8SDavid du Colombier 		}else if(*p == 21){		/* cntrl-u */
99*219b2ee8SDavid du Colombier 			fprint(fd, "\n%s", prompt);
100*219b2ee8SDavid du Colombier 			nr = 0;
101*219b2ee8SDavid du Colombier 			p = line;
102*219b2ee8SDavid du Colombier 		}else{
103*219b2ee8SDavid du Colombier 			nr++;
104*219b2ee8SDavid du Colombier 			p++;
105*219b2ee8SDavid du Colombier 		}
106*219b2ee8SDavid du Colombier 		if(nr == len){
107*219b2ee8SDavid du Colombier 			fprint(fd, "line too long; try again\n%s", prompt);
108*219b2ee8SDavid du Colombier 			nr = 0;
109*219b2ee8SDavid du Colombier 			p = line;
110*219b2ee8SDavid du Colombier 		}
111*219b2ee8SDavid du Colombier 	}
112*219b2ee8SDavid du Colombier 	return -1;
113*219b2ee8SDavid du Colombier }
114