📄 convkeys2.c
字号:
#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);voidmain(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);}voidoldCBCencrypt(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);}intconvert(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;}voidusage(void){ fprint(2, "usage: convkeys2 keyfile\n"); exits("usage");}voidrandombytes(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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -