xref: /plan9/sys/src/cmd/auth/convkeys.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include "authsrv.h"
5 
6 char	authkey[DESKEYLEN];
7 int	verb;
8 int	usepass;
9 
10 int	convert(char*, char*, int);
11 int	dofcrypt(int, char*, char*, int);
12 void	usage(void);
13 
14 void
15 main(int argc, char *argv[])
16 {
17 	Dir d;
18 	char *p, *file, key[DESKEYLEN];
19 	int fd, len;
20 
21 	ARGBEGIN{
22 	case 'v':
23 		verb = 1;
24 		break;
25 	case 'p':
26 		usepass = 1;
27 		break;
28 	default:
29 		usage();
30 	}ARGEND
31 
32 	if(argc != 1)
33 		usage();
34 	file = argv[0];
35 
36 	/* get original key */
37 	if(usepass){
38 		print("enter password file is encoded with\n");
39 		getpass(authkey, 0);
40 	} else
41 		getauthkey(authkey);
42 	print("enter password to reencode with\n");
43 	getpass(key, 0);
44 
45 	fd = open(file, ORDWR);
46 	if(fd < 0)
47 		error("can't open %s: %r\n", file);
48 	if(dirfstat(fd, &d) < 0)
49 		error("can't stat %s: %r\n", file);
50 	len = d.length;
51 	p = malloc(len);
52 	if(!p)
53 		error("out of memory");
54 	if(read(fd, p, len) != len)
55 		error("can't read key file: %r\n");
56 	len = convert(p, key, len);
57 	if(verb)
58 		exits(0);
59 	if(seek(fd, 0, 0) < 0 || write(fd, p, len) != len)
60 		error("can't write key file: %r\n");
61 	close(fd);
62 	exits(0);
63 }
64 
65 int
66 convert(char *p, char *key, int len)
67 {
68 	int i;
69 
70 	if(len % KEYDBLEN){
71 		fprint(2, "file odd length; not converting %d bytes\n", len % KEYDBLEN);
72 		len -= len % KEYDBLEN;
73 	}
74 	for(i = 0; i < len; i += KEYDBLEN){
75 		decrypt(authkey, &p[i], KEYDBLEN);
76 		if(verb)
77 			print("%s\n", &p[i]);
78 		else
79 			encrypt(key, &p[i], KEYDBLEN);
80 	}
81 	return len;
82 }
83 
84 void
85 usage(void)
86 {
87 	fprint(2, "usage: convkeys keyfile\n");
88 	exits("usage");
89 }
90