chiark / gitweb /
test: Makefile rune for `check'
[secnet.git] / test / common.tcl
1 package require Tclx
2
3 load chiark_tcl_hbytes-1.so
4 load chiark_tcl_dgram-1.so
5
6 set netlink(inside) {
7     local-address "172.18.232.9";
8     secnet-address "172.18.232.10";
9     remote-networks "172.18.232.0/28";
10 }
11 set netlink(outside) {
12     local-address "172.18.232.1";
13     secnet-address "172.18.232.2";
14     remote-networks "172.18.232.0/28";
15 }
16
17 set ports(inside) {16913 16910}
18 set ports(outside) 16900
19
20 set extra(inside) {
21     local-mobile True;
22     mtu-target 1260;
23 }
24 set extra(outside) {}
25
26 proc mkconf {which} {
27     global tmp
28     global netlink
29     global ports
30     global extra
31     global netlinkfh
32     set pipefp $tmp/$which.netlink
33     foreach tr {t r} {
34         file delete $pipefp.$tr
35         exec mkfifo -m600 $pipefp.$tr
36         set netlinkfh($which.$tr) [set fh [open $pipefp.$tr r+]]
37         fconfigure $fh -blocking 0 -buffering none -translation binary
38     }
39     fileevent $netlinkfh($which.r) readable [list netlink-readable $which]
40     set fakeuf $tmp/$which.fake-userv
41     set fakeuh [open $fakeuf w 0755]
42     puts $fakeuh "#!/bin/sh
43 set -e
44 exec 3<&0
45 cat <&3 3<&- >$pipefp.r &
46 exec 3<>$pipefp.t
47 exec <$pipefp.t
48 exec 3<&-
49 exec cat
50 "
51     close $fakeuh
52     set cfg "
53         netlink userv-ipif {
54             name \"netlink\";
55             userv-path \"$fakeuf\";
56         $netlink($which)
57             mtu 1400;
58             buffer sysbuffer(2048);
59             interface \"secnet-test-[string range $which 0 0]\";
60         };
61         comm
62 "
63     set delim {}
64     foreach port $ports($which) {
65         append cfg "$delim
66             udp {
67                 port $port;
68                 address \"::1\", \"127.0.0.1\";
69                 buffer sysbuffer(4096);
70             }
71         "
72         set delim ,
73     }
74     append cfg ";
75         local-name \"test-example/$which/$which\";
76         local-key rsa-private(\"test-example/$which.key\");
77 "
78     append cfg $extra($which)
79     append cfg {
80         log logfile {
81             filename "/dev/tty";
82             class "info","notice","warning","error","security","fatal";
83         };
84         system {
85         };
86         resolver adns {
87         };
88         log-events "all";
89         random randomfile("/dev/urandom",no);
90         transform eax-serpent { }, serpent256-cbc { };
91         include test-example/sites.conf
92         sites map(site,vpn/test-example/all-sites);
93     }
94     return $cfg
95 }
96
97 proc spawn-secnet {which} {
98     global netlinkfh
99     global tmp
100     upvar #0 pids($which) pid
101     set cf $tmp/$which.conf
102     set ch [open $cf w]
103     puts $ch [mkconf $which]
104     close $ch
105     set argl [list strace -o$tmp/$which.strace ./secnet -dvnc $cf]
106     set pid [fork]
107     if {!$pid} {
108         execl [lindex $argl 0] [lrange $argl 1 end]
109     }
110     puts -nonewline $netlinkfh($which.t) [hbytes h2raw c0]
111 }
112
113 proc netlink-readable {which} {
114     global ok
115     upvar #0 netlinkfh($which.r) fh
116     read $fh; # empty the buffer
117     switch -exact $which {
118         inside {
119             puts OK
120             set ok 1; # what a bodge
121             return
122         }
123         outside {
124             error "inside rx'd!"
125         }
126     }
127 }
128
129 proc bgerror {message} {
130     global errorInfo errorCode
131     catch {
132         puts stderr "
133 ----------------------------------------
134 $errorInfo
135
136 $errorCode
137 $message
138 ----------------------------------------
139     "
140     }
141     exit 1
142 }
143
144 proc sendpkt {} {
145     global netlinkfh
146     set p {
147         4500 0054 ed9d 4000 4001 24da ac12 e809
148         ac12 e802 0800 1de4 2d96 0001 f1d4 a05d
149         0000 0000 507f 0b00 0000 0000 1011 1213
150         1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
151         2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
152         3435 3637
153     }
154     puts -nonewline $netlinkfh(inside.t) \
155         [hbytes h2raw c0[join $p ""]c0]
156 }
157
158 file mkdir test/tmp
159 set tmp test/tmp
160 set socktmp $tmp/s
161 exec mkdir -p -m700 $socktmp
162 regsub {^(?!/)} $socktmp {./} socktmp ;# dgram-socket wants ./ or /
163
164 proc prefix_preload {lib} {
165     global env
166     set l {}
167     catch { set l [split $env(PRELOAD) :] }
168     set l [concat [list $lib] $l]
169     set env(LD_PRELOAD) [join $l :]
170 }
171
172 set env(UDP_PRELOAD_DIR) $socktmp
173 prefix_preload test/udp-preload.so
174
175 proc udp-proxy {} {
176     global socktmp udpsock
177     set u $socktmp/udp
178     file delete $u
179     regsub {^(?!/)} $u {./} u
180     set udpsock [dgram-socket create $u]
181     dgram-socket on-receive $udpsock udp-relay
182 }
183
184 proc udp-relay {data src sock args} {
185     global udpsock socktmp
186     set headerlen [expr {52+1}]
187     set orgsrc $src
188
189     set dst [hbytes range $data 0 $headerlen]
190     regsub {(?:00)*$} $dst {} dst
191     set dst [hbytes h2raw $dst]
192
193     hbytes overwrite data 0 [hbytes zeroes $headerlen]
194     regsub {.*/} $src {} src
195     set srch [hbytes raw2h $src]
196     hbytes append srch 00
197     if {[catch {
198         if {[regexp {[^.,:0-9a-f]} $dst c]} { error "bad dst" }
199         if {[hbytes length $srch] > $headerlen} { error "src addr too long" }
200         hbytes overwrite data 0 $srch
201         dgram-socket transmit $udpsock $data $socktmp/$dst
202     } emsg]} {
203         puts stderr "$orgsrc -> $dst: $emsg"
204     }
205 }