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