chiark / gitweb /
test-example: Provide a fuzzer for the slip decoder
[secnet.git] / test-example / random-fake-userv
1 #!/usr/bin/perl -w
2
3 use strict;
4 use POSIX;
5
6 open R, '/dev/urandom' or die $!;
7
8 system 'cat >/dev/null &';
9
10 sub randbytes ($) {
11     my ($count) = @_;
12     my $s;
13     my $r = read R, $s, $count;
14     die $! unless $r==$count;
15     return $s;
16 }
17
18 sub randbyteval () {
19     my $b = randbytes 1;
20     my ($r) = unpack 'C', $b;
21     return $r;
22 }
23
24 sub randvalue ($$) {
25     my ($min,$maxplus1) = @_;
26     my $b = randbyteval;
27     return floor(($b/256.0) * ($maxplus1-$min)) + $min;
28 }
29
30 for (;;) {
31     my $lenbits = randvalue 0,14;
32     my $len= (randbyteval << 8) | randbyteval;
33     $len &= (1 << $lenbits)-1;
34     my $data = randbytes $len;
35     if (randbyteval >= 0x80) {
36         $data =~ s{[\xc0\xdb]}{
37             $& eq "\xc0" ? "\xcb\xdc" :
38             $& eq "\xdb" ? "\xcb\xdd" :
39             die
40         }ge;
41     }
42     print "\xc0";
43     print $data;
44     STDOUT->flush;
45 }