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