+ | ? Length | ? Checksum |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Data ... |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ }
+ set udp_length [packet-len $udp]
+ assembly-overwrite udp length $udp_length
+
+ if {"$csum_mode" == "checksum_none"} {
+ set checksum 0
+ getlog (nocsum)
+ } else {
+ global ip_source ip_dest ip_proto
+ assemble pseudo {
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | IP Source |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | IP Dest |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | 0 | IP Proto | UDP length |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ }
+ set checksum [packet-csum-ip "$pseudo$udp"]
+ if {!$checksum} { set checksum 0xffff }
+ if {"$csum_mode" == "checksum_bad"} {
+ get csumerror hex 1 0xffff
+ set checksum [expr {$checksum ^ $csumerror}]
+ }
+ }
+ 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 0.15 \
+ req-auth 0.15 \
+ resp-ok 0.15 \
+ resp-auth 0.15 \
+ req-user
+ } else {
+ get what choice-mult \
+ req-baduser 0.15 \
+ req-auth 0.15 \
+ resp-auth 0.15 \
+ req-user 0.15 \
+ resp-ok
+ }
+ switch -exact $what {
+ req-user {
+ set auth 0
+ get user string 1 8 \
+ abcdefghijklmnopqrustuvwxyz \
+ abcdefghijklmnopqrustuvwxyz-0123456789_
+ }
+ req-baduser {
+ set auth 0
+ get user rand 0 [expr {$mtu - 4}] 1
+ }
+ req-auth {
+ get auth enum 0 31 0.5
+ set user [depending-on remailck auth $mtu -4]
+ }
+ resp-auth {
+ get auth hex 0 0xffff
+ set modified 0
+ set read 0
+ }
+ resp-ok {
+ get mail choice-mult \
+ newmail 0.15 \
+ oldmail 0.15 \
+ nomail 0.20 \
+ times
+ set auth 0
+ switch -exact $mail {
+ newmail {
+ set modified 0
+ set read 1
+ }
+ oldmail {
+ set modified 1
+ set read 0
+ }
+ nomail {
+ set modified 0
+ set read 0
+ }
+ times {
+ get modified number 1 600
+ get read number 1 600
+ }
+ default { error "mail? $mail" }
+ }
+ }
+ default { error "what? $what" }
+ }
+ switch -glob $what {
+ req-* {
+ assemble payload {
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Auth |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | User ... |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ }
+ }
+ resp-* {
+ assemble payload {
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Auth |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Modified |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Read |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ }
+ }
+ default { error "what?? $what" }
+ }
+ return $payload
+}
+
+define remailck-auth 31 passwd {mtu} {
+ get-for remailck-passwd
+ get passwd string 6 8 \
+ 0123456789abcdefghijklmnopqrstuvxwyz \
+ 0123456789abcdefghijklmnopqrstuvxwyz
+ 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 |