1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3*4727cc49SDavid du Colombier #include <ctype.h>
49a747e4fSDavid du Colombier #include <authsrv.h>
57dd7cddfSDavid du Colombier #include <mp.h>
67dd7cddfSDavid du Colombier #include <libsec.h>
75979f962SDavid du Colombier #include <bio.h>
89a747e4fSDavid du Colombier #include "authcmdlib.h"
9219b2ee8SDavid du Colombier
10219b2ee8SDavid du Colombier char authkey[DESKEYLEN];
11219b2ee8SDavid du Colombier int verb;
12219b2ee8SDavid du Colombier int usepass;
13219b2ee8SDavid du Colombier
14219b2ee8SDavid du Colombier int convert(char*, char*, int);
15219b2ee8SDavid du Colombier int dofcrypt(int, char*, char*, int);
16219b2ee8SDavid du Colombier void usage(void);
17219b2ee8SDavid du Colombier
18219b2ee8SDavid du Colombier void
main(int argc,char * argv[])19219b2ee8SDavid du Colombier main(int argc, char *argv[])
20219b2ee8SDavid du Colombier {
219a747e4fSDavid du Colombier Dir *d;
22219b2ee8SDavid du Colombier char *p, *file, key[DESKEYLEN];
23219b2ee8SDavid du Colombier int fd, len;
24219b2ee8SDavid du Colombier
25219b2ee8SDavid du Colombier ARGBEGIN{
26219b2ee8SDavid du Colombier case 'p':
27219b2ee8SDavid du Colombier usepass = 1;
28219b2ee8SDavid du Colombier break;
29*4727cc49SDavid du Colombier case 'v':
30*4727cc49SDavid du Colombier verb = 1;
31*4727cc49SDavid du Colombier break;
32219b2ee8SDavid du Colombier default:
33219b2ee8SDavid du Colombier usage();
34219b2ee8SDavid du Colombier }ARGEND
35219b2ee8SDavid du Colombier
36219b2ee8SDavid du Colombier if(argc != 1)
37219b2ee8SDavid du Colombier usage();
38219b2ee8SDavid du Colombier file = argv[0];
39219b2ee8SDavid du Colombier
40219b2ee8SDavid du Colombier /* get original key */
41219b2ee8SDavid du Colombier if(usepass){
42219b2ee8SDavid du Colombier print("enter password file is encoded with\n");
4380ee5cbfSDavid du Colombier getpass(authkey, nil, 0, 1);
44219b2ee8SDavid du Colombier } else
45219b2ee8SDavid du Colombier getauthkey(authkey);
467dd7cddfSDavid du Colombier if(!verb){
47219b2ee8SDavid du Colombier print("enter password to reencode with\n");
4880ee5cbfSDavid du Colombier getpass(key, nil, 0, 1);
497dd7cddfSDavid du Colombier }
50219b2ee8SDavid du Colombier
51219b2ee8SDavid du Colombier fd = open(file, ORDWR);
52219b2ee8SDavid du Colombier if(fd < 0)
53219b2ee8SDavid du Colombier error("can't open %s: %r\n", file);
549a747e4fSDavid du Colombier d = dirfstat(fd);
559a747e4fSDavid du Colombier if(d == nil)
56219b2ee8SDavid du Colombier error("can't stat %s: %r\n", file);
579a747e4fSDavid du Colombier len = d->length;
58219b2ee8SDavid du Colombier p = malloc(len);
59219b2ee8SDavid du Colombier if(!p)
60219b2ee8SDavid du Colombier error("out of memory");
61219b2ee8SDavid du Colombier if(read(fd, p, len) != len)
62219b2ee8SDavid du Colombier error("can't read key file: %r\n");
63219b2ee8SDavid du Colombier len = convert(p, key, len);
64219b2ee8SDavid du Colombier if(verb)
65219b2ee8SDavid du Colombier exits(0);
669a747e4fSDavid du Colombier if(pwrite(fd, p, len, 0) != len)
67219b2ee8SDavid du Colombier error("can't write key file: %r\n");
68219b2ee8SDavid du Colombier close(fd);
69219b2ee8SDavid du Colombier exits(0);
70219b2ee8SDavid du Colombier }
71219b2ee8SDavid du Colombier
727dd7cddfSDavid du Colombier void
randombytes(uchar * p,int len)737dd7cddfSDavid du Colombier randombytes(uchar *p, int len)
747dd7cddfSDavid du Colombier {
757dd7cddfSDavid du Colombier int i, fd;
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier fd = open("/dev/random", OREAD);
787dd7cddfSDavid du Colombier if(fd < 0){
79d854de59SDavid du Colombier fprint(2, "convkeys: can't open /dev/random, using rand()\n");
807dd7cddfSDavid du Colombier srand(time(0));
817dd7cddfSDavid du Colombier for(i = 0; i < len; i++)
827dd7cddfSDavid du Colombier p[i] = rand();
837dd7cddfSDavid du Colombier return;
847dd7cddfSDavid du Colombier }
857dd7cddfSDavid du Colombier read(fd, p, len);
867dd7cddfSDavid du Colombier close(fd);
877dd7cddfSDavid du Colombier }
887dd7cddfSDavid du Colombier
897dd7cddfSDavid du Colombier void
oldCBCencrypt(char * key7,char * p,int len)907dd7cddfSDavid du Colombier oldCBCencrypt(char *key7, char *p, int len)
917dd7cddfSDavid du Colombier {
927dd7cddfSDavid du Colombier uchar ivec[8];
937dd7cddfSDavid du Colombier uchar key[8];
947dd7cddfSDavid du Colombier DESstate s;
957dd7cddfSDavid du Colombier
967dd7cddfSDavid du Colombier memset(ivec, 0, 8);
977dd7cddfSDavid du Colombier des56to64((uchar*)key7, key);
987dd7cddfSDavid du Colombier setupDESstate(&s, key, ivec);
997dd7cddfSDavid du Colombier desCBCencrypt((uchar*)p, len, &s);
1007dd7cddfSDavid du Colombier }
1017dd7cddfSDavid du Colombier
1027dd7cddfSDavid du Colombier void
oldCBCdecrypt(char * key7,char * p,int len)1037dd7cddfSDavid du Colombier oldCBCdecrypt(char *key7, char *p, int len)
1047dd7cddfSDavid du Colombier {
1057dd7cddfSDavid du Colombier uchar ivec[8];
1067dd7cddfSDavid du Colombier uchar key[8];
1077dd7cddfSDavid du Colombier DESstate s;
1087dd7cddfSDavid du Colombier
1097dd7cddfSDavid du Colombier memset(ivec, 0, 8);
1107dd7cddfSDavid du Colombier des56to64((uchar*)key7, key);
1117dd7cddfSDavid du Colombier setupDESstate(&s, key, ivec);
1127dd7cddfSDavid du Colombier desCBCdecrypt((uchar*)p, len, &s);
1137dd7cddfSDavid du Colombier
1147dd7cddfSDavid du Colombier }
1157dd7cddfSDavid du Colombier
116*4727cc49SDavid du Colombier static int
badname(char * s)117*4727cc49SDavid du Colombier badname(char *s)
118*4727cc49SDavid du Colombier {
119*4727cc49SDavid du Colombier int n;
120*4727cc49SDavid du Colombier Rune r;
121*4727cc49SDavid du Colombier
122*4727cc49SDavid du Colombier for (; *s != '\0'; s += n) {
123*4727cc49SDavid du Colombier n = chartorune(&r, s);
124*4727cc49SDavid du Colombier if (n == 1 && r == Runeerror)
125*4727cc49SDavid du Colombier return 1;
126*4727cc49SDavid du Colombier }
127*4727cc49SDavid du Colombier return 0;
128*4727cc49SDavid du Colombier }
129*4727cc49SDavid du Colombier
130219b2ee8SDavid du Colombier int
convert(char * p,char * key,int len)131219b2ee8SDavid du Colombier convert(char *p, char *key, int len)
132219b2ee8SDavid du Colombier {
133219b2ee8SDavid du Colombier int i;
134219b2ee8SDavid du Colombier
1357dd7cddfSDavid du Colombier len -= KEYDBOFF;
136219b2ee8SDavid du Colombier if(len % KEYDBLEN){
137d854de59SDavid du Colombier fprint(2, "convkeys: file odd length; not converting %d bytes\n",
138d854de59SDavid du Colombier len % KEYDBLEN);
139219b2ee8SDavid du Colombier len -= len % KEYDBLEN;
140219b2ee8SDavid du Colombier }
1417dd7cddfSDavid du Colombier len += KEYDBOFF;
1427dd7cddfSDavid du Colombier oldCBCdecrypt(authkey, p, len);
143*4727cc49SDavid du Colombier for(i = KEYDBOFF; i < len; i += KEYDBLEN)
144*4727cc49SDavid du Colombier if (badname(&p[i])) {
145*4727cc49SDavid du Colombier print("bad name %.30s... - aborting\n", &p[i]);
146*4727cc49SDavid du Colombier return 0;
147*4727cc49SDavid du Colombier }
148219b2ee8SDavid du Colombier if(verb)
1497dd7cddfSDavid du Colombier for(i = KEYDBOFF; i < len; i += KEYDBLEN)
150219b2ee8SDavid du Colombier print("%s\n", &p[i]);
151*4727cc49SDavid du Colombier
1527dd7cddfSDavid du Colombier randombytes((uchar*)p, 8);
1537dd7cddfSDavid du Colombier oldCBCencrypt(key, p, len);
154219b2ee8SDavid du Colombier return len;
155219b2ee8SDavid du Colombier }
156219b2ee8SDavid du Colombier
157219b2ee8SDavid du Colombier void
usage(void)158219b2ee8SDavid du Colombier usage(void)
159219b2ee8SDavid du Colombier {
160219b2ee8SDavid du Colombier fprint(2, "usage: convkeys keyfile\n");
161219b2ee8SDavid du Colombier exits("usage");
162219b2ee8SDavid du Colombier }
163