xref: /plan9/sys/src/cmd/auth/convkeys.c (revision 4727cc49fce24ba84abe29b3bce2810b82f17507)
1 #include <u.h>
2 #include <libc.h>
3 #include <ctype.h>
4 #include <authsrv.h>
5 #include <mp.h>
6 #include <libsec.h>
7 #include <bio.h>
8 #include "authcmdlib.h"
9 
10 char	authkey[DESKEYLEN];
11 int	verb;
12 int	usepass;
13 
14 int	convert(char*, char*, int);
15 int	dofcrypt(int, char*, char*, int);
16 void	usage(void);
17 
18 void
main(int argc,char * argv[])19 main(int argc, char *argv[])
20 {
21 	Dir *d;
22 	char *p, *file, key[DESKEYLEN];
23 	int fd, len;
24 
25 	ARGBEGIN{
26 	case 'p':
27 		usepass = 1;
28 		break;
29 	case 'v':
30 		verb = 1;
31 		break;
32 	default:
33 		usage();
34 	}ARGEND
35 
36 	if(argc != 1)
37 		usage();
38 	file = argv[0];
39 
40 	/* get original key */
41 	if(usepass){
42 		print("enter password file is encoded with\n");
43 		getpass(authkey, nil, 0, 1);
44 	} else
45 		getauthkey(authkey);
46 	if(!verb){
47 		print("enter password to reencode with\n");
48 		getpass(key, nil, 0, 1);
49 	}
50 
51 	fd = open(file, ORDWR);
52 	if(fd < 0)
53 		error("can't open %s: %r\n", file);
54 	d = dirfstat(fd);
55 	if(d == nil)
56 		error("can't stat %s: %r\n", file);
57 	len = d->length;
58 	p = malloc(len);
59 	if(!p)
60 		error("out of memory");
61 	if(read(fd, p, len) != len)
62 		error("can't read key file: %r\n");
63 	len = convert(p, key, len);
64 	if(verb)
65 		exits(0);
66 	if(pwrite(fd, p, len, 0) != len)
67 		error("can't write key file: %r\n");
68 	close(fd);
69 	exits(0);
70 }
71 
72 void
randombytes(uchar * p,int len)73 randombytes(uchar *p, int len)
74 {
75 	int i, fd;
76 
77 	fd = open("/dev/random", OREAD);
78 	if(fd < 0){
79 		fprint(2, "convkeys: can't open /dev/random, using rand()\n");
80 		srand(time(0));
81 		for(i = 0; i < len; i++)
82 			p[i] = rand();
83 		return;
84 	}
85 	read(fd, p, len);
86 	close(fd);
87 }
88 
89 void
oldCBCencrypt(char * key7,char * p,int len)90 oldCBCencrypt(char *key7, char *p, int len)
91 {
92 	uchar ivec[8];
93 	uchar key[8];
94 	DESstate s;
95 
96 	memset(ivec, 0, 8);
97 	des56to64((uchar*)key7, key);
98 	setupDESstate(&s, key, ivec);
99 	desCBCencrypt((uchar*)p, len, &s);
100 }
101 
102 void
oldCBCdecrypt(char * key7,char * p,int len)103 oldCBCdecrypt(char *key7, char *p, int len)
104 {
105 	uchar ivec[8];
106 	uchar key[8];
107 	DESstate s;
108 
109 	memset(ivec, 0, 8);
110 	des56to64((uchar*)key7, key);
111 	setupDESstate(&s, key, ivec);
112 	desCBCdecrypt((uchar*)p, len, &s);
113 
114 }
115 
116 static int
badname(char * s)117 badname(char *s)
118 {
119 	int n;
120 	Rune r;
121 
122 	for (; *s != '\0'; s += n) {
123 		n = chartorune(&r, s);
124 		if (n == 1 && r == Runeerror)
125 			return 1;
126 	}
127 	return 0;
128 }
129 
130 int
convert(char * p,char * key,int len)131 convert(char *p, char *key, int len)
132 {
133 	int i;
134 
135 	len -= KEYDBOFF;
136 	if(len % KEYDBLEN){
137 		fprint(2, "convkeys: file odd length; not converting %d bytes\n",
138 			len % KEYDBLEN);
139 		len -= len % KEYDBLEN;
140 	}
141 	len += KEYDBOFF;
142 	oldCBCdecrypt(authkey, p, len);
143 	for(i = KEYDBOFF; i < len; i += KEYDBLEN)
144 		if (badname(&p[i])) {
145 			print("bad name %.30s... - aborting\n", &p[i]);
146 			return 0;
147 		}
148 	if(verb)
149 		for(i = KEYDBOFF; i < len; i += KEYDBLEN)
150 			print("%s\n", &p[i]);
151 
152 	randombytes((uchar*)p, 8);
153 	oldCBCencrypt(key, p, len);
154 	return len;
155 }
156 
157 void
usage(void)158 usage(void)
159 {
160 	fprint(2, "usage: convkeys keyfile\n");
161 	exits("usage");
162 }
163