xref: /plan9-contrib/sys/src/cmd/ip/snoopy/eapol_key.c (revision ed397113cdcf7aafea372b730bbcd17b05ee3f60)
1 #include <u.h>
2 #include <libc.h>
3 #include <ip.h>
4 #include "dat.h"
5 #include "protos.h"
6 
7 typedef struct Hdr
8 {
9 	uchar	desc;
10 } Hdr;
11 
12 typedef struct Rc4KeyDesc
13 {
14 	uchar	ln[2];
15 	uchar	replay[8];
16 	uchar	iv[16];
17 	uchar	idx;
18 	uchar	md[16];
19 } Rc4KeyDesc;
20 
21 enum
22 {
23 	HDR=	1,		/* sizeof(Hdr) */
24 	RC4KEYDESC=	43,	/* sizeof(Rc4KeyDesc) */
25 
26 	DescTpRC4= 1,
27 };
28 
29 enum
30 {
31 	Odesc,
32 };
33 
34 static Mux p_mux[] =
35 {
36 	{ "rc4keydesc", DescTpRC4, },
37 	{ 0 }
38 };
39 
40 static Mux p_muxrc4[] =
41 {
42 	{ "dump", 0, },
43 	{ 0 }
44 };
45 
46 static void
p_compile(Filter * f)47 p_compile(Filter *f)
48 {
49 	Mux *m;
50 
51 	for(m = p_mux; m->name != nil; m++)
52 		if(strcmp(f->s, m->name) == 0){
53 			f->pr = m->pr;
54 			f->ulv = m->val;
55 			f->subop = Odesc;
56 			return;
57 		}
58 	sysfatal("unknown eap_key field or type: %s", f->s);
59 }
60 
61 static int
p_filter(Filter * f,Msg * m)62 p_filter(Filter *f, Msg *m)
63 {
64 	Hdr *h;
65 
66 	if(m->pe - m->ps < HDR)
67 		return 0;
68 
69 	h = (Hdr*)m->ps;
70 	m->ps += HDR;
71 
72 	switch(f->subop){
73 	case Odesc:
74 		return h->desc == f->ulv;
75 	}
76 	return 0;
77 }
78 
79 static char*
op(int i)80 op(int i)
81 {
82 	static char x[20];
83 
84 	switch(i){
85 	case DescTpRC4:
86 		return "RC4KeyDesc";
87 	default:
88 		sprint(x, "%1d", i);
89 		return x;
90 	}
91 }
92 
93 static int
p_seprint(Msg * m)94 p_seprint(Msg *m)
95 {
96 	Hdr *h;
97 
98 	if(m->pe - m->ps < HDR)
99 		return -1;
100 
101 	h = (Hdr*)m->ps;
102 	m->ps += HDR;
103 
104 	/* next protocol  depending on type*/
105 	demux(p_mux, h->desc, h->desc, m, &dump);
106 
107 	m->p = seprint(m->p, m->e, "desc=%s", op(h->desc));
108 	return 0;
109 }
110 
111 static int
p_seprintrc4(Msg * m)112 p_seprintrc4(Msg *m)
113 {
114 	Rc4KeyDesc *h;
115 	int len;
116 
117 	if(m->pe - m->ps < RC4KEYDESC)
118 		return -1;
119 
120 	h = (Rc4KeyDesc*)m->ps;
121 	m->ps += RC4KEYDESC;
122 	m->pr = nil;
123 	len = m->pe - m->ps;
124 
125 	m->p = seprint(m->p, m->e, "keylen=%1d replay=%1d iv=%1d idx=%1d md=%1d",
126 			NetS(h->ln), NetS(h->replay), NetS(h->iv), h->idx, NetS(h->md));
127 	m->p = seprint(m->p, m->e, " dataln=%d", len);
128 	if (len > 0)
129 		m->p = seprint(m->p, m->e, " data=%.*H", len, m->ps);
130 	return 0;
131 }
132 
133 Proto eapol_key =
134 {
135 	"eapol_key",
136 	p_compile,
137 	p_filter,
138 	p_seprint,
139 	p_mux,
140 	"%lud",
141 	nil,
142 	defaultframer,
143 };
144 
145 Proto rc4keydesc =
146 {
147 	"rc4keydesc",
148 	p_compile,
149 	nil,
150 	p_seprintrc4,
151 	nil,
152 	nil,
153 	nil,
154 	defaultframer,
155 };
156