123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #include <u.h>
- #include <libc.h>
- #include <authsrv.h>
- #include <mp.h>
- #include <libsec.h>
- #include "authcmdlib.h"
- char authkey[DESKEYLEN];
- int verb;
- int usepass;
- int convert(char*, char*, int);
- int dofcrypt(int, char*, char*, int);
- void usage(void);
- void
- main(int argc, char *argv[])
- {
- Dir *d;
- char *p, *file, key[DESKEYLEN];
- int fd, len;
- ARGBEGIN{
- case 'v':
- verb = 1;
- break;
- case 'p':
- usepass = 1;
- break;
- default:
- usage();
- }ARGEND
- if(argc != 1)
- usage();
- file = argv[0];
- /* get original key */
- if(usepass){
- print("enter password file is encoded with\n");
- getpass(authkey, nil, 0, 1);
- } else
- getauthkey(authkey);
- if(!verb){
- print("enter password to reencode with\n");
- getpass(key, nil, 0, 1);
- }
- fd = open(file, ORDWR);
- if(fd < 0)
- error("can't open %s: %r\n", file);
- d = dirfstat(fd);
- if(d == nil)
- error("can't stat %s: %r\n", file);
- len = d->length;
- p = malloc(len);
- if(!p)
- error("out of memory");
- if(read(fd, p, len) != len)
- error("can't read key file: %r\n");
- len = convert(p, key, len);
- if(verb)
- exits(0);
- if(pwrite(fd, p, len, 0) != len)
- error("can't write key file: %r\n");
- close(fd);
- exits(0);
- }
- void
- randombytes(uchar *p, int len)
- {
- int i, fd;
- fd = open("/dev/random", OREAD);
- if(fd < 0){
- fprint(2, "can't open /dev/random, using rand()\n");
- srand(time(0));
- for(i = 0; i < len; i++)
- p[i] = rand();
- return;
- }
- read(fd, p, len);
- close(fd);
- }
- void
- oldCBCencrypt(char *key7, char *p, int len)
- {
- uchar ivec[8];
- uchar key[8];
- DESstate s;
- memset(ivec, 0, 8);
- des56to64((uchar*)key7, key);
- setupDESstate(&s, key, ivec);
- desCBCencrypt((uchar*)p, len, &s);
- }
- void
- oldCBCdecrypt(char *key7, char *p, int len)
- {
- uchar ivec[8];
- uchar key[8];
- DESstate s;
- memset(ivec, 0, 8);
- des56to64((uchar*)key7, key);
- setupDESstate(&s, key, ivec);
- desCBCdecrypt((uchar*)p, len, &s);
- }
- int
- convert(char *p, char *key, int len)
- {
- int i;
- len -= KEYDBOFF;
- if(len % KEYDBLEN){
- fprint(2, "file odd length; not converting %d bytes\n", len % KEYDBLEN);
- len -= len % KEYDBLEN;
- }
- len += KEYDBOFF;
- oldCBCdecrypt(authkey, p, len);
- if(verb)
- for(i = KEYDBOFF; i < len; i += KEYDBLEN)
- print("%s\n", &p[i]);
- randombytes((uchar*)p, 8);
- oldCBCencrypt(key, p, len);
- return len;
- }
- void
- usage(void)
- {
- fprint(2, "usage: convkeys keyfile\n");
- exits("usage");
- }
|