rfuzz 0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. data/COPYING +55 -0
  2. data/LICENSE +55 -0
  3. data/README +252 -0
  4. data/Rakefile +48 -0
  5. data/doc/rdoc/classes/RFuzz.html +146 -0
  6. data/doc/rdoc/classes/RFuzz/HttpClient.html +481 -0
  7. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000010.html +24 -0
  8. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000011.html +34 -0
  9. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000012.html +49 -0
  10. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000013.html +49 -0
  11. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000014.html +57 -0
  12. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000015.html +37 -0
  13. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000016.html +26 -0
  14. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000017.html +34 -0
  15. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000018.html +18 -0
  16. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000019.html +26 -0
  17. data/doc/rdoc/classes/RFuzz/HttpEncoding.html +294 -0
  18. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000001.html +26 -0
  19. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000002.html +18 -0
  20. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000003.html +26 -0
  21. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000004.html +18 -0
  22. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000005.html +32 -0
  23. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000006.html +18 -0
  24. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000007.html +20 -0
  25. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000008.html +20 -0
  26. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000009.html +32 -0
  27. data/doc/rdoc/classes/RFuzz/HttpResponse.html +180 -0
  28. data/doc/rdoc/classes/RFuzz/Notifier.html +252 -0
  29. data/doc/rdoc/classes/RFuzz/Notifier.src/M000044.html +17 -0
  30. data/doc/rdoc/classes/RFuzz/Notifier.src/M000045.html +17 -0
  31. data/doc/rdoc/classes/RFuzz/Notifier.src/M000046.html +17 -0
  32. data/doc/rdoc/classes/RFuzz/Notifier.src/M000047.html +17 -0
  33. data/doc/rdoc/classes/RFuzz/Notifier.src/M000048.html +17 -0
  34. data/doc/rdoc/classes/RFuzz/Notifier.src/M000049.html +17 -0
  35. data/doc/rdoc/classes/RFuzz/RandomGenerator.html +362 -0
  36. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000032.html +21 -0
  37. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000033.html +23 -0
  38. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000036.html +22 -0
  39. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000037.html +20 -0
  40. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000038.html +22 -0
  41. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000039.html +20 -0
  42. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000040.html +18 -0
  43. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000041.html +18 -0
  44. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000042.html +22 -0
  45. data/doc/rdoc/classes/RFuzz/RandomGenerator.src/M000043.html +18 -0
  46. data/doc/rdoc/classes/RFuzz/Sampler.html +383 -0
  47. data/doc/rdoc/classes/RFuzz/Sampler.src/M000056.html +19 -0
  48. data/doc/rdoc/classes/RFuzz/Sampler.src/M000057.html +23 -0
  49. data/doc/rdoc/classes/RFuzz/Sampler.src/M000058.html +26 -0
  50. data/doc/rdoc/classes/RFuzz/Sampler.src/M000059.html +18 -0
  51. data/doc/rdoc/classes/RFuzz/Sampler.src/M000060.html +18 -0
  52. data/doc/rdoc/classes/RFuzz/Sampler.src/M000061.html +18 -0
  53. data/doc/rdoc/classes/RFuzz/Sampler.src/M000062.html +18 -0
  54. data/doc/rdoc/classes/RFuzz/Sampler.src/M000063.html +19 -0
  55. data/doc/rdoc/classes/RFuzz/Sampler.src/M000064.html +18 -0
  56. data/doc/rdoc/classes/RFuzz/Sampler.src/M000065.html +23 -0
  57. data/doc/rdoc/classes/RFuzz/Sampler.src/M000066.html +18 -0
  58. data/doc/rdoc/classes/RFuzz/Sampler.src/M000067.html +20 -0
  59. data/doc/rdoc/classes/RFuzz/Session.html +415 -0
  60. data/doc/rdoc/classes/RFuzz/Session.src/M000020.html +31 -0
  61. data/doc/rdoc/classes/RFuzz/Session.src/M000021.html +18 -0
  62. data/doc/rdoc/classes/RFuzz/Session.src/M000022.html +18 -0
  63. data/doc/rdoc/classes/RFuzz/Session.src/M000023.html +34 -0
  64. data/doc/rdoc/classes/RFuzz/Session.src/M000024.html +19 -0
  65. data/doc/rdoc/classes/RFuzz/Session.src/M000025.html +19 -0
  66. data/doc/rdoc/classes/RFuzz/Session.src/M000026.html +26 -0
  67. data/doc/rdoc/classes/RFuzz/Session.src/M000027.html +29 -0
  68. data/doc/rdoc/classes/RFuzz/Session.src/M000028.html +19 -0
  69. data/doc/rdoc/classes/RFuzz/Session.src/M000029.html +18 -0
  70. data/doc/rdoc/classes/RFuzz/Session.src/M000030.html +18 -0
  71. data/doc/rdoc/classes/RFuzz/Session.src/M000031.html +23 -0
  72. data/doc/rdoc/classes/RFuzz/StatsTracker.html +242 -0
  73. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000050.html +19 -0
  74. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000051.html +19 -0
  75. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000052.html +18 -0
  76. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000053.html +18 -0
  77. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000054.html +28 -0
  78. data/doc/rdoc/classes/RFuzz/StatsTracker.src/M000055.html +18 -0
  79. data/doc/rdoc/created.rid +1 -0
  80. data/doc/rdoc/files/COPYING.html +168 -0
  81. data/doc/rdoc/files/LICENSE.html +168 -0
  82. data/doc/rdoc/files/README.html +473 -0
  83. data/doc/rdoc/files/lib/rfuzz/client_rb.html +111 -0
  84. data/doc/rdoc/files/lib/rfuzz/random_rb.html +116 -0
  85. data/doc/rdoc/files/lib/rfuzz/rfuzz_rb.html +109 -0
  86. data/doc/rdoc/files/lib/rfuzz/session_rb.html +111 -0
  87. data/doc/rdoc/files/lib/rfuzz/stats_rb.html +113 -0
  88. data/doc/rdoc/fr_class_index.html +35 -0
  89. data/doc/rdoc/fr_file_index.html +34 -0
  90. data/doc/rdoc/fr_method_index.html +93 -0
  91. data/doc/rdoc/index.html +24 -0
  92. data/doc/rdoc/rdoc-style.css +208 -0
  93. data/examples/amazon_headers.rb +38 -0
  94. data/examples/hpricot_pudding.rb +22 -0
  95. data/examples/kill_routes.rb +26 -0
  96. data/examples/mongrel_test_suite/lib/gen.rb +24 -0
  97. data/examples/mongrel_test_suite/test/camping/static_files.rb +9 -0
  98. data/examples/mongrel_test_suite/test/camping/upload_file.rb +9 -0
  99. data/examples/mongrel_test_suite/test/camping/upload_progress.rb +9 -0
  100. data/examples/mongrel_test_suite/test/http/base_protocol.rb +23 -0
  101. data/examples/mongrel_test_suite/test/nitro/upload_file.rb +9 -0
  102. data/examples/mongrel_test_suite/test/nitro/upload_progress.rb +9 -0
  103. data/examples/mongrel_test_suite/test/rails/static_files.rb +9 -0
  104. data/examples/mongrel_test_suite/test/rails/upload_file.rb +9 -0
  105. data/examples/mongrel_test_suite/test/rails/upload_progress.rb +9 -0
  106. data/examples/perftest.rb +30 -0
  107. data/ext/fuzzrnd/ext_help.h +14 -0
  108. data/ext/fuzzrnd/extconf.rb +6 -0
  109. data/ext/fuzzrnd/fuzzrnd.c +149 -0
  110. data/ext/http11_client/ext_help.h +14 -0
  111. data/ext/http11_client/extconf.rb +6 -0
  112. data/ext/http11_client/http11_client.c +288 -0
  113. data/ext/http11_client/http11_parser.c +629 -0
  114. data/ext/http11_client/http11_parser.h +46 -0
  115. data/ext/http11_client/http11_parser.rl +169 -0
  116. data/lib/rfuzz/client.rb +498 -0
  117. data/lib/rfuzz/random.rb +110 -0
  118. data/lib/rfuzz/rfuzz.rb +12 -0
  119. data/lib/rfuzz/session.rb +154 -0
  120. data/lib/rfuzz/stats.rb +159 -0
  121. data/resources/defaults.yaml +2 -0
  122. data/resources/words.txt +3310 -0
  123. data/test/coverage/index.html +388 -0
  124. data/test/coverage/lib-rfuzz-client_rb.html +1127 -0
  125. data/test/coverage/lib-rfuzz-random_rb.html +739 -0
  126. data/test/coverage/lib-rfuzz-session_rb.html +783 -0
  127. data/test/coverage/lib-rfuzz-stats_rb.html +788 -0
  128. data/test/server.rb +101 -0
  129. data/test/test_client.rb +164 -0
  130. data/test/test_fuzzrnd.rb +31 -0
  131. data/test/test_httpparser.rb +48 -0
  132. data/test/test_random.rb +75 -0
  133. data/test/test_session.rb +33 -0
  134. data/test/test_stats.rb +45 -0
  135. data/tools/rakehelp.rb +119 -0
  136. metadata +201 -0
@@ -0,0 +1,38 @@
1
+ require 'rubygems'
2
+ require 'rfuzz/session'
3
+ require 'hpricot'
4
+
5
+ include RFuzz
6
+ agent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4"
7
+
8
+ amazon = HttpClient.new("www.amazon.com", 80, :head => {"User-Agent" => agent}, :redirect => 10)
9
+
10
+ r = amazon.get("/")
11
+
12
+ puts "## AMAZON'S WACKY HEADERS:"
13
+ puts r.inspect
14
+
15
+ puts "\n\n## AMAZON'S LAME EASTER EGG:"
16
+ puts r.http_body.split("\n").last
17
+
18
+ a9 = {}
19
+ doc = Hpricot(r.http_body)
20
+ (doc/:form).collect {|f|
21
+ if /a9.amazon.com/ === f.attributes["action"]
22
+ a9["action"] = f.attributes["action"]
23
+ a9["method"] = f.attributes["method"]
24
+ (f/:input).each {|i| a9[i.attributes["name"]] = i.attributes }
25
+ end
26
+ }
27
+
28
+ puts "A9 FORM: #{a9.inspect}"
29
+ http://pastie.caboo.se/4810
30
+ # do a search
31
+ _, host, uri = a9["action"].split(/http:\/\/([a-z0-9\.]*)/)
32
+
33
+ a9client = HttpClient.new(host, 80, :head => {"User-Agent" => agent}, :redirect => 10)
34
+ r = a9client.get(uri, :query => {"q" => "test"})
35
+
36
+ puts "\n\n## RESULTS"
37
+ puts r.http_body
38
+
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'hpricot'
3
+ require 'rfuzz/session'
4
+ include RFuzz
5
+
6
+ agent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4"
7
+
8
+ google = HttpClient.new("www.google.com", 80)
9
+ r = google.get("/search", :head => {"User-Agent" => agent}, :query => {
10
+ "q" => ARGV[0], "hl" => "en", "btnG" => "Google Search"})
11
+
12
+ if r.http_status != "200"
13
+ puts "Wrong Status: #{r.http_status}, did you forget to search for something?"
14
+ else
15
+ doc = Hpricot(r.http_body)
16
+ (doc/:a).each do |link|
17
+ if link.attributes["class"] == "l"
18
+ puts link.attributes["href"]
19
+ puts " -- " + link.children.join
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ # An example of handing tons of nasty URLs to Rails to see what it does.
2
+
3
+ require 'rfuzz/session'
4
+
5
+ include RFuzz
6
+
7
+ s = Session.new :host => "localhost", :port => 3000
8
+ s.run 10, :save_as => ["runs.csv","counts.csv"] do |c,r|
9
+ len = r.num(90) + 1
10
+ s.count :len, len
11
+ uris = r.uris(ARGV[0].to_i,len)
12
+
13
+ uris.each do |u|
14
+ s.count_errors(:legal) do
15
+ # first sample for legal uris
16
+ resp = c.get(u)
17
+ s.count resp.http_status
18
+ end
19
+
20
+ # next sample for illegal uris
21
+ s.count_errors(:illegal) do
22
+ resp = c.get(u * 512)
23
+ s.count resp.http_status
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+
2
+ def sub_rant(name)
3
+ return <<-END
4
+ desc "Behavior for #{name}"
5
+ task :all do
6
+ sys "spec", sys["*.rb"]
7
+ end
8
+ END
9
+ end
10
+
11
+ def spec_file(context)
12
+ return <<-END
13
+ require 'rfuzz/session'
14
+
15
+ context "#{context}" do
16
+ setup do
17
+ end
18
+
19
+ specify "#{context} spec" do
20
+ end
21
+ end
22
+ END
23
+ end
24
+
@@ -0,0 +1,9 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "static_files" do
4
+ setup do
5
+ end
6
+
7
+ specify "static_files spec" do
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "upload_file" do
4
+ setup do
5
+ end
6
+
7
+ specify "upload_file spec" do
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "upload_progress" do
4
+ setup do
5
+ end
6
+
7
+ specify "upload_progress spec" do
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "Base HTTP Protocol" do
4
+ setup do
5
+ @sess = RFuzz::Session.new :host => "localhost", :port => 3000
6
+ end
7
+
8
+ specify "Blocks Long URIs" do
9
+ @sess.run(10) do |c,r|
10
+ len = r.num(90) + 1
11
+ uris = r.uris(50,len)
12
+
13
+ uris.each do |u|
14
+ # next sample for illegal uris
15
+ @sess.count_errors(:illegal) do
16
+ resp = c.get(u * 512)
17
+ @sess.count resp.http_status
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,9 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "upload_file" do
4
+ setup do
5
+ end
6
+
7
+ specify "upload_file spec" do
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "upload_progress" do
4
+ setup do
5
+ end
6
+
7
+ specify "upload_progress spec" do
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "static_files" do
4
+ setup do
5
+ end
6
+
7
+ specify "static_files spec" do
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "upload_file" do
4
+ setup do
5
+ end
6
+
7
+ specify "upload_file spec" do
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "upload_progress" do
4
+ setup do
5
+ end
6
+
7
+ specify "upload_progress spec" do
8
+ end
9
+ end
@@ -0,0 +1,30 @@
1
+ # Simple script that hits a host port and URI with a bunch of connections
2
+ # and measures the timings.
3
+
4
+ require 'rfuzz/client'
5
+ require 'rfuzz/stats'
6
+ include RFuzz
7
+
8
+
9
+
10
+ if ARGV.length != 4
11
+ STDERR.puts "usage: ruby perftest.rb host port uri count"
12
+ exit 1
13
+ end
14
+
15
+ host, port, uri, count = ARGV[0], ARGV[1], ARGV[2], ARGV[3].to_i
16
+
17
+ codes = {}
18
+ cl = HttpClient.new(host, port, :notifier => StatsTracker.new)
19
+ count.times do
20
+ begin
21
+ resp = cl.get(uri)
22
+ code = resp.http_status.to_i
23
+ codes[code] ||= 0
24
+ codes[code] += 1
25
+ rescue Object
26
+ end
27
+ end
28
+
29
+ puts cl.notifier.to_s
30
+ puts "Status Codes: #{codes.inspect}"
@@ -0,0 +1,14 @@
1
+ #ifndef ext_help_h
2
+ #define ext_help_h
3
+
4
+ #define RAISE_NOT_NULL(T) if(T == NULL) rb_raise(rb_eArgError, "NULL found for " # T " when shouldn't be.");
5
+ #define DATA_GET(from,type,name) Data_Get_Struct(from,type,name); RAISE_NOT_NULL(name);
6
+ #define REQUIRE_TYPE(V, T) if(TYPE(V) != T) rb_raise(rb_eTypeError, "Wrong argument type for " # V " required " # T);
7
+
8
+ #ifdef DEBUG
9
+ #define TRACE() fprintf(stderr, "> %s:%d:%s\n", __FILE__, __LINE__, __FUNCTION__)
10
+ #else
11
+ #define TRACE()
12
+ #endif
13
+
14
+ #endif
@@ -0,0 +1,6 @@
1
+ require 'mkmf'
2
+
3
+ dir_config("fuzzrnd")
4
+ have_library("c", "main")
5
+
6
+ create_makefile("fuzzrnd")
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Copyright (c) 2005 Zed A. Shaw
3
+ * You can redistribute it and/or modify it under the same terms as Ruby.
4
+ */
5
+
6
+ #include "ruby.h"
7
+ #include "ext_help.h"
8
+ #include <assert.h>
9
+ #include <string.h>
10
+ #include <ctype.h>
11
+ #include <inttypes.h>
12
+
13
+ static VALUE mRFuzz;
14
+ static VALUE cFuzzRnd;
15
+ static VALUE eFuzzRndError;
16
+
17
+
18
+ /**
19
+ * We use one source of ArcFour data for now. This means that things aren't
20
+ * thread safe yet, but since the ArcFour is just for the current weaker implementation
21
+ * I'm not investing any more time making it thread safe.
22
+ */
23
+ static struct
24
+ {
25
+ unsigned char i,j; /* ArcFour variables */
26
+ unsigned char sbox[256]; /* ArcFour s-box */
27
+ } ArcFour;
28
+
29
+
30
+ /**
31
+ * call-seq:
32
+ * rnd.seed -> rnd
33
+ *
34
+ * Returns a String of random bytes of length that you can use
35
+ * for generating randomness. It uses the ArcFour cipher to
36
+ * make the randomness, so the same seeds produce the same
37
+ * random bits, and the randomness is reasonably high quality.
38
+ *
39
+ * Don't use this for secure random generation. It probably would
40
+ * work if you seeded from a /dev/random that worked, but don't
41
+ * blame me if you get hacked.
42
+ *
43
+ * The main motiviation for using ArcFour without automated reseed
44
+ * is to produce lots of random bytes quickly, make them high enough
45
+ * quality for good random tests, and to make sure that we can replay
46
+ * possible sequences if there's a sequence that we want to test.
47
+ */
48
+ VALUE FuzzRnd_data(VALUE self, VALUE length)
49
+ {
50
+
51
+ uint32_t n;
52
+ unsigned char a,b;
53
+ size_t len = 0;
54
+ VALUE data;
55
+ char *p = NULL;
56
+
57
+ REQUIRE_TYPE(length, T_FIXNUM);
58
+
59
+ len = FIX2INT(length);
60
+ data = rb_str_buf_new(len);
61
+ p = RSTRING(data)->ptr;
62
+ rb_str_resize(data, len);
63
+
64
+ for (n=0;n<len;n++) /* run the ArcFour algorithm as long as it needs */
65
+ {
66
+ ArcFour.i++;
67
+ a = ArcFour.sbox[ArcFour.i];
68
+ ArcFour.j = (unsigned char) (ArcFour.j + a); /* avoid MSVC picky compiler warning */
69
+ b = ArcFour.sbox[ArcFour.j];
70
+ ArcFour.sbox[ArcFour.i] = b;
71
+ ArcFour.sbox[ArcFour.j] = a;
72
+ p[n] = ArcFour.sbox[(a+b) & 0xFF];
73
+ }
74
+
75
+ return data;
76
+ }
77
+
78
+
79
+ /**
80
+ * call-seq:
81
+ * rnd.seed -> rnd
82
+ *
83
+ * Seeds the global ArcFour random generator with the given seed. The same seeds
84
+ * should produce the exact same stream of random data so that you can get
85
+ * large amounts of randomness but replay possible interactions using just
86
+ * an initial key.
87
+ *
88
+ * This function also doubles as the FuzzRnd.initialize method since they
89
+ * do nearly the same thing.
90
+ *
91
+ * Taken from http://www.mozilla.org/projects/security/pki/nss/draft-kaukonen-cipher-arcfour-03.txt
92
+ * sample code, but compared with the output of the ArcFour implementation in
93
+ * the Phelix test code to make sure it is the same initialization. The main
94
+ * difference is that this init takes an arbitrary keysize while the original
95
+ * Phelix ArcFour only took a 32bit key.
96
+ *
97
+ * Returns itself so you can seed and then get data easily.
98
+ */
99
+ VALUE FuzzRnd_seed(VALUE self, VALUE data) {
100
+
101
+ unsigned int t, u;
102
+ unsigned int keyindex;
103
+ unsigned int stateindex;
104
+ unsigned char *state;
105
+ unsigned int counter;
106
+ char *key = NULL;
107
+ size_t key_len = 0;
108
+
109
+ REQUIRE_TYPE(data, T_STRING);
110
+
111
+ key = RSTRING(data)->ptr;
112
+ key_len = RSTRING(data)->len;
113
+
114
+ state = ArcFour.sbox;
115
+ ArcFour.i = 0;
116
+ ArcFour.j = 0;
117
+
118
+ for (counter = 0; counter < 256; counter++)
119
+ state[counter] = counter;
120
+
121
+ keyindex = 0;
122
+ stateindex = 0;
123
+ for (counter = 0; counter < 256; counter++)
124
+ {
125
+ t = state[counter];
126
+ stateindex = (stateindex + key[keyindex] + t) & 0xff;
127
+ u = state[stateindex];
128
+ state[stateindex] = t;
129
+ state[counter] = u;
130
+ if (++keyindex >= key_len)
131
+ keyindex = 0;
132
+ }
133
+
134
+ return self;
135
+ }
136
+
137
+ void Init_fuzzrnd()
138
+ {
139
+ mRFuzz = rb_define_module("RFuzz");
140
+
141
+ eFuzzRndError = rb_define_class_under(mRFuzz, "FuzzRndError", rb_eIOError);
142
+
143
+ cFuzzRnd = rb_define_class_under(mRFuzz, "FuzzRnd", rb_cObject);
144
+ rb_define_method(cFuzzRnd, "initialize", FuzzRnd_seed, 1);
145
+ rb_define_method(cFuzzRnd, "seed", FuzzRnd_seed,1);
146
+ rb_define_method(cFuzzRnd, "data", FuzzRnd_data,1);
147
+ }
148
+
149
+
@@ -0,0 +1,14 @@
1
+ #ifndef ext_help_h
2
+ #define ext_help_h
3
+
4
+ #define RAISE_NOT_NULL(T) if(T == NULL) rb_raise(rb_eArgError, "NULL found for " # T " when shouldn't be.");
5
+ #define DATA_GET(from,type,name) Data_Get_Struct(from,type,name); RAISE_NOT_NULL(name);
6
+ #define REQUIRE_TYPE(V, T) if(TYPE(V) != T) rb_raise(rb_eTypeError, "Wrong argument type for " # V " required " # T);
7
+
8
+ #ifdef DEBUG
9
+ #define TRACE() fprintf(stderr, "> %s:%d:%s\n", __FILE__, __LINE__, __FUNCTION__)
10
+ #else
11
+ #define TRACE()
12
+ #endif
13
+
14
+ #endif