xref: /plan9/sys/src/cmd/auth/convkeys2.c (revision 5979f96214a33481f1724725761f2ef3585d2237)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <mp.h>
47dd7cddfSDavid du Colombier #include <libsec.h>
59a747e4fSDavid du Colombier #include <authsrv.h>
6*5979f962SDavid du Colombier #include <bio.h>
79a747e4fSDavid du Colombier #include "authcmdlib.h"
87dd7cddfSDavid du Colombier 
97dd7cddfSDavid du Colombier char	authkey[DESKEYLEN];
107dd7cddfSDavid du Colombier int	verb;
117dd7cddfSDavid du Colombier int	usepass;
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier int	convert(char*, char*, char*, int);
147dd7cddfSDavid du Colombier int	dofcrypt(int, char*, char*, int);
157dd7cddfSDavid du Colombier void	usage(void);
167dd7cddfSDavid du Colombier void	randombytes(uchar*, int);
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier void
main(int argc,char * argv[])197dd7cddfSDavid du Colombier main(int argc, char *argv[])
207dd7cddfSDavid du Colombier {
219a747e4fSDavid du Colombier 	Dir *d;
227dd7cddfSDavid du Colombier 	char *p, *np, *file, key[DESKEYLEN];
237dd7cddfSDavid du Colombier 	int fd, len;
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier 	ARGBEGIN{
267dd7cddfSDavid du Colombier 	case 'v':
277dd7cddfSDavid du Colombier 		verb = 1;
287dd7cddfSDavid du Colombier 		break;
297dd7cddfSDavid du Colombier 	case 'p':
307dd7cddfSDavid du Colombier 		usepass = 1;
317dd7cddfSDavid du Colombier 		break;
327dd7cddfSDavid du Colombier 	default:
337dd7cddfSDavid du Colombier 		usage();
347dd7cddfSDavid du Colombier 	}ARGEND
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier 	if(argc != 1)
377dd7cddfSDavid du Colombier 		usage();
387dd7cddfSDavid du Colombier 	file = argv[0];
397dd7cddfSDavid du Colombier 
407dd7cddfSDavid du Colombier 	/* get original key */
417dd7cddfSDavid du Colombier 	if(usepass){
427dd7cddfSDavid du Colombier 		print("enter password file is encoded with\n");
4380ee5cbfSDavid du Colombier 		getpass(authkey, nil, 0, 1);
447dd7cddfSDavid du Colombier 	} else
457dd7cddfSDavid du Colombier 		getauthkey(authkey);
467dd7cddfSDavid du Colombier 	print("enter password to reencode with\n");
4780ee5cbfSDavid du Colombier 	getpass(key, nil, 0, 1);
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier 	fd = open(file, ORDWR);
507dd7cddfSDavid du Colombier 	if(fd < 0)
517dd7cddfSDavid du Colombier 		error("can't open %s: %r\n", file);
529a747e4fSDavid du Colombier 	d = dirfstat(fd);
539a747e4fSDavid du Colombier 	if(d == nil)
547dd7cddfSDavid du Colombier 		error("can't stat %s: %r\n", file);
559a747e4fSDavid du Colombier 	len = d->length;
567dd7cddfSDavid du Colombier 	p = malloc(len);
577dd7cddfSDavid du Colombier 	if(!p)
587dd7cddfSDavid du Colombier 		error("out of memory");
597dd7cddfSDavid du Colombier 	np = malloc((len/OKEYDBLEN)*KEYDBLEN + KEYDBOFF);
607dd7cddfSDavid du Colombier 	if(!np)
617dd7cddfSDavid du Colombier 		error("out of memory");
627dd7cddfSDavid du Colombier 	if(read(fd, p, len) != len)
637dd7cddfSDavid du Colombier 		error("can't read key file: %r\n");
647dd7cddfSDavid du Colombier 	len = convert(p, np, key, len);
657dd7cddfSDavid du Colombier 	if(verb)
667dd7cddfSDavid du Colombier 		exits(0);
679a747e4fSDavid du Colombier 	if(pwrite(fd, np, len, 0) != len)
687dd7cddfSDavid du Colombier 		error("can't write key file: %r\n");
697dd7cddfSDavid du Colombier 	close(fd);
707dd7cddfSDavid du Colombier 	exits(0);
717dd7cddfSDavid du Colombier }
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier void
oldCBCencrypt(char * key7,char * p,int len)747dd7cddfSDavid du Colombier oldCBCencrypt(char *key7, char *p, int len)
757dd7cddfSDavid du Colombier {
767dd7cddfSDavid du Colombier 	uchar ivec[8];
777dd7cddfSDavid du Colombier 	uchar key[8];
787dd7cddfSDavid du Colombier 	DESstate s;
797dd7cddfSDavid du Colombier 
807dd7cddfSDavid du Colombier 	memset(ivec, 0, 8);
817dd7cddfSDavid du Colombier 	des56to64((uchar*)key7, key);
827dd7cddfSDavid du Colombier 	setupDESstate(&s, key, ivec);
837dd7cddfSDavid du Colombier 	desCBCencrypt((uchar*)p, len, &s);
847dd7cddfSDavid du Colombier }
857dd7cddfSDavid du Colombier 
867dd7cddfSDavid du Colombier int
convert(char * p,char * np,char * key,int len)877dd7cddfSDavid du Colombier convert(char *p, char *np, char *key, int len)
887dd7cddfSDavid du Colombier {
897dd7cddfSDavid du Colombier 	int i, off, noff;
907dd7cddfSDavid du Colombier 
917dd7cddfSDavid du Colombier 	if(len % OKEYDBLEN)
92d854de59SDavid du Colombier 		fprint(2, "convkeys2: file odd length; not converting %d bytes\n",
93d854de59SDavid du Colombier 			len % KEYDBLEN);
947dd7cddfSDavid du Colombier 	len /= OKEYDBLEN;
957dd7cddfSDavid du Colombier 	for(i = 0; i < len; i ++){
967dd7cddfSDavid du Colombier 		off = i*OKEYDBLEN;
977dd7cddfSDavid du Colombier 		noff = KEYDBOFF+i*(KEYDBLEN);
987dd7cddfSDavid du Colombier 		decrypt(authkey, &p[off], OKEYDBLEN);
997dd7cddfSDavid du Colombier 		memmove(&np[noff], &p[off], OKEYDBLEN);
1007dd7cddfSDavid du Colombier 		memset(&np[noff-SECRETLEN], 0, SECRETLEN);
1017dd7cddfSDavid du Colombier 		if(verb)
1027dd7cddfSDavid du Colombier 			print("%s\n", &p[off]);
1037dd7cddfSDavid du Colombier 	}
1047dd7cddfSDavid du Colombier 	randombytes((uchar*)np, KEYDBOFF);
1057dd7cddfSDavid du Colombier 	len = (len*KEYDBLEN) + KEYDBOFF;
1067dd7cddfSDavid du Colombier 	oldCBCencrypt(key, np, len);
1077dd7cddfSDavid du Colombier 	return len;
1087dd7cddfSDavid du Colombier }
1097dd7cddfSDavid du Colombier 
1107dd7cddfSDavid du Colombier void
usage(void)1117dd7cddfSDavid du Colombier usage(void)
1127dd7cddfSDavid du Colombier {
113d854de59SDavid du Colombier 	fprint(2, "usage: convkeys2 keyfile\n");
1147dd7cddfSDavid du Colombier 	exits("usage");
1157dd7cddfSDavid du Colombier }
1167dd7cddfSDavid du Colombier 
1177dd7cddfSDavid du Colombier void
randombytes(uchar * p,int len)1187dd7cddfSDavid du Colombier randombytes(uchar *p, int len)
1197dd7cddfSDavid du Colombier {
1207dd7cddfSDavid du Colombier 	int i, fd;
1217dd7cddfSDavid du Colombier 
1227dd7cddfSDavid du Colombier 	fd = open("/dev/random", OREAD);
1237dd7cddfSDavid du Colombier 	if(fd < 0){
124d854de59SDavid du Colombier 		fprint(2, "convkeys2: can't open /dev/random, using rand()\n");
1257dd7cddfSDavid du Colombier 		srand(time(0));
1267dd7cddfSDavid du Colombier 		for(i = 0; i < len; i++)
1277dd7cddfSDavid du Colombier 			p[i] = rand();
1287dd7cddfSDavid du Colombier 		return;
1297dd7cddfSDavid du Colombier 	}
1307dd7cddfSDavid du Colombier 	read(fd, p, len);
1317dd7cddfSDavid du Colombier 	close(fd);
1327dd7cddfSDavid du Colombier }
133