diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/auth/convkeys2.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/auth/convkeys2.c')
-rwxr-xr-x | sys/src/cmd/auth/convkeys2.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/sys/src/cmd/auth/convkeys2.c b/sys/src/cmd/auth/convkeys2.c new file mode 100755 index 000000000..f8e6feffe --- /dev/null +++ b/sys/src/cmd/auth/convkeys2.c @@ -0,0 +1,132 @@ +#include <u.h> +#include <libc.h> +#include <mp.h> +#include <libsec.h> +#include <authsrv.h> +#include <bio.h> +#include "authcmdlib.h" + +char authkey[DESKEYLEN]; +int verb; +int usepass; + +int convert(char*, char*, char*, int); +int dofcrypt(int, char*, char*, int); +void usage(void); +void randombytes(uchar*, int); + +void +main(int argc, char *argv[]) +{ + Dir *d; + char *p, *np, *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); + 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"); + np = malloc((len/OKEYDBLEN)*KEYDBLEN + KEYDBOFF); + if(!np) + error("out of memory"); + if(read(fd, p, len) != len) + error("can't read key file: %r\n"); + len = convert(p, np, key, len); + if(verb) + exits(0); + if(pwrite(fd, np, len, 0) != len) + error("can't write key file: %r\n"); + close(fd); + exits(0); +} + +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); +} + +int +convert(char *p, char *np, char *key, int len) +{ + int i, off, noff; + + if(len % OKEYDBLEN) + fprint(2, "convkeys2: file odd length; not converting %d bytes\n", + len % KEYDBLEN); + len /= OKEYDBLEN; + for(i = 0; i < len; i ++){ + off = i*OKEYDBLEN; + noff = KEYDBOFF+i*(KEYDBLEN); + decrypt(authkey, &p[off], OKEYDBLEN); + memmove(&np[noff], &p[off], OKEYDBLEN); + memset(&np[noff-SECRETLEN], 0, SECRETLEN); + if(verb) + print("%s\n", &p[off]); + } + randombytes((uchar*)np, KEYDBOFF); + len = (len*KEYDBLEN) + KEYDBOFF; + oldCBCencrypt(key, np, len); + return len; +} + +void +usage(void) +{ + fprint(2, "usage: convkeys2 keyfile\n"); + exits("usage"); +} + +void +randombytes(uchar *p, int len) +{ + int i, fd; + + fd = open("/dev/random", OREAD); + if(fd < 0){ + fprint(2, "convkeys2: 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); +} |