X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=make-probes.tcl;fp=make-probes.tcl;h=c3a1d3330b20eac311afc1c311f52dec7d971686;hb=86b4477fa8243a1400933b2eed18099a37de6825;hp=034e690b30fdfbd791a1944dbdd56667df4e388a;hpb=342c1d9d82eb5ccfd2075da57cf62a98238a33df;p=vinegar-ip.git diff --git a/make-probes.tcl b/make-probes.tcl index 034e690..c3a1d33 100755 --- a/make-probes.tcl +++ b/make-probes.tcl @@ -14,9 +14,9 @@ proc manyset {list args} { } -proc start_gen {use_gen_counter} { - global gen_counter rand_counter getlog_log rand_buf - random-bytes-init $use_gen_counter +proc start_gen {seed} { + global getlog_log + random-bytes-init $seed set getlog_log {} } @@ -41,10 +41,8 @@ namespace eval Random-Bytes { namespace export random-bytes random-bytes-init proc random-bytes-init {seed} { - variable counter variable fh catch { set h $fh; unset fh; close $h } - set counter 0 set fh [open |[list openssl bf-ofb < /dev/zero -e -k " $seed"] r] fconfigure $fh -translation binary } @@ -78,8 +76,8 @@ proc choice-prob {cv def} { proc choice-mult {args} { if {!([llength $args] % 2)} { error "choice-mult must have default" } - set x 0x[random-bytes 3] - set x [expr { double($x) / double(0x1000000) }] + set h 0x[random-bytes 3] + set x [expr { double($h) / double(0x1000000) }] set cump 0.0 set def [lindex $args end] set args [lreplace $args end end] @@ -119,7 +117,7 @@ proc depending-on {scope enum_and_var mtu mtuadjust args} { [catch { info body $procname }]} { getlog (junk) get-for $scope-fill - get data rand 0 $mtu + get data rand 0 $mtu 1 return $data } else { uplevel 1 [list $procname] $mtu $args @@ -172,7 +170,7 @@ proc get/enum-rand {s v min max} { proc get/enum-def {s v} { upvar #0 enum/val2name/$s-$v v2n set rv [choice-int 1 [array size v2n]] - set rv [lindex [array names v2n] [expr {$rv-1}]] + set rv [lindex [lsort [array names v2n]] [expr {$rv-1}]] return [get-enum-got $s $v $rv] } @@ -216,11 +214,11 @@ proc get/choice {s v defprob} { return $rv } -proc get/rand {s v minlen maxlen} { +proc get/rand {s v minlen maxlen blockbytes} { get-for $s-$v if {$maxlen<0} { getlog (full!); return {} } - get l number $minlen $maxlen - return [random-bytes $l] + get l number [expr {$minlen/$blockbytes}] [expr {$maxlen/$blockbytes}] + return [random-bytes [expr {$l*$blockbytes}]] } proc get/ip-timestamp {s v} { @@ -261,6 +259,12 @@ proc get/string {s v minlen maxlen first rest} { return [packet-fromstring $o] } +proc get/ntstring {s v minlen maxlen first rest} { + set s [get/string $s $v $minlen $maxlen $first $rest] + append s 00 + append s [random-bytes $maxlen] + return [string range $s 0 [expr {$maxlen*2-1}]] +} namespace eval Assembler { namespace export assemble assembly-overwrite @@ -469,11 +473,15 @@ namespace eval Assembler { } namespace import Assembler::* -proc gen_1_ip {mtu} { +proc gen_1_ip {mtu source_spec dest_spec} { # RFC791 upvar #0 ip_proto proto upvar #0 ip_source source upvar #0 ip_dest dest + + set source $source_spec + set dest $dest_spec + get-for ip set version 4 get tos hex 0x00 0xff @@ -488,8 +496,6 @@ proc gen_1_ip {mtu} { } get-config ttl 255 number 0 255 get proto enum 1 255 0.05 - get-config source 127.0.0.1 v4addr - get-config dest 127.0.0.1 v4addr set flags [expr {$df*2 + $mf}] set header_checksum 0 @@ -548,7 +554,7 @@ proc define-icmp-type-vanilla {num name} { proc icmp-vanilla {mbl typename} { get-for icmp-$typename get code enum 0 255 0.4 - get body rand 0 $mbl + get body rand 0 $mbl 1 return [list $body $code] } @@ -574,7 +580,7 @@ define icmp-type 5 redirect {mbl} { get-for icmp-redirect get code enum 0 255 0.4 get gateway v4addr - get data rand 0 [expr {$mbl-4}] + get data rand 0 [expr {$mbl-4}] 1 assemble body { +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Gateway | @@ -597,7 +603,7 @@ proc icmp-echo {mbl} { get code enum 0 255 0.4 get id hex 0 0xffff get seq hex 0 0xffff - get data rand 0 [expr {$mbl-8}] + get data rand 0 [expr {$mbl-8}] 1 assemble body { +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Id | Seq | @@ -657,10 +663,10 @@ proc port-pair {scope} { get-for $scope get style choice-mult \ - request 0.24 \ - reply 0.24 \ - random 0.16 \ - servers + request 0.15 \ + reply 0.15 \ + servers 0.20 \ + random if {"$style" != "random"} { get port enum-def @@ -681,20 +687,86 @@ proc port-pair {scope} { return [list $source_port $dest_port $def_port $style] } + +define ip-proto 4 ip {mtu} { + # RFC2003 + get-for ip-ip + get source v4addr + get dest v4addr + gen_1_ip $mtu $source $dest +} + + +define ip-proto 2 igmp {mtu} { + get-for igmp + get type enum 0 255 0.5 + get timeout number 0 255 + get group v4addr + set checksum 0 + set extra {} + assemble igmp { + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type | Timeout | ? Checksum | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Group | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ? Extra ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + } + + if {[choice-prob igmp-extra 0.3]} { + get extra rand 1 [expr {$mtu - [packet-len $igmp]}] 1 + assembly-overwrite igmp extra $extra + } + + assembly-overwrite igmp checksum [packet-csum-ip $igmp] + return $igmp +} + +define igmp-type 17 membquery {} {} +define igmp-type 16 membreport {} {} +define igmp-type 23 leavegroup {} {} +define igmp-type 18 membreport {} {} + + +define ip-proto 51 ah {mtu} { + # RFC1826 + get-for ah + get next number 0 255 + get reserved hex 0 0xffff + get spi hex32 + get auth_data rand 0 [expr {$mtu-8}] 4 + set length [packet-len $auth_data] + assemble ah { + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next | Length | RESERVED | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | SPI | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Auth Data ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + } + get payload rand 0 [expr {$mtu - [packet-len $ah]}] 1 + append ah $payload + return $ah +} + + define ip-proto 17 udp {mtu} { + # RFC768 get-for udp - get checksum choice-mult \ + set csum_mode [choice-mult \ checksum_bad 0.10 \ checksum_none 0.20 \ - checksum_good + checksum_good] manyset [port-pair udp] source_port dest_port def_port style if {"$style" != "random"} { set port $def_port set data [depending-on udp port $mtu -8 $style] } else { - get data rand 0 [expr {$mtu-8}] + get data rand 0 [expr {$mtu-8}] 1 } set length 0 @@ -711,7 +783,10 @@ define ip-proto 17 udp {mtu} { set udp_length [packet-len $udp] assembly-overwrite udp length $udp_length - if {"$checksum" != "none"} { + if {"$csum_mode" == "checksum_none"} { + set checksum 0 + getlog (nocsum) + } else { global ip_source ip_dest ip_proto assemble pseudo { +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -722,20 +797,19 @@ define ip-proto 17 udp {mtu} { | 0 | IP Proto | UDP length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ } - set csum [packet-csum-ip "$pseudo$udp"] - if {!$csum} { set csum 0xffff } - if {"$checksum" == "bad"} { + set checksum [packet-csum-ip "$pseudo$udp"] + if {!$checksum} { set checksum 0xffff } + if {"$csum_mode" == "checksum_bad"} { get csumerror hex 1 0xffff - set csum [expr {$csum ^ $csumerror}] + set checksum [expr {$checksum ^ $csumerror}] } - } else { - set csum 0 } - assembly-overwrite udp checksum $csum + assembly-overwrite udp checksum $checksum return $udp } define udp-port 50 remailck {mtu style} { + # RFC1339 get-for remailck if {"$style" == "request"} { get what choice-mult \ @@ -761,7 +835,7 @@ define udp-port 50 remailck {mtu style} { } req-baduser { set auth 0 - get user rand 0 [expr {$mtu - 4}] + get user rand 0 [expr {$mtu - 4}] 1 } req-auth { get auth enum 0 31 0.5 @@ -835,7 +909,56 @@ define remailck-auth 31 passwd {mtu} { return $passwd } +define udp-port 67 dhcpserv {mtu style} { return [dhcp $mtu] } +define udp-port 68 dhcpclient {mtu style} { return [dhcp $mtu] } +proc dhcp {mtu} { + get-for dhcp + get op enum 0 255 0.2 + get htype enum 0 255 0.2 + set hlen 6 + get hops number 0 255 + get xid hex32 + get secs number 0 300 + get flags hex 0 255 + get ciaddr v4addr + get yiaddr v4addr + get siaddr v4addr + get giaddr v4addr + set chaddr [random-bytes 16] + get sname ntstring 0 64 \ + 0123456789abcdefghijklmnopqrstuvwxyz \ + 0123456789abcdefghijklmnopqrstuvwxyz.-+ + get file ntstring 0 128 / \ + 0123456789abcdefghijklmnopqrstuvwxyz.-+/_ + + assemble dhcp { + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | op | htype | hlen | hops | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xid | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | secs | flags | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ciaddr | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | yiaddr | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | siaddr | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | giaddr | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + } + append dhcp $chaddr $sname $file + + return $dhcp +} +define dhcp-op 1 request {} {} +define dhcp-op 2 reply {} {} +define dhcp-htype 1 ethernet {} {} + + define ip-proto 6 tcp {mtu} { + # RFC793 get-for tcp get source_port number 0 65535 @@ -881,7 +1004,7 @@ define ip-proto 6 tcp {mtu} { switch -exact $optmode { noopt { } badopt { - get options rand 1 60 + get options rand 1 60 1 } opt { while {[choice-prob tcp-opts-more 0.4]} { @@ -943,7 +1066,7 @@ define ip-proto 6 tcp {mtu} { assembly-overwrite packet d_off $d_off if {!($s || $r) || [get unexpdata flag 0.2]} { - get data rand 0 [expr {$mtu - [packet-len $packet]}] + get data rand 0 [expr {$mtu - [packet-len $packet]}] 1 append packet $data } set tcp_length [packet-len $packet] @@ -1031,15 +1154,20 @@ namespace eval PCap { } namespace import PCap::* -proc emit {count} { +proc emit {seed} { global getlog_log errorInfo mtu + + get-for ip + get-config source 127.0.0.1 v4addr + get-config dest 127.0.0.1 v4addr + if {[catch { - start_gen $count - set packet [gen_1_ip $mtu] - puts stdout "[format %6d $count] $getlog_log\n $packet" + start_gen $seed + set packet [gen_1_ip $mtu $source $dest] + puts stdout "[format %6s $seed] $getlog_log\n $packet" } emsg]} { - puts stderr "\nERROR\n$count\n\n$emsg\n\n$errorInfo\n\n" - puts stdout "[format %06d $count] error" + puts stderr "\nERROR\n$seed\n\n$emsg\n\n$errorInfo\n\n" + puts stdout "[format %6s $seed] error" } else { set ts_sec [clock seconds] set ts_usec 0 @@ -1083,6 +1211,8 @@ while {[regexp {^\-\-} [lindex $argv 0]]} { --write { pcap_open [nextarg] } --mtu { set mtu [nextarg_num] } --xseed { set xseed [nextarg] } + --source { set config/ip-source [nextarg] } + --dest { set config/ip-dest [nextarg] } default { error "bad option $o" } } } @@ -1105,15 +1235,13 @@ pcap_write { s32 linktype } -if {[llength $argv] && ![string length $upto]} { +if {[llength $argv]} { foreach count $argv { emit "$xseed$count" } -} elseif {![llength $argv]} { +} else { if {![string length $upto]} { set upto 100 } for {set count 1} {$upto<0 || $count<=$upto} {incr count} { emit "$xseed$count" } -} else { - error "bad mode" } pcap_close