ronin-support 0.4.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +28 -0
  4. data/.ruby-version +1 -0
  5. data/.yardopts +1 -1
  6. data/ChangeLog.md +121 -33
  7. data/Gemfile +17 -18
  8. data/README.md +57 -33
  9. data/Rakefile +10 -3
  10. data/gemspec.yml +16 -7
  11. data/lib/ronin/binary.rb +21 -0
  12. data/lib/ronin/binary/hexdump.rb +20 -0
  13. data/lib/ronin/binary/hexdump/parser.rb +403 -0
  14. data/lib/ronin/binary/struct.rb +567 -0
  15. data/lib/ronin/binary/template.rb +454 -0
  16. data/lib/ronin/extensions.rb +5 -5
  17. data/lib/ronin/extensions/enumerable.rb +5 -5
  18. data/lib/ronin/extensions/file.rb +39 -33
  19. data/lib/ronin/extensions/ip_addr.rb +29 -31
  20. data/lib/ronin/extensions/kernel.rb +5 -5
  21. data/lib/ronin/extensions/meta.rb +5 -5
  22. data/lib/ronin/extensions/regexp.rb +50 -5
  23. data/lib/ronin/extensions/resolv.rb +7 -9
  24. data/lib/ronin/extensions/string.rb +10 -10
  25. data/lib/ronin/formatting.rb +5 -5
  26. data/lib/ronin/formatting/binary.rb +5 -5
  27. data/lib/ronin/formatting/digest.rb +5 -5
  28. data/lib/ronin/formatting/extensions.rb +5 -5
  29. data/lib/ronin/formatting/extensions/binary.rb +7 -5
  30. data/lib/ronin/formatting/extensions/binary/array.rb +61 -0
  31. data/lib/ronin/formatting/extensions/binary/base64.rb +106 -0
  32. data/lib/ronin/formatting/extensions/binary/file.rb +44 -11
  33. data/lib/ronin/formatting/extensions/binary/float.rb +65 -0
  34. data/lib/ronin/formatting/extensions/binary/integer.rb +66 -50
  35. data/lib/ronin/formatting/extensions/binary/string.rb +81 -205
  36. data/lib/ronin/formatting/extensions/digest.rb +5 -5
  37. data/lib/ronin/formatting/extensions/digest/file.rb +5 -5
  38. data/lib/ronin/formatting/extensions/digest/string.rb +5 -5
  39. data/lib/ronin/formatting/extensions/html.rb +5 -5
  40. data/lib/ronin/formatting/extensions/html/integer.rb +9 -13
  41. data/lib/ronin/formatting/extensions/html/string.rb +31 -39
  42. data/lib/ronin/formatting/extensions/http.rb +5 -5
  43. data/lib/ronin/formatting/extensions/http/integer.rb +6 -6
  44. data/lib/ronin/formatting/extensions/http/string.rb +7 -7
  45. data/lib/ronin/formatting/extensions/sql.rb +5 -5
  46. data/lib/ronin/formatting/extensions/sql/string.rb +22 -24
  47. data/lib/ronin/formatting/extensions/text.rb +5 -5
  48. data/lib/ronin/formatting/extensions/text/array.rb +13 -11
  49. data/lib/ronin/formatting/extensions/text/string.rb +70 -13
  50. data/lib/ronin/formatting/html.rb +5 -5
  51. data/lib/ronin/formatting/http.rb +5 -5
  52. data/lib/ronin/formatting/sql.rb +5 -5
  53. data/lib/ronin/formatting/text.rb +5 -5
  54. data/lib/ronin/fuzzing.rb +5 -5
  55. data/lib/ronin/fuzzing/extensions.rb +5 -5
  56. data/lib/ronin/fuzzing/extensions/string.rb +42 -213
  57. data/lib/ronin/fuzzing/fuzzer.rb +110 -0
  58. data/lib/ronin/fuzzing/fuzzing.rb +33 -26
  59. data/lib/ronin/fuzzing/mutator.rb +161 -0
  60. data/lib/ronin/fuzzing/repeater.rb +81 -0
  61. data/lib/ronin/fuzzing/template.rb +133 -0
  62. data/lib/ronin/mixin.rb +2 -2
  63. data/lib/ronin/network.rb +7 -5
  64. data/lib/ronin/network/dns.rb +64 -24
  65. data/lib/ronin/network/esmtp.rb +5 -5
  66. data/lib/ronin/network/extensions.rb +5 -5
  67. data/lib/ronin/network/extensions/dns.rb +5 -5
  68. data/lib/ronin/network/extensions/dns/net.rb +5 -5
  69. data/lib/ronin/network/extensions/esmtp.rb +5 -5
  70. data/lib/ronin/network/extensions/esmtp/net.rb +5 -5
  71. data/lib/ronin/network/extensions/http.rb +5 -5
  72. data/lib/ronin/network/extensions/http/net.rb +5 -5
  73. data/lib/ronin/network/extensions/http/uri/http.rb +5 -5
  74. data/lib/ronin/network/extensions/imap.rb +5 -5
  75. data/lib/ronin/network/extensions/imap/net.rb +5 -5
  76. data/lib/ronin/network/extensions/pop3.rb +5 -5
  77. data/lib/ronin/network/extensions/pop3/net.rb +5 -5
  78. data/lib/ronin/network/extensions/smtp.rb +5 -5
  79. data/lib/ronin/network/extensions/smtp/net.rb +5 -5
  80. data/lib/ronin/network/extensions/ssl.rb +5 -5
  81. data/lib/ronin/network/extensions/ssl/net.rb +5 -5
  82. data/lib/ronin/network/extensions/tcp.rb +5 -5
  83. data/lib/ronin/network/extensions/tcp/net.rb +5 -5
  84. data/lib/ronin/network/extensions/telnet.rb +5 -5
  85. data/lib/ronin/network/extensions/telnet/net.rb +5 -5
  86. data/lib/ronin/network/extensions/udp.rb +5 -5
  87. data/lib/ronin/network/extensions/udp/net.rb +5 -5
  88. data/lib/ronin/network/ftp.rb +149 -0
  89. data/lib/ronin/network/http.rb +5 -5
  90. data/lib/ronin/network/http/exceptions.rb +5 -5
  91. data/lib/ronin/network/http/exceptions/unknown_request.rb +5 -5
  92. data/lib/ronin/network/http/http.rb +65 -70
  93. data/lib/ronin/network/http/proxy.rb +5 -5
  94. data/lib/ronin/network/imap.rb +16 -15
  95. data/lib/ronin/network/mixins.rb +6 -5
  96. data/lib/ronin/network/mixins/dns.rb +5 -5
  97. data/lib/ronin/network/mixins/esmtp.rb +5 -5
  98. data/lib/ronin/network/mixins/ftp.rb +155 -0
  99. data/lib/ronin/network/mixins/http.rb +58 -587
  100. data/lib/ronin/network/mixins/imap.rb +5 -5
  101. data/lib/ronin/network/mixins/mixin.rb +5 -5
  102. data/lib/ronin/network/mixins/pop3.rb +5 -5
  103. data/lib/ronin/network/mixins/smtp.rb +5 -5
  104. data/lib/ronin/network/mixins/ssl.rb +5 -5
  105. data/lib/ronin/network/mixins/tcp.rb +43 -10
  106. data/lib/ronin/network/mixins/telnet.rb +5 -5
  107. data/lib/ronin/network/mixins/udp.rb +126 -6
  108. data/lib/ronin/network/mixins/unix.rb +279 -0
  109. data/lib/ronin/network/network.rb +5 -5
  110. data/lib/ronin/network/pop3.rb +10 -10
  111. data/lib/ronin/network/proxy.rb +578 -0
  112. data/lib/ronin/network/smtp.rb +5 -5
  113. data/lib/ronin/network/smtp/email.rb +6 -6
  114. data/lib/ronin/network/smtp/smtp.rb +12 -13
  115. data/lib/ronin/network/ssl.rb +16 -17
  116. data/lib/ronin/network/tcp.rb +7 -310
  117. data/lib/ronin/network/tcp/proxy.rb +417 -0
  118. data/lib/ronin/network/tcp/tcp.rb +452 -0
  119. data/lib/ronin/network/telnet.rb +34 -28
  120. data/lib/ronin/network/udp.rb +7 -271
  121. data/lib/ronin/network/udp/proxy.rb +191 -0
  122. data/lib/ronin/network/udp/udp.rb +452 -0
  123. data/lib/ronin/network/unix.rb +286 -0
  124. data/lib/ronin/path.rb +35 -39
  125. data/lib/ronin/spec/ui/output.rb +6 -12
  126. data/lib/ronin/support.rb +6 -5
  127. data/lib/ronin/support/inflector.rb +8 -12
  128. data/lib/ronin/support/support.rb +7 -5
  129. data/lib/ronin/support/version.rb +6 -6
  130. data/lib/ronin/templates.rb +5 -5
  131. data/lib/ronin/templates/erb.rb +5 -5
  132. data/lib/ronin/templates/template.rb +5 -5
  133. data/lib/ronin/ui/output.rb +5 -5
  134. data/lib/ronin/ui/output/helpers.rb +42 -28
  135. data/lib/ronin/ui/output/output.rb +17 -21
  136. data/lib/ronin/ui/output/terminal.rb +5 -5
  137. data/lib/ronin/ui/output/terminal/color.rb +15 -9
  138. data/lib/ronin/ui/output/terminal/raw.rb +5 -5
  139. data/lib/ronin/ui/shell.rb +8 -11
  140. data/lib/ronin/wordlist.rb +110 -30
  141. data/ronin-support.gemspec +39 -109
  142. data/spec/binary/hexdump/helpers/hexdumps.rb +13 -0
  143. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/ascii.bin +0 -0
  144. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -0
  145. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_hex_bytes.txt +0 -0
  146. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_hex_shorts.txt +0 -0
  147. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_octal_bytes.txt +0 -0
  148. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_octal_shorts.txt +0 -0
  149. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_repeated.txt +0 -0
  150. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_bytes.txt +0 -0
  151. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_ints.txt +0 -0
  152. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_quads.txt +0 -0
  153. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_shorts.txt +0 -0
  154. data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +17 -0
  155. data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +17 -0
  156. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_bytes.txt +0 -0
  157. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_ints.txt +0 -0
  158. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_quads.txt +0 -0
  159. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_shorts.txt +0 -0
  160. data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +17 -0
  161. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_bytes.txt +0 -0
  162. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_ints.txt +0 -0
  163. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_quads.txt +0 -0
  164. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_shorts.txt +0 -0
  165. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_repeated.txt +0 -0
  166. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/repeated.bin +0 -0
  167. data/spec/binary/hexdump/parser_spec.rb +302 -0
  168. data/spec/binary/struct_spec.rb +496 -0
  169. data/spec/binary/template_spec.rb +416 -0
  170. data/spec/extensions/enumerable_spec.rb +4 -4
  171. data/spec/extensions/file_spec.rb +12 -14
  172. data/spec/extensions/ip_addr_spec.rb +76 -50
  173. data/spec/extensions/kernel_spec.rb +7 -7
  174. data/spec/extensions/regexp_spec.rb +119 -59
  175. data/spec/extensions/resolv_spec.rb +2 -2
  176. data/spec/extensions/string_spec.rb +31 -30
  177. data/spec/formatting/binary/array_spec.rb +26 -0
  178. data/spec/formatting/binary/base64_spec.rb +50 -0
  179. data/spec/formatting/binary/float_spec.rb +36 -0
  180. data/spec/formatting/binary/integer_spec.rb +76 -50
  181. data/spec/formatting/binary/string_spec.rb +91 -198
  182. data/spec/formatting/digest/string_spec.rb +5 -5
  183. data/spec/formatting/html/integer_spec.rb +6 -6
  184. data/spec/formatting/html/string_spec.rb +10 -10
  185. data/spec/formatting/http/integer_spec.rb +3 -3
  186. data/spec/formatting/http/string_spec.rb +5 -5
  187. data/spec/formatting/sql/string_spec.rb +21 -19
  188. data/spec/formatting/text/array_spec.rb +15 -15
  189. data/spec/formatting/text/string_spec.rb +58 -28
  190. data/spec/fuzzing/extensions/string_spec.rb +87 -0
  191. data/spec/fuzzing/fuzzer_spec.rb +109 -0
  192. data/spec/fuzzing/fuzzing_spec.rb +24 -0
  193. data/spec/fuzzing/mutator_spec.rb +112 -0
  194. data/spec/fuzzing/repeater_spec.rb +57 -0
  195. data/spec/fuzzing/template_spec.rb +54 -0
  196. data/spec/mixin_spec.rb +10 -12
  197. data/spec/network/dns_spec.rb +89 -23
  198. data/spec/network/ftp_spec.rb +81 -0
  199. data/spec/network/http/http_spec.rb +237 -144
  200. data/spec/network/http/proxy_spec.rb +37 -37
  201. data/spec/network/network_spec.rb +2 -2
  202. data/spec/network/proxy_spec.rb +121 -0
  203. data/spec/network/shared/unix_server.rb +31 -0
  204. data/spec/network/smtp/email_spec.rb +14 -14
  205. data/spec/network/ssl_spec.rb +53 -3
  206. data/spec/network/tcp/proxy_spec.rb +118 -0
  207. data/spec/network/tcp/tcp_spec.rb +316 -0
  208. data/spec/network/telnet_spec.rb +67 -0
  209. data/spec/network/udp/udp_spec.rb +298 -0
  210. data/spec/network/unix_spec.rb +182 -0
  211. data/spec/path_spec.rb +43 -18
  212. data/spec/spec_helper.rb +2 -3
  213. data/spec/support/inflector_spec.rb +4 -4
  214. data/spec/support_spec.rb +1 -1
  215. data/spec/templates/erb_spec.rb +3 -3
  216. data/spec/templates/template_spec.rb +10 -10
  217. data/spec/ui/shell_spec.rb +15 -15
  218. data/spec/wordlist_spec.rb +80 -19
  219. metadata +176 -121
  220. data/.gemtest +0 -0
  221. data/spec/formatting/binary/helpers/hexdumps.rb +0 -16
  222. data/spec/fuzzing/string_spec.rb +0 -158
  223. data/spec/network/tcp_spec.rb +0 -247
  224. data/spec/network/udp_spec.rb +0 -248
@@ -8,11 +8,11 @@ describe Resolv do
8
8
  subject { Resolv }
9
9
 
10
10
  it "should create a new Resolv::DNS object if a nameserver is given" do
11
- subject.resolver(nameserver).should be_kind_of(Resolv::DNS)
11
+ expect(subject.resolver(nameserver)).to be_kind_of(Resolv::DNS)
12
12
  end
13
13
 
14
14
  it "should return the default resolver otherwise" do
15
- subject.resolver.should == Resolv
15
+ expect(subject.resolver).to eq(Resolv)
16
16
  end
17
17
  end
18
18
  end
@@ -7,32 +7,32 @@ describe String do
7
7
 
8
8
  it "should enumerate over each sub-string within the String" do
9
9
  subject.each_substring do |sub_string|
10
- should include(sub_string)
10
+ expect(subject).to include(sub_string)
11
11
  end
12
12
  end
13
13
 
14
14
  it "should allow passing the string index back" do
15
15
  subject.each_substring do |sub_string,index|
16
- subject[index,sub_string.length].should == sub_string
16
+ expect(subject[index,sub_string.length]).to eq(sub_string)
17
17
 
18
- should include(sub_string)
18
+ expect(subject).to include(sub_string)
19
19
  end
20
20
  end
21
21
 
22
22
  it "should enumerate over each sub-string of a minimum length" do
23
23
  subject.each_substring(2) do |sub_string|
24
- sub_string.length.should >= 2
24
+ expect(sub_string.length).to be >= 2
25
25
 
26
- should include(sub_string)
26
+ expect(subject).to include(sub_string)
27
27
  end
28
28
  end
29
29
 
30
30
  it "should return an Enumerator when no block is given" do
31
31
  substrings = subject.each_substring
32
32
 
33
- substrings.all? { |sub_string|
33
+ expect(substrings.all? { |sub_string|
34
34
  subject.include?(sub_string)
35
- }.should == true
35
+ }).to be(true)
36
36
  end
37
37
  end
38
38
 
@@ -43,8 +43,8 @@ describe String do
43
43
  seen = []
44
44
 
45
45
  subject.each_unique_substring do |sub_string|
46
- should include(sub_string)
47
- seen.should_not include(sub_string)
46
+ expect(subject).to include(sub_string)
47
+ expect(seen).to_not include(sub_string)
48
48
 
49
49
  seen << sub_string
50
50
  end
@@ -54,10 +54,10 @@ describe String do
54
54
  seen = []
55
55
 
56
56
  subject.each_unique_substring(2) do |sub_string|
57
- sub_string.length.should >= 2
57
+ expect(sub_string.length).to be >= 2
58
58
 
59
- should include(sub_string)
60
- seen.should_not include(sub_string)
59
+ expect(subject).to include(sub_string)
60
+ expect(seen).to_not include(sub_string)
61
61
 
62
62
  seen << sub_string
63
63
  end
@@ -66,12 +66,13 @@ describe String do
66
66
  it "should return an Enumerator when no block is given" do
67
67
  seen = subject.each_unique_substring
68
68
 
69
- seen.all? { |sub_string|
69
+ expect(seen.all? { |sub_string|
70
70
  subject.include?(sub_string)
71
- }.should == true
71
+ }).to be(true)
72
72
 
73
73
  seen = seen.to_a
74
- seen.uniq.should == seen
74
+
75
+ expect(seen.uniq).to eq(seen)
75
76
  end
76
77
  end
77
78
 
@@ -81,7 +82,7 @@ describe String do
81
82
  two = 'What is puzzling you is the nature of my name'
82
83
  common = 'What is puzzling you is the nature of my '
83
84
 
84
- one.common_prefix(two).should == common
85
+ expect(one.common_prefix(two)).to eq(common)
85
86
  end
86
87
 
87
88
  it "should return the common prefix between two Strings with no uncommon postfix" do
@@ -89,21 +90,21 @@ describe String do
89
90
  two = "12345"
90
91
  common = "1234"
91
92
 
92
- one.common_prefix(two).should == common
93
+ expect(one.common_prefix(two)).to eq(common)
93
94
  end
94
95
 
95
96
  it "should return an empty String if there is no common prefix" do
96
97
  one = 'Tell me people'
97
98
  two = 'Whats my name'
98
99
 
99
- one.common_prefix(two).should == ''
100
+ expect(one.common_prefix(two)).to eq('')
100
101
  end
101
102
 
102
103
  it "should return an empty String if one of the strings is also empty" do
103
104
  one = 'Haha'
104
105
  two = ''
105
106
 
106
- one.common_prefix(two).should == ''
107
+ expect(one.common_prefix(two)).to eq('')
107
108
  end
108
109
  end
109
110
 
@@ -113,21 +114,21 @@ describe String do
113
114
  two = "Can't you guess my name"
114
115
  common = 's my name'
115
116
 
116
- one.common_suffix(two).should == common
117
+ expect(one.common_suffix(two)).to eq(common)
117
118
  end
118
119
 
119
120
  it "should return an empty String if there is no common postfix" do
120
121
  one = 'You got to right up, stand up'
121
122
  two = 'stand up for your rights'
122
123
 
123
- one.common_suffix(two).should == ''
124
+ expect(one.common_suffix(two)).to eq('')
124
125
  end
125
126
 
126
127
  it "should return an empty String if one of the strings is also empty" do
127
128
  one = 'You and I must fight for our rights'
128
129
  two = ''
129
130
 
130
- one.common_suffix(two).should == ''
131
+ expect(one.common_suffix(two)).to eq('')
131
132
  end
132
133
  end
133
134
 
@@ -137,7 +138,7 @@ describe String do
137
138
  two = "Tell me honey whats my name"
138
139
  uncommon = 'bab'
139
140
 
140
- one.uncommon_substring(two).should == uncommon
141
+ expect(one.uncommon_substring(two)).to eq(uncommon)
141
142
  end
142
143
 
143
144
  it "should find the uncommon substring between two Strings with a common prefix" do
@@ -145,7 +146,7 @@ describe String do
145
146
  two = 'You and I must fight to survive'
146
147
  uncommon = 'for our rights'
147
148
 
148
- one.uncommon_substring(two).should == uncommon
149
+ expect(one.uncommon_substring(two)).to eq(uncommon)
149
150
  end
150
151
 
151
152
  it "should find the uncommon substring between two Strings with a common postfix" do
@@ -153,26 +154,26 @@ describe String do
153
154
  two = "Can't you guess my name"
154
155
  uncommon = 'Tell me baby what'
155
156
 
156
- one.uncommon_substring(two).should == uncommon
157
+ expect(one.uncommon_substring(two)).to eq(uncommon)
157
158
  end
158
159
  end
159
160
 
160
- if RUBY_VERSION < '1.9'
161
+ if RUBY_VERSION < '1.9.'
161
162
  describe "#dump" do
162
163
  it "should dump printable strings" do
163
- "hello".dump.should == '"hello"'
164
+ expect("hello".dump).to eq('"hello"')
164
165
  end
165
166
 
166
167
  it "should dump strings containing control characters" do
167
- "hello\n\b\a".dump.should == '"hello\n\b\a"'
168
+ expect("hello\n\b\a".dump).to eq('"hello\n\b\a"')
168
169
  end
169
170
 
170
171
  it "should dump strings containing non-printable characters" do
171
- "hello\x90\x05\xEF".dump.should == '"hello\x90\x05\xEF"'
172
+ expect("hello\x90\x05\xEF".dump).to eq('"hello\x90\x05\xEF"')
172
173
  end
173
174
 
174
175
  it "should dump the string when calling the inspect method" do
175
- "hello\x90\x05\xEF".inspect.should == '"hello\x90\x05\xEF"'
176
+ expect("hello\x90\x05\xEF".inspect).to eq('"hello\x90\x05\xEF"')
176
177
  end
177
178
  end
178
179
  end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'ronin/formatting/extensions/binary/array'
3
+
4
+ describe Array do
5
+ subject { [0x1234, "hello"] }
6
+
7
+ it "should provide Array#pack" do
8
+ should respond_to(:pack)
9
+ end
10
+
11
+ describe "#pack" do
12
+ let(:packed) { "\x34\x12hello\0" }
13
+
14
+ context "when only given a String" do
15
+ it "should pack elements using Array#pack codes" do
16
+ expect(subject.pack('vZ*')).to eq(packed)
17
+ end
18
+ end
19
+
20
+ context "otherwise" do
21
+ it "should pack fields using Binary::Template" do
22
+ expect(subject.pack(:uint16_le, :string)).to eq(packed)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+ require 'ronin/formatting/extensions/binary/base64'
3
+
4
+ describe Base64 do
5
+ subject { described_class }
6
+
7
+ if RUBY_VERSION < '1.9.'
8
+ let(:string) { '>' * 64 }
9
+
10
+ let(:base64) { "Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+\nPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pg==\n" }
11
+ let(:strict_base64) { "Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pg==" }
12
+ let(:urlsafe_base64) { "Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pj4-Pg==" }
13
+
14
+ describe "strict_encode64" do
15
+ it "should strictly encode a String" do
16
+ expect(subject.strict_encode64(string)).to eq(strict_base64)
17
+ end
18
+ end
19
+
20
+ describe "strict_decode64" do
21
+ it "should strict decode an encoded Base64 String" do
22
+ expect(subject.strict_decode64(strict_base64)).to eq(string)
23
+ end
24
+
25
+ it "should raise an ArgumentError for non-strictly encoded Base64" do
26
+ expect {
27
+ subject.strict_decode64(base64)
28
+ }.to raise_error(ArgumentError)
29
+ end
30
+ end
31
+
32
+ describe "urlsafe_encode64" do
33
+ it "should encode URL-safe Base64 Strings" do
34
+ expect(subject.urlsafe_encode64(string)).to eq(urlsafe_base64)
35
+ end
36
+ end
37
+
38
+ describe "urlsafe_decode64" do
39
+ it "should decode URL-safe Base64 String" do
40
+ expect(subject.urlsafe_decode64(urlsafe_base64)).to eq(string)
41
+ end
42
+
43
+ it "should raise an ArgumentError for non-strictly encoded Base64" do
44
+ expect {
45
+ subject.urlsafe_decode64(base64)
46
+ }.to raise_error(ArgumentError)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: US-ASCII
2
+
3
+ require 'spec_helper'
4
+ require 'ronin/formatting/extensions/binary/float'
5
+
6
+ describe Float do
7
+ subject { 0.42 }
8
+
9
+ it "should provide Float#pack" do
10
+ should respond_to(:pack)
11
+ end
12
+
13
+ describe "#pack" do
14
+ let(:packed) { "\xE1z\x14\xAEG\xE1\xDA?" }
15
+
16
+ context "when only given a String" do
17
+ it "should unpack Strings using String#unpack template Strings" do
18
+ expect(subject.pack('E')).to eq(packed)
19
+ end
20
+ end
21
+
22
+ context "when given a Binary::Template Float type" do
23
+ it "should unpack Strings using Binary::Template" do
24
+ expect(subject.pack(:double_le)).to eq(packed)
25
+ end
26
+ end
27
+
28
+ context "when given non-Float Binary::Template types" do
29
+ it "should raise an ArgumentError" do
30
+ expect {
31
+ subject.pack(:int)
32
+ }.to raise_error(ArgumentError)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,5 +1,5 @@
1
1
  require 'spec_helper'
2
- require 'ronin/formatting/binary'
2
+ require 'ronin/formatting/extensions/binary/integer'
3
3
 
4
4
  require 'ostruct'
5
5
 
@@ -19,14 +19,14 @@ describe Integer do
19
19
  end
20
20
 
21
21
  it "should alias char to the #chr method" do
22
- subject.char.should == subject.chr
22
+ expect(subject.char).to eq(subject.chr)
23
23
  end
24
24
 
25
25
  describe "#hex_escape" do
26
26
  subject { 42 }
27
27
 
28
28
  it "should hex escape an Integer" do
29
- subject.hex_escape.should == "\\x2a"
29
+ expect(subject.hex_escape).to eq("\\x2a")
30
30
  end
31
31
  end
32
32
 
@@ -44,97 +44,123 @@ describe Integer do
44
44
  subject { 0x1337 }
45
45
 
46
46
  it "should return the bytes in little endian ordering by default" do
47
- subject.bytes(4).should == little_endian_long
47
+ expect(subject.bytes(4)).to eq(little_endian_long)
48
48
  end
49
49
 
50
50
  it "should return the bytes for a char in little endian ordering" do
51
- subject.bytes(1, :little).should == little_endian_char
51
+ expect(subject.bytes(1, :little)).to eq(little_endian_char)
52
52
  end
53
53
 
54
54
  it "should return the bytes for a short in little endian ordering" do
55
- subject.bytes(2, :little).should == little_endian_short
55
+ expect(subject.bytes(2, :little)).to eq(little_endian_short)
56
56
  end
57
57
 
58
58
  it "should return the bytes for a long in little endian ordering" do
59
- subject.bytes(4, :little).should == little_endian_long
59
+ expect(subject.bytes(4, :little)).to eq(little_endian_long)
60
60
  end
61
61
 
62
62
  it "should return the bytes for a quad in little endian ordering" do
63
- subject.bytes(8, :little).should == little_endian_quad
63
+ expect(subject.bytes(8, :little)).to eq(little_endian_quad)
64
64
  end
65
65
 
66
66
  it "should return the bytes for a char in big endian ordering" do
67
- subject.bytes(1, :big).should == big_endian_char
67
+ expect(subject.bytes(1, :big)).to eq(big_endian_char)
68
68
  end
69
69
 
70
70
  it "should return the bytes for a short in big endian ordering" do
71
- subject.bytes(2, :big).should == big_endian_short
71
+ expect(subject.bytes(2, :big)).to eq(big_endian_short)
72
72
  end
73
73
 
74
74
  it "should return the bytes for a long in big endian ordering" do
75
- subject.bytes(4, :big).should == big_endian_long
75
+ expect(subject.bytes(4, :big)).to eq(big_endian_long)
76
76
  end
77
77
 
78
78
  it "should return the bytes for a quad in big endian ordering" do
79
- subject.bytes(8, :big).should == big_endian_quad
79
+ expect(subject.bytes(8, :big)).to eq(big_endian_quad)
80
80
  end
81
81
  end
82
82
 
83
83
  describe "#pack" do
84
- let(:i386) do
85
- OpenStruct.new(:endian => :little, :address_length => 4)
84
+ subject { 0x1337 }
85
+
86
+ let(:packed) { "7\023\000\000" }
87
+
88
+ context "when only given a String" do
89
+ it "should pack Integers using Array#pack codes" do
90
+ expect(subject.pack('V')).to eq(packed)
91
+ end
86
92
  end
87
93
 
88
- let(:ppc) do
89
- OpenStruct.new(:endian => :big, :address_length => 4)
94
+ context "when given a Binary::Template Integer type" do
95
+ it "should pack Integers using Binary::Template" do
96
+ expect(subject.pack(:uint32_le)).to eq(packed)
97
+ end
90
98
  end
91
99
 
92
- subject { 0x1337 }
100
+ context "when given non-Integer Binary::Template types" do
101
+ it "should raise an ArgumentError" do
102
+ expect {
103
+ subject.pack(:float)
104
+ }.to raise_error(ArgumentError)
105
+ end
106
+ end
93
107
 
94
- let(:i386_packed_int) { "7\023\000\000" }
95
- let(:i386_packed_short) { "7\023" }
96
- let(:i386_packed_long) { "7\023\000\000" }
97
- let(:i386_packed_quad) { "7\023\000\000\000\000\000\000" }
108
+ context "deprecated" do
109
+ let(:uint16_le) { "7\023" }
110
+ let(:uint32_le) { "7\023\000\000" }
111
+ let(:uint64_le) { "7\023\000\000\000\000\000\000" }
98
112
 
99
- let(:ppc_packed_int) { "\000\000\0237" }
100
- let(:ppc_packed_short) { "\0237" }
101
- let(:ppc_packed_long) { "\000\000\0237" }
102
- let(:ppc_packed_quad) { "\000\000\000\000\000\000\0237" }
113
+ let(:uint16_be) { "\0237" }
114
+ let(:uint32_be) { "\000\000\0237" }
115
+ let(:uint64_be) { "\000\000\000\000\000\000\0237" }
103
116
 
104
- it "should pack itself for a little-endian architecture by default" do
105
- subject.pack(i386).should == i386_packed_int
106
- end
117
+ let(:i386) do
118
+ OpenStruct.new(:endian => :little, :address_length => 4)
119
+ end
107
120
 
108
- it "should pack itself as a short for a little-endian architecture" do
109
- subject.pack(i386,2).should == i386_packed_short
110
- end
121
+ let(:ppc) do
122
+ OpenStruct.new(:endian => :big, :address_length => 4)
123
+ end
111
124
 
112
- it "should pack itself as a long for a little-endian architecture" do
113
- subject.pack(i386,4).should == i386_packed_long
114
- end
125
+ it "should pack itself for a little-endian architecture by default" do
126
+ expect(subject.pack(i386)).to eq(uint32_le)
127
+ end
115
128
 
116
- it "should pack itself as a quad for a little-endian architecture" do
117
- subject.pack(i386,8).should == i386_packed_quad
118
- end
129
+ it "should pack itself as a short for a little-endian architecture" do
130
+ expect(subject.pack(i386,2)).to eq(uint16_le)
131
+ end
119
132
 
120
- it "should pack itself for a big-endian architecture" do
121
- subject.pack(ppc).should == ppc_packed_int
122
- end
133
+ it "should pack itself as a long for a little-endian architecture" do
134
+ expect(subject.pack(i386,4)).to eq(uint32_le)
135
+ end
123
136
 
124
- it "should pack itself as a short for a big-endian architecture" do
125
- subject.pack(ppc,2).should == ppc_packed_short
126
- end
137
+ it "should pack itself as a quad for a little-endian architecture" do
138
+ expect(subject.pack(i386,8)).to eq(uint64_le)
139
+ end
127
140
 
128
- it "should pack itself as a long for a big-endian architecture" do
129
- subject.pack(ppc,4).should == ppc_packed_long
130
- end
141
+ it "should pack itself for a big-endian architecture" do
142
+ expect(subject.pack(ppc)).to eq(uint32_be)
143
+ end
144
+
145
+ it "should pack itself as a short for a big-endian architecture" do
146
+ expect(subject.pack(ppc,2)).to eq(uint16_be)
147
+ end
148
+
149
+ it "should pack itself as a long for a big-endian architecture" do
150
+ expect(subject.pack(ppc,4)).to eq(uint32_be)
151
+ end
131
152
 
132
- it "should pack itself as a quad for a big-endian architecture" do
133
- subject.pack(ppc,8).should == ppc_packed_quad
153
+ it "should pack itself as a quad for a big-endian architecture" do
154
+ expect(subject.pack(ppc,8)).to eq(uint64_be)
155
+ end
134
156
  end
135
157
 
136
- it "should accept Array#pack template strings" do
137
- subject.pack('L').should == i386_packed_long
158
+ context "when given more than 1 or 2 arguments" do
159
+ it "should raise an ArgumentError" do
160
+ expect {
161
+ subject.pack(1,2,3)
162
+ }.to raise_error(ArgumentError)
163
+ end
138
164
  end
139
165
  end
140
166
  end