Browse Source

Plan 9 from Bell Labs 2004-10-31

David du Colombier 19 years ago
parent
commit
2c757db8d7

+ 14 - 13
dist/replica/_plan9.db

@@ -3,13 +3,13 @@
 386/9loaddebug - 775 sys sys 1098933169 299545
 386/9loadlite - 775 sys sys 1097716797 131864
 386/9loadlitedebug - 775 sys sys 1097744361 194456
-386/9pc - 775 sys sys 1098933173 1817363
+386/9pc - 775 sys sys 1099105953 1817371
 386/9pc.gz - 664 sys sys 1077049336 635727
-386/9pccpu - 775 sys sys 1098933176 1473492
+386/9pccpu - 775 sys sys 1099105956 1473500
 386/9pccpu.gz - 664 sys sys 1077049387 519909
-386/9pcdisk - 775 sys sys 1098933180 2019969
+386/9pcdisk - 775 sys sys 1099105960 2019977
 386/9pcdisk.gz - 664 sys sys 1040006345 703136
-386/9pcf - 775 sys sys 1098933185 2351612
+386/9pcf - 775 sys sys 1099105966 2351620
 386/9pcf.gz - 664 sys sys 1077049490 872650
 386/9pxeload - 775 sys sys 1097716797 208292
 386/_9pcdisk.gz - 664 sys sys 1039764191 695837
@@ -2988,6 +2988,7 @@ rc/bin/ape/false - 775 sys sys 945617285 17
 rc/bin/ape/grep - 775 sys sys 1023738308 60
 rc/bin/ape/install - 775 sys sys 1015089725 572
 rc/bin/ape/psh - 775 sys sys 1040481105 240
+rc/bin/ape/ranlib - 755 sys sys 1099176402 18
 rc/bin/ape/rmdir - 775 sys sys 945617286 16
 rc/bin/ape/true - 775 sys sys 945617286 17
 rc/bin/ape/umask - 775 sys sys 945617286 34
@@ -5482,7 +5483,7 @@ sys/src/9/port/devkprof.c - 664 sys sys 1014931173 3111
 sys/src/9/port/devloopback.c - 664 sys sys 1076612248 14573
 sys/src/9/port/devmnt.c - 664 sys sys 1086406908 21595
 sys/src/9/port/devmntstats.c - 664 sys sys 1014931173 4039
-sys/src/9/port/devmouse.c - 664 sys sys 1067722758 12203
+sys/src/9/port/devmouse.c - 664 sys sys 1099176878 12404
 sys/src/9/port/devnmouse.c - 664 sys sys 1036812999 3738
 sys/src/9/port/devpipe.c - 664 sys sys 1077055016 5825
 sys/src/9/port/devpnp.c - 664 sys sys 1088560907 13624
@@ -6858,13 +6859,13 @@ sys/src/cmd/auth/disable - 775 sys sys 1015008431 146
 sys/src/cmd/auth/enable - 775 sys sys 1015008430 134
 sys/src/cmd/auth/factotum - 20000000775 sys sys 1017165894 0
 sys/src/cmd/auth/factotum/apop.c - 664 sys sys 1071260312 6074
-sys/src/cmd/auth/factotum/chap.c - 664 sys sys 1044829586 5324
+sys/src/cmd/auth/factotum/chap.c - 664 sys sys 1099176467 8774
 sys/src/cmd/auth/factotum/confirm.c - 664 sys sys 1044829586 3103
-sys/src/cmd/auth/factotum/dat.h - 664 sys sys 1091904428 4774
+sys/src/cmd/auth/factotum/dat.h - 664 sys sys 1099176466 4809
 sys/src/cmd/auth/factotum/fgui.c - 664 sys sys 1044829587 15948
-sys/src/cmd/auth/factotum/fs.c - 664 sys sys 1048614987 10353
+sys/src/cmd/auth/factotum/fs.c - 664 sys sys 1099176467 10365
 sys/src/cmd/auth/factotum/log.c - 664 sys sys 1046655068 1781
-sys/src/cmd/auth/factotum/mkfile - 664 sys sys 1048614969 493
+sys/src/cmd/auth/factotum/mkfile - 664 sys sys 1099176466 493
 sys/src/cmd/auth/factotum/p9any.c - 664 sys sys 1048614972 8219
 sys/src/cmd/auth/factotum/p9cr.c - 664 sys sys 1048614973 6628
 sys/src/cmd/auth/factotum/p9sk1.c - 664 sys sys 1048614974 9606
@@ -12391,7 +12392,7 @@ usr/glenda/lib/profile - 664 glenda glenda 1021580005 847
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
-386/9pc - 775 sys sys 1099105953 1817371
-386/9pccpu - 775 sys sys 1099105956 1473500
-386/9pcdisk - 775 sys sys 1099105960 2019977
-386/9pcf - 775 sys sys 1099105966 2351620
+386/9pc - 775 sys sys 1099192351 1820982
+386/9pcdisk - 775 sys sys 1099192357 2023588
+386/9pcf - 775 sys sys 1099192364 2355231
+386/bin/auth/factotum - 775 sys sys 1099192345 312170

+ 10 - 9
dist/replica/plan9.db

@@ -3,13 +3,13 @@
 386/9loaddebug - 775 sys sys 1098933169 299545
 386/9loadlite - 775 sys sys 1097716797 131864
 386/9loadlitedebug - 775 sys sys 1097744361 194456
-386/9pc - 775 sys sys 1099105953 1817371
+386/9pc - 775 sys sys 1099192351 1820982
 386/9pc.gz - 664 sys sys 1077049336 635727
 386/9pccpu - 775 sys sys 1099105956 1473500
 386/9pccpu.gz - 664 sys sys 1077049387 519909
-386/9pcdisk - 775 sys sys 1099105960 2019977
+386/9pcdisk - 775 sys sys 1099192357 2023588
 386/9pcdisk.gz - 664 sys sys 1040006345 703136
-386/9pcf - 775 sys sys 1099105966 2351620
+386/9pcf - 775 sys sys 1099192364 2355231
 386/9pcf.gz - 664 sys sys 1077049490 872650
 386/9pxeload - 775 sys sys 1097716797 208292
 386/_9pcdisk.gz - 664 sys sys 1039764191 695837
@@ -53,7 +53,7 @@
 386/bin/auth/debug - 775 sys sys 1085076979 98973
 386/bin/auth/disable - 775 sys sys 1020319057 146
 386/bin/auth/enable - 775 sys sys 1020319057 134
-386/bin/auth/factotum - 775 sys sys 1089397308 307187
+386/bin/auth/factotum - 775 sys sys 1099192345 312170
 386/bin/auth/fgui - 775 sys sys 1092021259 215754
 386/bin/auth/guard.srv - 775 sys sys 1089257528 140762
 386/bin/auth/iam - 775 sys sys 1085076981 50791
@@ -2988,6 +2988,7 @@ rc/bin/ape/false - 775 sys sys 945617285 17
 rc/bin/ape/grep - 775 sys sys 1023738308 60
 rc/bin/ape/install - 775 sys sys 1015089725 572
 rc/bin/ape/psh - 775 sys sys 1040481105 240
+rc/bin/ape/ranlib - 755 sys sys 1099176402 18
 rc/bin/ape/rmdir - 775 sys sys 945617286 16
 rc/bin/ape/true - 775 sys sys 945617286 17
 rc/bin/ape/umask - 775 sys sys 945617286 34
@@ -5482,7 +5483,7 @@ sys/src/9/port/devkprof.c - 664 sys sys 1014931173 3111
 sys/src/9/port/devloopback.c - 664 sys sys 1076612248 14573
 sys/src/9/port/devmnt.c - 664 sys sys 1086406908 21595
 sys/src/9/port/devmntstats.c - 664 sys sys 1014931173 4039
-sys/src/9/port/devmouse.c - 664 sys sys 1067722758 12203
+sys/src/9/port/devmouse.c - 664 sys sys 1099176878 12404
 sys/src/9/port/devnmouse.c - 664 sys sys 1036812999 3738
 sys/src/9/port/devpipe.c - 664 sys sys 1077055016 5825
 sys/src/9/port/devpnp.c - 664 sys sys 1088560907 13624
@@ -6858,13 +6859,13 @@ sys/src/cmd/auth/disable - 775 sys sys 1015008431 146
 sys/src/cmd/auth/enable - 775 sys sys 1015008430 134
 sys/src/cmd/auth/factotum - 20000000775 sys sys 1017165894 0
 sys/src/cmd/auth/factotum/apop.c - 664 sys sys 1071260312 6074
-sys/src/cmd/auth/factotum/chap.c - 664 sys sys 1044829586 5324
+sys/src/cmd/auth/factotum/chap.c - 664 sys sys 1099176467 8774
 sys/src/cmd/auth/factotum/confirm.c - 664 sys sys 1044829586 3103
-sys/src/cmd/auth/factotum/dat.h - 664 sys sys 1091904428 4774
+sys/src/cmd/auth/factotum/dat.h - 664 sys sys 1099176466 4809
 sys/src/cmd/auth/factotum/fgui.c - 664 sys sys 1044829587 15948
-sys/src/cmd/auth/factotum/fs.c - 664 sys sys 1048614987 10353
+sys/src/cmd/auth/factotum/fs.c - 664 sys sys 1099176467 10365
 sys/src/cmd/auth/factotum/log.c - 664 sys sys 1046655068 1781
-sys/src/cmd/auth/factotum/mkfile - 664 sys sys 1048614969 493
+sys/src/cmd/auth/factotum/mkfile - 664 sys sys 1099176466 493
 sys/src/cmd/auth/factotum/p9any.c - 664 sys sys 1048614972 8219
 sys/src/cmd/auth/factotum/p9cr.c - 664 sys sys 1048614973 6628
 sys/src/cmd/auth/factotum/p9sk1.c - 664 sys sys 1048614974 9606

+ 10 - 0
dist/replica/plan9.log

@@ -16951,3 +16951,13 @@
 1099107049 1 c 386/9pccpu - 775 sys sys 1099105956 1473500
 1099107049 2 c 386/9pcdisk - 775 sys sys 1099105960 2019977
 1099107049 3 c 386/9pcf - 775 sys sys 1099105966 2351620
+1099177262 0 a rc/bin/ape/ranlib - 755 sys sys 1099176402 18
+1099177262 1 c sys/src/9/port/devmouse.c - 664 sys sys 1099176878 12404
+1099177262 2 c sys/src/cmd/auth/factotum/chap.c - 664 sys sys 1099176467 8774
+1099177262 3 c sys/src/cmd/auth/factotum/dat.h - 664 sys sys 1099176466 4809
+1099177262 4 c sys/src/cmd/auth/factotum/fs.c - 664 sys sys 1099176467 10365
+1099177262 5 c sys/src/cmd/auth/factotum/mkfile - 664 sys sys 1099176466 493
+1099193465 0 c 386/9pc - 775 sys sys 1099192351 1820982
+1099193465 1 c 386/9pcdisk - 775 sys sys 1099192357 2023588
+1099193465 2 c 386/9pcf - 775 sys sys 1099192364 2355231
+1099193465 3 c 386/bin/auth/factotum - 775 sys sys 1099192345 312170

+ 3 - 0
rc/bin/ape/ranlib

@@ -0,0 +1,3 @@
+#!/bin/rc
+
+exit 0

+ 14 - 3
sys/src/9/port/devmouse.c

@@ -47,6 +47,7 @@ struct Mouseinfo
 enum
 {
 	CMbuttonmap,
+	CMscrollswap,
 	CMswap,
 	CMwildcard,
 };
@@ -54,6 +55,7 @@ enum
 static Cmdtab mousectlmsg[] =
 {
 	CMbuttonmap,	"buttonmap",	0,
+	CMscrollswap,	"scrollswap",	0,
 	CMswap,		"swap",		1,
 	CMwildcard,	"*",		0,
 };
@@ -87,7 +89,7 @@ static uchar buttonmap[8] = {
 	0, 1, 2, 3, 4, 5, 6, 7,
 };
 static int mouseswap;
-
+static int scrollswap;
 extern	Memimage*	gscreen;
 
 static void
@@ -210,7 +212,7 @@ mouseclose(Chan *c)
 static long
 mouseread(Chan *c, void *va, long n, vlong off)
 {
-	char buf[4*12+1];
+	char buf[1+4*12+1];
 	uchar *p;
 	static int map[8] = {0, 4, 2, 6, 1, 5, 3, 7 };
 	ulong offset = off;
@@ -265,7 +267,12 @@ mouseread(Chan *c, void *va, long n, vlong off)
 		b = buttonmap[m.buttons&7];
 		/* put buttons 4 and 5 back in */
 		b |= m.buttons & (3<<3);
-		sprint(buf, "m%11d %11d %11d %11lud",
+		if (scrollswap)
+			if (b == 8)
+				b = 16;
+			else if (b == 16)
+				b = 8;
+		sprint(buf, "m%11d %11d %11d %11lud ",
 			m.xy.x, m.xy.y,
 			b,
 			m.msec);
@@ -374,6 +381,10 @@ mousewrite(Chan *c, void *va, long n, vlong)
 			mouseswap ^= 1;
 			break;
 
+		case CMscrollswap:
+			scrollswap ^= 1;
+			break;
+
 		case CMbuttonmap:
 			if(cb->nf == 1)
 				setbuttonmap("123");

+ 177 - 13
sys/src/cmd/auth/factotum/chap.c

@@ -4,7 +4,8 @@
  * The client does not authenticate the server, hence no CAI
  *
  * Client protocol:
- *	unimplemented
+ *	write Chapchal 
+ *	read response Chapreply or MSchaprely structure
  *
  * Server protocol:
  *	read challenge: 8 bytes binary
@@ -12,14 +13,21 @@
  *	write response: Chapreply or MSchapreply structure
  */
 
+#include <ctype.h>
 #include "dat.h"
 
 enum {
 	ChapChallen = 8,
+	ChapResplen = 16,
+	MSchapResplen = 24,
 };
 
 static int dochal(State*);
 static int doreply(State*, void*, int);
+static void doLMchap(char *, uchar [ChapChallen], uchar [MSchapResplen]);
+static void doNTchap(char *, uchar [ChapChallen], uchar [MSchapResplen]);
+static void dochap(char *, int, char [ChapChallen], uchar [ChapResplen]);
+
 
 struct State
 {
@@ -30,7 +38,9 @@ struct State
 	Ticket	t;
 	Ticketreq	tr;
 	char chal[ChapChallen];
-	char	err[ERRMAX];
+	MSchapreply mcr;
+	char cr[ChapResplen];
+	char err[ERRMAX];
 	char user[64];
 	uchar secret[16];	/* for mschap */
 	int nsecret;
@@ -38,6 +48,9 @@ struct State
 
 enum
 {
+	CNeedChal,
+	CHaveResp,
+
 	SHaveChal,
 	SNeedUser,
 	SNeedResp,
@@ -49,6 +62,9 @@ enum
 
 static char *phasenames[Maxphase] =
 {
+[CNeedChal]	"CNeedChal",
+[CHaveResp]	"CHaveResp",
+
 [SHaveChal]	"SHaveChal",
 [SNeedUser]	"SNeedUser",
 [SNeedResp]	"SNeedResp",
@@ -64,8 +80,6 @@ chapinit(Proto *p, Fsstate *fss)
 
 	if((iscli = isclient(_strfindattr(fss->attr, "role"))) < 0)
 		return failure(fss, nil);
-	if(iscli)
-		return failure(fss, "%s client not supported", p->name);
 
 	s = emalloc(sizeof *s);
 	fss->phasename = phasenames;
@@ -78,15 +92,21 @@ chapinit(Proto *p, Fsstate *fss)
 		s->astype = AuthMSchap;
 		s->protoname = "mschap";
 	}
-	if((ret = findp9authkey(&s->key, fss)) != RpcOk){
-		free(s);
-		return ret;
-	}
-	if(dochal(s) < 0){
-		free(s);
-		return failure(fss, nil);
+
+	if(iscli)
+		fss->phase = CNeedChal;
+	else{
+		if((ret = findp9authkey(&s->key, fss)) != RpcOk){
+			free(s);
+			return ret;
+		}
+		if(dochal(s) < 0){
+			free(s);
+			return failure(fss, nil);
+		}
+		fss->phase = SHaveChal;
 	}
-	fss->phase = SHaveChal;
+
 	fss->ps = s;
 	return RpcOk;
 }
@@ -104,11 +124,26 @@ chapclose(Fsstate *fss)
 	free(s);
 }
 
+void
+dmpkey(char *s, void *v, int n)
+{
+	int i;
+	char *p = v;
+
+	print("%s", s);
+	for (i = 0; i < n; i++)
+		print("%02x ", *p++);
+	print("\n");
+}
+
+
 static int
 chapwrite(Fsstate *fss, void *va, uint n)
 {
-	int nreply;
+	int ret, nreply;
+	char *a, *v;
 	void *reply;
+	Key *k;
 	State *s;
 	Chapreply cr;
 	MSchapreply mcr;
@@ -116,10 +151,34 @@ chapwrite(Fsstate *fss, void *va, uint n)
 	OMSchapreply omcr;
 
 	s = fss->ps;
+	a = va;
 	switch(fss->phase){
 	default:
 		return phaseerror(fss, "write");
 
+	case CNeedChal:
+		ret = findkey(&k, fss, fss->sysuser, 0, 0, fss->attr, "%s", fss->proto->keyprompt);
+		if(ret != RpcOk)
+			return ret;
+		v = _strfindattr(k->privattr, "!password");
+		if(v == nil)
+			return failure(fss, "key has no password");
+		setattrs(fss->attr, k->attr);
+		switch(s->astype){
+		default:
+			abort();
+		case AuthMSchap:
+			doLMchap(v, (uchar *)a, (uchar *)s->mcr.LMresp);
+			doNTchap(v, (uchar *)a, (uchar *)s->mcr.NTresp);
+			break;
+		case AuthChap:
+			dochap(v, *a, a+1, (uchar *)s->cr);
+			break;
+		}
+		closekey(k);
+		fss->phase = CHaveResp;
+		return RpcOk;
+
 	case SNeedUser:
 		if(n >= sizeof s->user)
 			return failure(fss, "user name too long");
@@ -151,6 +210,9 @@ chapwrite(Fsstate *fss, void *va, uint n)
 			strecpy(omcr.uid, omcr.uid+sizeof omcr.uid, s->user);
 			reply = &omcr;
 			nreply = sizeof omcr;
+print("%s\n", omcr.uid);
+dmpkey("LM ", omcr.LMresp, 24);
+dmpkey("NT ", omcr.NTresp, 24);
 			break;
 		}
 		if(doreply(s, reply, nreply) < 0)
@@ -175,6 +237,25 @@ chapread(Fsstate *fss, void *va, uint *n)
 	default:
 		return phaseerror(fss, "read");
 
+	case CHaveResp:
+		switch(s->astype){
+		default:
+			abort();
+		case AuthMSchap:
+			if(*n > sizeof(MSchapreply))
+				*n = sizeof(MSchapreply);
+			memmove(va, &s->mcr, *n);
+			break;
+		case AuthChap:
+			if(*n > ChapResplen)
+				*n = ChapResplen;
+			memmove(va, s->cr, ChapResplen);
+			break;
+		}
+		fss->phase = Established;
+		fss->haveai = 0;
+		return RpcOk;
+
 	case SHaveChal:
 		if(*n > sizeof s->chal)
 			*n = sizeof s->chal;
@@ -273,6 +354,8 @@ Proto chap = {
 .write=	chapwrite,
 .read=	chapread,
 .close=	chapclose,
+.addkey= replacekey,
+.keyprompt= "!password?"
 };
 
 Proto mschap = {
@@ -281,5 +364,86 @@ Proto mschap = {
 .write=	chapwrite,
 .read=	chapread,
 .close=	chapclose,
+.addkey= replacekey,
+.keyprompt= "!password?"
 };
 
+static void
+hash(uchar pass[16], uchar c8[ChapChallen], uchar p24[MSchapResplen])
+{
+	int i;
+	uchar p21[21];
+	ulong schedule[32];
+
+	memset(p21, 0, sizeof p21 );
+	memmove(p21, pass, 16);
+
+	for(i=0; i<3; i++) {
+		key_setup(p21+i*7, schedule);
+		memmove(p24+i*8, c8, 8);
+		block_cipher(schedule, p24+i*8, 0);
+	}
+}
+
+static void
+doNTchap(char *pass, uchar chal[ChapChallen], uchar reply[MSchapResplen])
+{
+	int i, n;
+	uchar *w, unipass[256];
+	uchar digest[MD4dlen];
+
+	Rune r;
+
+	// Standard says unlimited length, experience says 128 max
+	if ((n = strlen(pass)) > 128)
+		n = 128;
+
+	memset(unipass, 0, sizeof unipass);
+	for(i=0, w=unipass; i < n; i++) {
+		pass += chartorune(&r, pass);
+		*w++ = r & 0xff;
+		*w++ = r >> 8;
+	}
+
+	memset(digest, 0, sizeof digest);
+	md4(unipass, w - unipass, digest, nil);
+	hash(digest, chal, reply);
+}
+
+static void
+doLMchap(char *pass, uchar chal[ChapChallen], uchar reply[MSchapResplen])
+{
+	int i;
+	ulong schedule[32];
+	uchar p14[15], p16[16];
+	uchar s8[8] = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
+
+	// Spec says space padded, experience says otherwise
+	memset(p14, 0, sizeof p14 -1);
+	p14[sizeof p14 - 1] = '\0';
+
+	// NT4 requires uppercase, Win XP doesn't care
+	for (i = 0; pass[i]; i++)
+		p14[i] = islower(pass[i])? toupper(pass[i]): pass[i];
+
+	for(i=0; i<2; i++) {
+		key_setup(p14+i*7, schedule);
+		memmove(p16+i*8, s8, 8);
+		block_cipher(schedule, p16+i*8, 0);
+	}
+
+	hash(p16, chal, reply);
+}
+
+static void
+dochap(char *pass, int id, char chal[ChapChallen], uchar resp[ChapResplen])
+{
+	char buf[1+ChapChallen+MAXNAMELEN+1];
+	int n = strlen(pass);
+
+	*buf = id;
+	strcpy(buf+1, pass);
+	memmove(buf+1+n, chal, ChapChallen);
+	md5((uchar*)buf, 1+n+ChapChallen, resp, nil);
+}
+

+ 1 - 0
sys/src/cmd/auth/factotum/dat.h

@@ -223,3 +223,4 @@ extern Proto pass;			/* pass.c */
 extern Proto sshrsa;			/* sshrsa.c */
 extern Proto rsa;			/* rsa.c */
 extern Proto wep;			/* wep.c */
+/* extern Proto srs;			/* srs.c */

+ 1 - 0
sys/src/cmd/auth/factotum/fs.c

@@ -34,6 +34,7 @@ prototab[] =
 	&p9sk1,
 	&p9sk2,
 	&pass,
+/*	&srs, */
 	&sshrsa,
 	&rsa,
 	&vnc,

+ 1 - 1
sys/src/cmd/auth/factotum/mkfile

@@ -10,8 +10,8 @@ PROTO=\
 	p9cr.$O\
 	p9sk1.$O\
 	pass.$O\
-	sshrsa.$O\
 	rsa.$O\
+	sshrsa.$O\
 	wep.$O\
 
 FOFILES=\