summaryrefslogtreecommitdiff
path: root/sys/src/cmd/auth/convkeys.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/auth/convkeys.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/auth/convkeys.c')
-rwxr-xr-xsys/src/cmd/auth/convkeys.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/sys/src/cmd/auth/convkeys.c b/sys/src/cmd/auth/convkeys.c
new file mode 100755
index 000000000..200c5ef21
--- /dev/null
+++ b/sys/src/cmd/auth/convkeys.c
@@ -0,0 +1,162 @@
+#include <u.h>
+#include <libc.h>
+#include <ctype.h>
+#include <authsrv.h>
+#include <mp.h>
+#include <libsec.h>
+#include <bio.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 'p':
+ usepass = 1;
+ break;
+ case 'v':
+ verb = 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, "convkeys: 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);
+
+}
+
+static int
+badname(char *s)
+{
+ int n;
+ Rune r;
+
+ for (; *s != '\0'; s += n) {
+ n = chartorune(&r, s);
+ if (n == 1 && r == Runeerror)
+ return 1;
+ }
+ return 0;
+}
+
+int
+convert(char *p, char *key, int len)
+{
+ int i;
+
+ len -= KEYDBOFF;
+ if(len % KEYDBLEN){
+ fprint(2, "convkeys: file odd length; not converting %d bytes\n",
+ len % KEYDBLEN);
+ len -= len % KEYDBLEN;
+ }
+ len += KEYDBOFF;
+ oldCBCdecrypt(authkey, p, len);
+ for(i = KEYDBOFF; i < len; i += KEYDBLEN)
+ if (badname(&p[i])) {
+ print("bad name %.30s... - aborting\n", &p[i]);
+ return 0;
+ }
+ 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");
+}