1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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);
}
|