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