## diffname boot/key.c 1992/0317
## diff -e /dev/null /n/bootesdump/1992/0317/sys/src/9/boot/key.c
0a
#include <u.h>
#include <libc.h>
#include <../boot/boot.h>
void
key(Method *mp)
{
char password[20], key[7];
int prompt, fd;
USED(mp);
prompt = kflag;
fd = open("#r/nvram", ORDWR);
if(fd < 0){
prompt = 1;
warning("can't open nvram");
}
if(prompt){
do
if(getpasswd(password, sizeof password) < 0){
warning("can't read cons");
return;
}
while(!passtokey(key, password, strlen(password)));
}else if(seek(fd, 1024+900, 0) < 0 || read(fd, key, 7) != 7){
close(fd);
warning("can't read key from nvram");
}
if(kflag && seek(fd, 1024+900, 0) < 0 || write(fd, key, 7) != 7){
close(fd);
warning("can't write key to nvram");
}
close(fd);
fd = open("#c/key", OWRITE);
if(fd < 0)
warning("can't open key");
else if(write(fd, key, 7) != 7)
warning("can't write key");
close(fd);
}
.
## diffname boot/key.c 1992/0318
## diff -e /n/bootesdump/1992/0317/sys/src/9/boot/key.c /n/bootesdump/1992/0318/sys/src/9/boot/key.c
30c
if(kflag && (seek(fd, 1024+900, 0) < 0 || write(fd, key, 7) != 7)){
.
21,24c
getpasswd(password, sizeof password);
.
10a
USED(islocal);
.
6c
key(int islocal, Method *mp)
.
## diffname boot/key.c 1992/0322
## diff -e /n/bootesdump/1992/0318/sys/src/9/boot/key.c /n/bootesdump/1992/0322/sys/src/9/boot/key.c
23c
while(!passtokey(key, password));
.
2a
#include <auth.h>
.
## diffname boot/key.c 1992/0323
## diff -e /n/bootesdump/1992/0322/sys/src/9/boot/key.c /n/bootesdump/1992/0323/sys/src/9/boot/key.c
41d
36,38c
warning("can't open #c/key");
else if(write(fd, key, DESKEYLEN) != DESKEYLEN)
warning("can't set #c/key");
.
29,31c
nvsum = cksum(key);
if(kflag){
if(seek(fd, 1024+900, 0) < 0
|| write(fd, key, DESKEYLEN) != DESKEYLEN
|| write(fd, &nvsum, 1) != 1)
warning("can't write key to nvram");
.
25,27c
}else if(cksum(key) != nvsum){
warning("bad nvram key; using password boofhead");
passtokey(key, "boofhead");
.
20a
if(seek(fd, 1024+900, 0) < 0
|| read(fd, key, DESKEYLEN) != DESKEYLEN
|| read(fd, &nvsum, 1) != 1)
warning("can't read nvram key");
.
9c
char password[20], key[DESKEYLEN];
uchar nvsum;
.
5a
static uchar
cksum(char *key)
{
int i, nvsum;
nvsum = 0;
for(i=0; i<DESKEYLEN; i++)
nvsum += key[i];
return nvsum & 0xff;
}
.
## diffname boot/key.c 1992/0325
## diff -e /n/bootesdump/1992/0323/sys/src/9/boot/key.c /n/bootesdump/1992/0325/sys/src/9/boot/key.c
57c
else if(write(fd, safe.machkey, DESKEYLEN) != DESKEYLEN)
.
49,50c
|| write(fd, &safe, sizeof safe) != sizeof safe)
.
46c
safe.machsum = nvcsum(safe.machkey, DESKEYLEN);
.
41,44c
while(!passtokey(safe.machkey, password));
}else if(nvcsum(safe.machkey, DESKEYLEN) != safe.machsum){
warning("bad nvram key; using default password");
/* Just so its not plain text in the binary */
for(i=0; i<sizeof(defpass); i++)
defpass[i] = (defpass[i]-19)^(17*(i+3));
passtokey(safe.machkey, defpass);
.
34,35c
|| read(fd, &safe, sizeof safe) != sizeof safe)
.
20,22c
Nvrsafe safe;
char password[20];
int prompt, fd, i;
.
11,16d
6,9c
char defpass[] = {0x64, 0x3e, 0x4d, 0x13, 0x32, 0x00, 0x0b, 0xe1, 0xce};
.
## diffname boot/key.c 1992/0724
## diff -e /n/bootesdump/1992/0325/sys/src/9/boot/key.c /n/bootesdump/1992/0724/sys/src/9/boot/key.c
33,37c
warning("bad nvram key");
prompt = 1;
kflag = 1;
goto getp;
.
27a
getp:
.
13c
int prompt, fd;
.
6,7d
## diffname boot/key.c 1992/0725
## diff -e /n/bootesdump/1992/0724/sys/src/9/boot/key.c /n/bootesdump/1992/0725/sys/src/9/boot/key.c
46a
return;
}
.
45c
if(fd < 0){
.
## diffname boot/key.c 1993/0330
## diff -e /n/bootesdump/1992/0725/sys/src/9/boot/key.c /n/bootesdump/1993/0330/sys/src/9/boot/key.c
44,51c
/* set host's key */
if(writefile("#c/key", safe.machkey, DESKEYLEN) < 0)
fatal("#c/key");
/* set host's owner (and uid of current process) */
if(writefile("#c/hostowner", safe.authid, strlen(safe.authid)) < 0)
fatal("#c/hostowner");
/* set host's domain */
if(writefile("#c/hostdomain", safe.authdom, strlen(safe.authdom)) < 0)
fatal("#c/hostdomain");
.
31,38c
outin("authid", safe.authid, sizeof(safe.authid));
outin("authdom", safe.authdom, sizeof(safe.authdom));
safe.machsum = nvcsum(safe.machkey, DESKEYLEN);
safe.authidsum = nvcsum(safe.authid, sizeof(safe.authid));
safe.authdomsum = nvcsum(safe.authdom, sizeof(safe.authdom));
.
22,27c
if(getsafe(safe.machkey, DESKEYLEN, &safe.machsum, "#e/password", 1) < 0)
warning("bad nvram key");
if(getsafe(safe.authid, NAMELEN, &safe.authidsum, "#e/authid", 0) < 0)
warning("bad authentication id");
if(getsafe(safe.authdom, DOMLEN, &safe.authdomsum, "#e/authdom", 0) < 0)
warning("bad authentication domain");
if(kflag){
.
18,20c
if(fd < 0
|| seek(fd, 1024+900, 0) < 0
|| read(fd, &safe, sizeof safe) != sizeof safe){
memset(&safe, 0, sizeof(safe));
warning("can't read nvram");
.
16d
11d
8a
int fd;
.
5a
char *homsg = "can't set user name or key; please reboot";
getsafe(char *field, int len, uchar *sum, char *file, int pass)
{
char buf[64];
if(nvcsum(field, len) != *sum){
if(readfile(file, buf, sizeof(buf)) < 0){
kflag |= 1;
return -1;
}
memset(field, 0, len);
if(pass)
passtokey(field, buf);
else
strncpy(field, buf, len-1);
}
return 0;
}
.
## diffname boot/key.c 1993/0416
## diff -e /n/bootesdump/1993/0330/sys/src/9/boot/key.c /n/bootesdump/1993/0416/sys/src/9/boot/key.c
58c
if(seek(fd, safeoff, 0) < 0
.
38c
|| seek(fd, safeoff, 0) < 0
.
35a
if(strcmp(cputype, "sparc") == 0)
safeoff = 1024+850;
else
safeoff = 1024+900;
.
29c
int fd, safeoff;
.
## diffname boot/key.c 1993/0501
## diff -e /n/bootesdump/1993/0416/sys/src/9/boot/key.c /n/fornaxdump/1993/0501/sys/src/brazil/boot/key.c
63c
if(seek(fd, 1024+900, 0) < 0
.
43c
|| seek(fd, 1024+900, 0) < 0
.
36,40d
29c
int fd;
.
## diffname boot/key.c 1993/0725
## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/boot/key.c /n/fornaxdump/1993/0725/sys/src/brazil/boot/key.c
52a
.
49a
.
48a
.
## diffname boot/key.c 1993/0916
## diff -e /n/fornaxdump/1993/0725/sys/src/brazil/boot/key.c /n/fornaxdump/1993/0916/sys/src/brazil/boot/key.c
61c
if(seek(fd, safeoff, 0) < 0
.
55d
51d
43,49c
check(safe.machkey, DESKEYLEN, safe.machsum, "bad nvram key");
check(safe.authid, NAMELEN, safe.authidsum, "bad authentication id");
check(safe.authdom, DOMLEN, safe.authdomsum, "bad authentication domain");
.
38c
|| seek(fd, safeoff, 0) < 0
.
36c
if(strcmp(cputype, "sparc") == 0){
fd = open("#r/nvram", ORDWR);
safeoff = 1024+850;
} else if(strcmp(cputype, "386") == 0){
fd = open("#H/hd0nvram", ORDWR);
if(fd < 0)
fd = open("#w/sd0nvram", ORDWR);
safeoff = 0x0;
} else {
fd = open("#r/nvram", ORDWR);
safeoff = 1024+900;
}
.
29c
int fd, safeoff;
.
25a
/*
* get info out of nvram. since there isn't room in the PC's nvram use
* a disk partition there.
*/
.
10,23c
if(nvcsum(x, len) == sum)
return;
memset(x, 0, len);
kflag = 1;
warning(msg);
.
6,8c
static void
check(void *x, int len, uchar sum, char *msg)
.
## diffname boot/key.c 1997/0909
## diff -e /n/fornaxdump/1993/0916/sys/src/brazil/boot/key.c /n/emeliedump/1997/0909/sys/src/brazil/boot/key.c
76c
if(writefile("#c/hostdomain", safe->authdom, strlen(safe->authdom)) < 0)
.
72c
if(writefile("#c/hostowner", safe->authid, strlen(safe->authid)) < 0)
.
68c
if(writefile("#c/key", safe->machkey, DESKEYLEN) < 0)
.
62c
|| write(fd, buf, safelen) != safelen)
.
55,60c
while(!passtokey(safe->machkey, password));
outin("authid", safe->authid, sizeof(safe->authid));
outin("authdom", safe->authdom, sizeof(safe->authdom));
safe->machsum = nvcsum(safe->machkey, DESKEYLEN);
safe->authidsum = nvcsum(safe->authid, sizeof(safe->authid));
safe->authdomsum = nvcsum(safe->authdom, sizeof(safe->authdom));
.
49,51c
check(safe->machkey, DESKEYLEN, safe->machsum, "bad nvram key");
check(safe->authid, NAMELEN, safe->authidsum, "bad authentication id");
check(safe->authdom, DOMLEN, safe->authdomsum, "bad authentication domain");
.
45,46c
|| read(fd, buf, safelen) != safelen){
memset(safe, 0, sizeof(safe));
.
37c
if(fd < 0){
fd = open("#f/fd0disk", ORDWR);
if(fd >= 0){
if(dirfstat(fd, &d) >= 0){
safeoff = d.length - 512;
safelen = 512;
} else {
close(fd);
fd = -1;
}
}
}
.
29a
safe = (Nvrsafe*)buf;
safelen = sizeof(Nvrsafe);
safeoff = 0;
.
25a
Dir d;
.
23,24c
int fd, safeoff, safelen;
char buf[1024];
Nvrsafe *safe;
.
## diffname boot/key.c 1997/0910
## diff -e /n/emeliedump/1997/0909/sys/src/brazil/boot/key.c /n/emeliedump/1997/0910/sys/src/brazil/boot/key.c
94a
}
typedef struct Dosboot Dosboot;
struct Dosboot{
uchar magic[3]; /* really an xx86 JMP instruction */
uchar version[8];
uchar sectsize[2];
uchar clustsize;
uchar nresrv[2];
uchar nfats;
uchar rootsize[2];
uchar volsize[2];
uchar mediadesc;
uchar fatsize[2];
uchar trksize[2];
uchar nheads[2];
uchar nhidden[4];
uchar bigvolsize[4];
uchar driveno;
uchar reserved0;
uchar bootsig;
uchar volid[4];
uchar label[11];
uchar type[8];
};
#define GETSHORT(p) (((p)[1]<<8) | (p)[0])
#define GETLONG(p) ((GETSHORT((p)+2) << 16) | GETSHORT((p)))
typedef struct Dosdir Dosdir;
struct Dosdir
{
char name[8];
char ext[3];
uchar attr;
uchar reserved[10];
uchar time[2];
uchar date[2];
uchar start[2];
uchar length[4];
};
static char*
dosparse(char *from, char *to, int len)
{
char c;
memset(to, ' ', len);
if(from == 0)
return 0;
while(len-- > 0){
c = *from++;
if(c == '.')
return from;
if(c == 0)
break;
if(c >= 'a' && c <= 'z')
*to++ = c + 'A' - 'a';
else
*to++ = c;
}
return 0;
}
/*
* return offset of first file block
*
* This is a very simplistic dos file system. It only
* works on floppies, only looks in the root, and only
* returns a pointer to the first block of a file.
*
* This exists for cpu servers that have no hard disk
* or nvram to store the key on.
*
* Please don't make this any smarter: it stays resident
* and I'ld prefer not to waste the space on something that
* runs only at boottime -- presotto.
*/
static long
finddosfile(int fd, char *file)
{
uchar secbuf[512];
char name[8];
char ext[3];
Dosboot *b;
Dosdir *root, *dp;
int nroot, sectsize, rootoff, rootsects, n;
/* dos'ize file name */
file = dosparse(file, name, 8);
dosparse(file, ext, 3);
/* read boot block, check for sanity */
b = (Dosboot*)secbuf;
if(read(fd, secbuf, sizeof(secbuf)) != sizeof(secbuf))
return -1;
if(b->magic[0] != 0xEB || b->magic[1] != 0x3C || b->magic[2] != 0x90)
return -1;
sectsize = GETSHORT(b->sectsize);
if(sectsize != 512)
return -1;
rootoff = (1 + b->nfats*GETSHORT(b->fatsize)) * sectsize;
if(seek(fd, rootoff, 0) < 0)
return -1;
nroot = GETSHORT(b->rootsize);
rootsects = (nroot*sizeof(Dosdir)+sectsize-1)/sectsize;
if(rootsects <= 0 || rootsects > 20)
return -1;
/*
* read root. it is contiguous to make stuff like
* this easier
*/
root = malloc(rootsects*sectsize);
if(read(fd, root, rootsects*sectsize) != rootsects*sectsize)
return -1;
n = -1;
for(dp = root; dp < &root[nroot]; dp++)
if(memcmp(name, dp->name, 8) == 0 && memcmp(ext, dp->ext, 3) == 0){
n = GETSHORT(dp->start);
break;
}
free(root);
if(n < 0)
return -1;
/*
* dp->start is in cluster units, not sectors. The first
* cluster is cluster 2 which starts immediately after the
* root directory
*/
return rootoff + rootsects*sectsize + (n-2)*sectsize*b->clustsize;
.
52a
safelen = 512;
.
46,49c
safeoff = finddosfile(fd, "plan9.nvr");
if(safeoff < 0){
.
44a
if(fd < 0)
fd = open("#f/fd1disk", ORDWR);
.
27d
5a
static long finddosfile(int, char*);
.
## diffname boot/key.c 1999/0618
## diff -e /n/emeliedump/1997/0910/sys/src/brazil/boot/key.c /n/emeliedump/1999/0618/sys/src/brazil/boot/key.c
85a
//fprint(2, "hostowner = %s\n", safe->authid);
//fprint(2, "hostdomain = %s\n", safe->authdom);
.
## diffname boot/key.c 2000/0401
## diff -e /n/emeliedump/1999/0618/sys/src/brazil/boot/key.c /n/emeliedump/2000/0401/sys/src/9/boot/key.c
85,87d
40c
} else if(strcmp(cputype, "386") == 0 || strcmp(cputype, "alpha") == 0){
.
## diffname boot/key.c 2000/0518
## diff -e /n/emeliedump/2000/0401/sys/src/9/boot/key.c /n/emeliedump/2000/0518/sys/src/9/boot/key.c
43c
fd = open("#S/sd00/nvram", ORDWR);
.
41c
fd = open("#S/sdC0/nvram", ORDWR);
.
## diffname boot/key.c 2000/0708
## diff -e /n/emeliedump/2000/0518/sys/src/9/boot/key.c /n/emeliedump/2000/0708/sys/src/9/boot/key.c
94a
if(*safe->authdom == 0)
strcpy(safe->authdom, "plan9");
.
## diffname boot/key.c 2000/0722
## diff -e /n/emeliedump/2000/0708/sys/src/9/boot/key.c /n/emeliedump/2000/0722/sys/src/9/boot/key.c
98c
warning("#c/hostdomain");
.
92c
warning("#c/hostowner");
.
88c
warning("#c/key");
.
## diffname boot/key.c 2000/0825
## diff -e /n/emeliedump/2000/0722/sys/src/9/boot/key.c /n/emeliedump/2000/0825/sys/src/9/boot/key.c
41a
if(fd < 0){
fd = open("#S/sdC0/9fat", ORDWR);
if(fd >= 0){
safeoff = finddosfile(fd, "plan9.nvr");
if(safeoff < 0){
close(fd);
fd = -1;
}
print("safeoff = %d\n", safeoff);
safelen = 512;
}
}
.
## diffname boot/key.c 2000/0829
## diff -e /n/emeliedump/2000/0825/sys/src/9/boot/key.c /n/emeliedump/2000/0829/sys/src/9/boot/key.c
50d
## diffname boot/key.c 2000/0914
## diff -e /n/emeliedump/2000/0829/sys/src/9/boot/key.c /n/emeliedump/2000/0914/sys/src/9/boot/key.c
215c
if(rootsects <= 0 || rootsects > 64)
.
210c
rootoff = (GETSHORT(b->nresrv) + b->nfats*GETSHORT(b->fatsize)) * sectsize;
.
## diffname boot/key.c 2001/0527
## diff -e /n/emeliedump/2000/0914/sys/src/9/boot/key.c /n/emeliedump/2001/0527/sys/src/9/boot/key.c
80a
#undef NAMELEN
.
79a
#define NAMELEN 28
/*BUG: THIS IS TOTALLY BOGUS */
.
## diffname boot/key.c 2001/0924
## diff -e /n/emeliedump/2001/0527/sys/src/9/boot/key.c /n/emeliedump/2001/0924/sys/src/9/boot/key.c
80,83c
check(safe->authid, ANAMELEN, safe->authidsum, "bad authentication id");
.
## diffname boot/key.c 2001/1107 # deleted
## diff -e /n/emeliedump/2001/0924/sys/src/9/boot/key.c /n/emeliedump/2001/1107/sys/src/9/boot/key.c
1,242d
|