xref: /plan9-contrib/sys/src/cmd/auth/factotum/wep.c (revision 260f7b65f27bafa63b361ec761042c0d76ce7e36)
1fb7f0c93SDavid du Colombier /*
2fb7f0c93SDavid du Colombier  *  The caller supplies the device, we do the flavoring.  There
3fb7f0c93SDavid du Colombier  *  are no phases, everything happens in the init routine.
4fb7f0c93SDavid du Colombier  */
5fb7f0c93SDavid du Colombier 
6fb7f0c93SDavid du Colombier #include "dat.h"
7fb7f0c93SDavid du Colombier 
8fb7f0c93SDavid du Colombier typedef struct State State;
9fb7f0c93SDavid du Colombier struct State
10fb7f0c93SDavid du Colombier {
11fb7f0c93SDavid du Colombier 	Key *key;
12fb7f0c93SDavid du Colombier };
13fb7f0c93SDavid du Colombier 
14fb7f0c93SDavid du Colombier enum
15fb7f0c93SDavid du Colombier {
16fb7f0c93SDavid du Colombier 	HavePass,
17fb7f0c93SDavid du Colombier };
18fb7f0c93SDavid du Colombier 
19fb7f0c93SDavid du Colombier static int
wepinit(Proto *,Fsstate * fss)20fb7f0c93SDavid du Colombier wepinit(Proto*, Fsstate *fss)
21fb7f0c93SDavid du Colombier {
22fb7f0c93SDavid du Colombier 	int ret;
23fb7f0c93SDavid du Colombier 	Key *k;
24*260f7b65SDavid du Colombier 	Keyinfo ki;
25fb7f0c93SDavid du Colombier 	State *s;
26fb7f0c93SDavid du Colombier 
27fb7f0c93SDavid du Colombier 	/* find a key with at least one password */
28*260f7b65SDavid du Colombier 	mkkeyinfo(&ki, fss, nil);
29*260f7b65SDavid du Colombier 	ret = findkey(&k, &ki, "!key1?");
30fb7f0c93SDavid du Colombier 	if(ret != RpcOk)
31*260f7b65SDavid du Colombier 		ret = findkey(&k, &ki, "!key2?");
32fb7f0c93SDavid du Colombier 	if(ret != RpcOk)
33*260f7b65SDavid du Colombier 		ret = findkey(&k, &ki, "!key3?");
34fb7f0c93SDavid du Colombier 	if(ret != RpcOk)
35fb7f0c93SDavid du Colombier 		return ret;
36fb7f0c93SDavid du Colombier 
37fb7f0c93SDavid du Colombier 	setattrs(fss->attr, k->attr);
38fb7f0c93SDavid du Colombier 	s = emalloc(sizeof(*s));
39fb7f0c93SDavid du Colombier 	s->key = k;
40fb7f0c93SDavid du Colombier 	fss->ps = s;
41fb7f0c93SDavid du Colombier 	fss->phase = HavePass;
42fb7f0c93SDavid du Colombier 
43fb7f0c93SDavid du Colombier 	return RpcOk;
44fb7f0c93SDavid du Colombier }
45fb7f0c93SDavid du Colombier 
46fb7f0c93SDavid du Colombier static void
wepclose(Fsstate * fss)47fb7f0c93SDavid du Colombier wepclose(Fsstate *fss)
48fb7f0c93SDavid du Colombier {
49fb7f0c93SDavid du Colombier 	State *s;
50fb7f0c93SDavid du Colombier 
51fb7f0c93SDavid du Colombier 	s = fss->ps;
52fb7f0c93SDavid du Colombier 	if(s->key)
53fb7f0c93SDavid du Colombier 		closekey(s->key);
54fb7f0c93SDavid du Colombier 	free(s);
55fb7f0c93SDavid du Colombier }
56fb7f0c93SDavid du Colombier 
57fb7f0c93SDavid du Colombier static int
wepread(Fsstate * fss,void *,uint *)58fb7f0c93SDavid du Colombier wepread(Fsstate *fss, void*, uint*)
59fb7f0c93SDavid du Colombier {
60fb7f0c93SDavid du Colombier 	return phaseerror(fss, "read");
61fb7f0c93SDavid du Colombier }
62fb7f0c93SDavid du Colombier 
63fb7f0c93SDavid du Colombier static int
wepwrite(Fsstate * fss,void * va,uint n)64fb7f0c93SDavid du Colombier wepwrite(Fsstate *fss, void *va, uint n)
65fb7f0c93SDavid du Colombier {
66fb7f0c93SDavid du Colombier 	char *data = va;
67fb7f0c93SDavid du Colombier 	State *s;
68fb7f0c93SDavid du Colombier 	char dev[64];
69fb7f0c93SDavid du Colombier 	int fd, cfd;
70fb7f0c93SDavid du Colombier 	int rv;
71fb7f0c93SDavid du Colombier 	char *p;
72fb7f0c93SDavid du Colombier 
73fb7f0c93SDavid du Colombier 	/* get the device */
74fb7f0c93SDavid du Colombier 	if(n > sizeof(dev)-5){
75fb7f0c93SDavid du Colombier 		werrstr("device too long");
76fb7f0c93SDavid du Colombier 		return RpcErrstr;
77fb7f0c93SDavid du Colombier 	}
78fb7f0c93SDavid du Colombier 	memmove(dev, data, n);
79fb7f0c93SDavid du Colombier 	dev[n] = 0;
80fb7f0c93SDavid du Colombier 	s = fss->ps;
81fb7f0c93SDavid du Colombier 
82fb7f0c93SDavid du Colombier 	/* legal? */
83fb7f0c93SDavid du Colombier 	if(dev[0] != '#' || dev[1] != 'l'){
84fb7f0c93SDavid du Colombier 		werrstr("%s not an ether device", dev);
85fb7f0c93SDavid du Colombier 		return RpcErrstr;
86fb7f0c93SDavid du Colombier 	}
87fb7f0c93SDavid du Colombier 	strcat(dev, "!0");
88fb7f0c93SDavid du Colombier 	fd = dial(dev, 0, 0, &cfd);
89fb7f0c93SDavid du Colombier 	if(fd < 0)
90fb7f0c93SDavid du Colombier 		return RpcErrstr;
91fb7f0c93SDavid du Colombier 
92fb7f0c93SDavid du Colombier 	/* flavor it with passwords, essid, and turn on wep */
93fb7f0c93SDavid du Colombier 	rv = RpcErrstr;
94fb7f0c93SDavid du Colombier 	p = _strfindattr(s->key->privattr, "!key1");
95fb7f0c93SDavid du Colombier 	if(p != nil)
96fb7f0c93SDavid du Colombier 		if(fprint(cfd, "key1 %s", p) < 0)
97fb7f0c93SDavid du Colombier 			goto out;
98fb7f0c93SDavid du Colombier 	p = _strfindattr(s->key->privattr, "!key2");
99fb7f0c93SDavid du Colombier 	if(p != nil)
100fb7f0c93SDavid du Colombier 		if(fprint(cfd, "key2 %s", p) < 0)
101fb7f0c93SDavid du Colombier 			goto out;
102fb7f0c93SDavid du Colombier 	p = _strfindattr(s->key->privattr, "!key3");
103fb7f0c93SDavid du Colombier 	if(p != nil)
104fb7f0c93SDavid du Colombier 		if(fprint(cfd, "key3 %s", p) < 0)
105fb7f0c93SDavid du Colombier 			goto out;
106fb7f0c93SDavid du Colombier 	p = _strfindattr(fss->attr, "essid");
107fb7f0c93SDavid du Colombier 	if(p != nil)
108fb7f0c93SDavid du Colombier 		if(fprint(cfd, "essid %s", p) < 0)
109fb7f0c93SDavid du Colombier 			goto out;
110fb7f0c93SDavid du Colombier 	if(fprint(cfd, "crypt on") < 0)
111fb7f0c93SDavid du Colombier 		goto out;
112fb7f0c93SDavid du Colombier 	rv = RpcOk;
113fb7f0c93SDavid du Colombier out:
114fb7f0c93SDavid du Colombier 	close(fd);
115fb7f0c93SDavid du Colombier 	close(cfd);
116fb7f0c93SDavid du Colombier 	return rv;
117fb7f0c93SDavid du Colombier }
118fb7f0c93SDavid du Colombier 
119fb7f0c93SDavid du Colombier Proto wep =
120fb7f0c93SDavid du Colombier {
121fb7f0c93SDavid du Colombier .name=		"wep",
122fb7f0c93SDavid du Colombier .init=		wepinit,
123fb7f0c93SDavid du Colombier .write=		wepwrite,
124fb7f0c93SDavid du Colombier .read=		wepread,
125fb7f0c93SDavid du Colombier .close=		wepclose,
126fb7f0c93SDavid du Colombier .addkey=	replacekey,
127fb7f0c93SDavid du Colombier .keyprompt=	"!key1? !key2? !key3? essid?",
128fb7f0c93SDavid du Colombier };
129