}
-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 {}
}
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
}
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]
[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
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]
}
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} {
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
}
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
}
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
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]
}
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 |
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 |
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
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
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 {
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 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 \
}
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
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
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]} {
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]
}
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
--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" }
}
}
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