packetfu 1.1.13 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/ISSUE_TEMPLATE.md +29 -0
  4. data/.github/workflows/verify.yml +72 -0
  5. data/.travis.yml +10 -6
  6. data/LICENSE.txt +1 -1
  7. data/README.md +8 -8
  8. data/certs/todb.pem +25 -0
  9. data/examples/100kpackets.rb +2 -2
  10. data/examples/ackscan.rb +7 -6
  11. data/examples/pcap2pcapng.rb +2 -2
  12. data/examples/readpcap.rb +28 -0
  13. data/lib/packetfu/capture.rb +1 -1
  14. data/lib/packetfu/config.rb +2 -2
  15. data/lib/packetfu/inject.rb +1 -1
  16. data/lib/packetfu/packet.rb +6 -3
  17. data/lib/packetfu/pcap.rb +25 -25
  18. data/lib/packetfu/pcapng/file.rb +1 -1
  19. data/lib/packetfu/protos/arp.rb +1 -8
  20. data/lib/packetfu/protos/eth.rb +0 -7
  21. data/lib/packetfu/protos/hsrp.rb +0 -7
  22. data/lib/packetfu/protos/icmp/header.rb +7 -10
  23. data/lib/packetfu/protos/icmp.rb +0 -7
  24. data/lib/packetfu/protos/icmpv6.rb +4 -17
  25. data/lib/packetfu/protos/ip/header.rb +2 -2
  26. data/lib/packetfu/protos/ip/mixin.rb +9 -0
  27. data/lib/packetfu/protos/ip.rb +0 -8
  28. data/lib/packetfu/protos/ipv6/mixin.rb +12 -0
  29. data/lib/packetfu/protos/ipv6.rb +0 -7
  30. data/lib/packetfu/protos/lldp.rb +1 -8
  31. data/lib/packetfu/protos/tcp.rb +73 -30
  32. data/lib/packetfu/protos/udp/header.rb +4 -5
  33. data/lib/packetfu/protos/udp.rb +6 -18
  34. data/lib/packetfu/structfu.rb +1 -1
  35. data/lib/packetfu/version.rb +1 -1
  36. data/packetfu.gemspec +10 -18
  37. data/spec/arp_spec.rb +1 -1
  38. data/spec/capture_spec.rb +137 -0
  39. data/spec/eth_spec.rb +1 -1
  40. data/spec/icmp_spec.rb +1 -1
  41. data/spec/icmpv6_spec.rb +1 -1
  42. data/spec/inject_spec.rb +95 -0
  43. data/spec/ip_spec.rb +23 -1
  44. data/spec/packetfu_spec.rb +1 -1
  45. data/spec/pcap_spec.rb +3 -3
  46. data/spec/pcapng/file_spec.rb +1 -1
  47. data/spec/spec_helper.rb +4 -2
  48. data/spec/structfu_spec.rb +86 -82
  49. data/spec/tcp_spec.rb +155 -53
  50. data/test/sample-ipv6.pcap +0 -0
  51. data.tar.gz.sig +0 -0
  52. metadata +64 -37
  53. metadata.gz.sig +0 -0
  54. data/test/test_capture.rb +0 -58
  55. data/test/test_inject.rb +0 -31
  56. data/test/test_structfu.rb +0 -114
data/spec/tcp_spec.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'packetfu/protos/eth'
3
3
  require 'packetfu/protos/ip'
4
+ require 'packetfu/protos/ipv6'
4
5
  require 'packetfu/protos/tcp'
5
6
  require 'packetfu/pcap'
6
7
 
@@ -29,75 +30,176 @@ end
29
30
 
30
31
  describe TCPPacket do
31
32
 
32
- subject do
33
- bytes = PcapFile.file_to_array(File.join(File.dirname(__FILE__), "sample2.pcap"))[2]
34
- packet = Packet.parse(bytes)
35
- end
36
-
37
- context "TcpHlen reading and setting" do
38
- context "TcpHlen set via #read" do
39
- tcp_hlen_numeric(8)
33
+ context 'TCPHeader' do
34
+ subject do
35
+ bytes = PcapFile.file_to_array(File.join(File.dirname(__FILE__), "sample2.pcap"))[2]
36
+ packet = Packet.parse(bytes)
40
37
  end
41
- context "TcpHlen set via an Integer for the setter" do
42
- (0..15).each do |i|
43
- context "i is #{i}" do
44
- before { subject.tcp_hlen = i }
45
- tcp_hlen_numeric(i)
38
+
39
+ context "TcpHlen reading and setting" do
40
+ context "TcpHlen set via #read" do
41
+ tcp_hlen_numeric(8)
42
+ end
43
+ context "TcpHlen set via an Integer for the setter" do
44
+ (0..15).each do |i|
45
+ context "i is #{i}" do
46
+ before { subject.tcp_hlen = i }
47
+ tcp_hlen_numeric(i)
48
+ end
46
49
  end
47
50
  end
51
+ context "TcpHlen set via a String for the setter" do
52
+ before { subject.tcp_hlen = "\x60" }
53
+ tcp_hlen_numeric(6)
54
+ end
55
+ context "TcpHlen set via a TcpHlen for the setter" do
56
+ before { subject.tcp_hlen = TcpHlen.new(:hlen => 7) }
57
+ tcp_hlen_numeric(7)
58
+ end
48
59
  end
49
- context "TcpHlen set via a String for the setter" do
50
- before { subject.tcp_hlen = "\x60" }
51
- tcp_hlen_numeric(6)
52
- end
53
- context "TcpHlen set via a TcpHlen for the setter" do
54
- before { subject.tcp_hlen = TcpHlen.new(:hlen => 7) }
55
- tcp_hlen_numeric(7)
56
- end
57
- end
58
60
 
59
- context "TcpReserved reading and setting" do
60
- context "TcpReserved set via #read" do
61
- tcp_reserved_numeric(0)
61
+ context "TcpReserved reading and setting" do
62
+ context "TcpReserved set via #read" do
63
+ tcp_reserved_numeric(0)
64
+ end
65
+ context "TcpReserved set via an Integer for the setter" do
66
+ (0..7).each do |i|
67
+ context "i is #{i}" do
68
+ before { subject.tcp_reserved = i }
69
+ tcp_reserved_numeric(i)
70
+ end
71
+ end
72
+ end
73
+ context "TcpReserved set via a String for the setter" do
74
+ before { subject.tcp_reserved = "\x03" }
75
+ tcp_reserved_numeric(3)
76
+ end
77
+ context "TcpReserved set via a TcpReserved for the setter" do
78
+ before { subject.tcp_reserved = TcpReserved.new(:r1 => 1, :r2 => 0, :r3 => 1) }
79
+ tcp_reserved_numeric(5)
80
+ end
62
81
  end
63
- context "TcpReserved set via an Integer for the setter" do
64
- (0..7).each do |i|
65
- context "i is #{i}" do
66
- before { subject.tcp_reserved = i }
67
- tcp_reserved_numeric(i)
82
+
83
+ context "TcpEcn reading and setting" do
84
+ context "TcpEcn set via #read" do
85
+ tcp_ecn_numeric(0)
86
+ end
87
+ context "TcpEcn set via an Integer for the setter" do
88
+ (0..7).each do |i|
89
+ context "i is #{i}" do
90
+ before { subject.tcp_ecn = i }
91
+ tcp_ecn_numeric(i)
92
+ end
68
93
  end
69
94
  end
95
+ context "TcpEcn set via a String for the setter" do
96
+ before { subject.tcp_ecn = "\x00\xc0" }
97
+ tcp_ecn_numeric(3)
98
+ end
99
+ context "TcpEcn set via a TcpEcn for the setter" do
100
+ before { subject.tcp_ecn = TcpEcn.new(:n => 1, :c => 0, :e => 1) }
101
+ tcp_ecn_numeric(5)
102
+ end
70
103
  end
71
- context "TcpReserved set via a String for the setter" do
72
- before { subject.tcp_reserved = "\x03" }
73
- tcp_reserved_numeric(3)
104
+ end
105
+
106
+ context 'when read from a pcap file' do
107
+ context '(TCP over IPv4)' do
108
+ before(:all) do
109
+ @tcp4_packet = PcapFile.read_packets(File.join(__dir__, '..', 'test',
110
+ 'sample2.pcap'))[5]
111
+ end
112
+
113
+ it 'should be recognize as a TCP packet' do
114
+ expect(@tcp4_packet).to be_a(TCPPacket)
115
+ expect(@tcp4_packet.is_tcp?).to be(true)
116
+ expect(@tcp4_packet.ipv6?).to be(false)
117
+ end
118
+
119
+ it 'should have the right port numbers' do
120
+ expect(@tcp4_packet.tcp_src).to eq(80)
121
+ expect(@tcp4_packet.tcp_dst).to eq(55954)
122
+ end
123
+
124
+ it 'should have the right length' do
125
+ expect(@tcp4_packet.tcp_hlen).to eq(8)
126
+ end
127
+
128
+ it 'should have the right checksum' do
129
+ expect(@tcp4_packet.tcp_sum).to eq(0x243a)
130
+ end
74
131
  end
75
- context "TcpReserved set via a TcpReserved for the setter" do
76
- before { subject.tcp_reserved = TcpReserved.new(:r1 => 1, :r2 => 0, :r3 => 1) }
77
- tcp_reserved_numeric(5)
132
+
133
+ context '(TCP over IPv6)' do
134
+ before(:all) do
135
+ @tcp6_packet = PcapFile.read_packets(File.join(__dir__, '..', 'test',
136
+ 'sample-ipv6.pcap')).last
137
+ end
138
+
139
+ it 'should be recognize as a TCP packet' do
140
+ expect(@tcp6_packet).to be_a(TCPPacket)
141
+ expect(@tcp6_packet.is_tcp?).to be(true)
142
+ expect(@tcp6_packet.ipv6?).to be(true)
143
+ end
144
+
145
+ it 'should have the right port numbers' do
146
+ expect(@tcp6_packet.tcp_src).to eq(39278)
147
+ expect(@tcp6_packet.tcp_dst).to eq(443)
148
+ end
149
+
150
+ it 'should have the right length' do
151
+ expect(@tcp6_packet.tcp_hlen).to eq(8)
152
+ end
153
+
154
+ it 'should have the right checksum' do
155
+ expect(@tcp6_packet.tcp_sum).to eq(0xd8c9)
156
+ end
78
157
  end
79
158
  end
80
159
 
81
- context "TcpEcn reading and setting" do
82
- context "TcpEcn set via #read" do
83
- tcp_ecn_numeric(0)
160
+ context "when initializing TCPPacket from scratch" do
161
+ it "should create TCP on IPv4 packets by default" do
162
+ tcp = TCPPacket.new
163
+ expect(tcp.ip_header).to be_a(IPHeader)
164
+ expect(tcp.ipv6_header).to be_nil
84
165
  end
85
- context "TcpEcn set via an Integer for the setter" do
86
- (0..7).each do |i|
87
- context "i is #{i}" do
88
- before { subject.tcp_ecn = i }
89
- tcp_ecn_numeric(i)
90
- end
91
- end
166
+
167
+ it "should create TCP on IPv6 packets" do
168
+ tcp = TCPPacket.new(:on_ipv6 => true)
169
+ expect(tcp.ip_header).to be_nil
170
+ expect(tcp.ipv6_header).to be_a(IPv6Header)
171
+
172
+ tcp.ipv6_saddr = "::1"
173
+ tcp.ipv6_daddr = "::2"
174
+ tcp.tcp_src = 41000
175
+ tcp.tcp_dst = 42000
176
+ tcp.tcp_seq = 1
177
+ tcp.payload = "\0" * 16
178
+ tcp.recalc
179
+ expect(tcp.tcp_sum).to eq(0x2b98)
180
+ expect(tcp.tcp_hlen).to eq(5)
92
181
  end
93
- context "TcpEcn set via a String for the setter" do
94
- before { subject.tcp_ecn = "\x00\xc0" }
95
- tcp_ecn_numeric(3)
182
+
183
+ it 'should support peek functionnality (IPv4 case)' do
184
+ tcp = TCPPacket.new
185
+ tcp.ip_saddr = '192.168.1.1'
186
+ tcp.ip_daddr = '192.168.1.254'
187
+ tcp.tcp_src = 32756
188
+ tcp.tcp_dst = 80
189
+ tcp.payload = 'abcdefghijklmnopqrstuvwxyz'
190
+ tcp.recalc
191
+ expect(tcp.peek).to match(/T 80\s+192.168.1.1:32756\s+->\s+192.168.1.254:80 \[\.{6,6}\] S:[a-f0-9]+|I:[a-f0-9]+/)
96
192
  end
97
- context "TcpEcn set via a TcpEcn for the setter" do
98
- before { subject.tcp_ecn = TcpEcn.new(:n => 1, :c => 0, :e => 1) }
99
- tcp_ecn_numeric(5)
193
+
194
+ it 'should support peek functionnality (IPv6 case)' do
195
+ tcp = TCPPacket.new(:on_ipv6 => true)
196
+ tcp.ipv6_saddr = '2000::1'
197
+ tcp.ipv6_daddr = '2001::1'
198
+ tcp.tcp_src = 32756
199
+ tcp.tcp_dst = 80
200
+ tcp.payload = 'abcdefghijklmnopqrstuvwxyz'
201
+ tcp.recalc
202
+ expect(tcp.peek).to match(/6T 100\s+2000::1:32756\s+->\s+2001::1:80 \[\.{6,6}\] S:[a-f0-9]+/)
100
203
  end
101
204
  end
102
-
103
205
  end
Binary file
data.tar.gz.sig ADDED
Binary file
metadata CHANGED
@@ -1,30 +1,56 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packetfu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.13
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tod Beardsley
8
8
  - Jonathan Claudius
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
- cert_chain: []
12
- date: 2017-04-20 00:00:00.000000000 Z
11
+ cert_chain:
12
+ - |
13
+ -----BEGIN CERTIFICATE-----
14
+ MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBd0b2Ri
15
+ L0RDPXBhY2tldGZ1L0RDPWNvbTAeFw0yMzA2MjcwMDExMjdaFw0yNDA2MjYwMDEx
16
+ MjdaMCIxIDAeBgNVBAMMF3RvZGIvREM9cGFja2V0ZnUvREM9Y29tMIIBojANBgkq
17
+ hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyz2+nfp+Vv+JVHrJMy5Ck3qWBkiZmE0w
18
+ 7bR1I/bNXrCtv75l1GxTdRAoxKcXpXyC8elJQ9PEjEEDtdGBYQ13BKcQbDJ36etD
19
+ wjbhRs5SBXgIilJAiR3i/cVnNoNJKOpiJZPufkOpag7Sg8Ze+cWbsc0gYN9nyCmz
20
+ LYwWDC6Ji0KgJFw5YxFvIxVeOx86Ccfd64Wsa3EhkZd6fOpDE3029GWDqZwZTBIX
21
+ RzJP4M7QZHZjq3gbHgSKFCFv0MqsjnQzUhPyB/U27c/n+wfRzZNx4Y1eRVm7gwPP
22
+ LJDzt6mvtlXqc6pQ1NsR9hv3sieFLZDDPU1AaWiOAckIKcVoXB8sGnuFMczMW97o
23
+ OZLfqfZUAN6LSY939T2sCyOcGhjxZIQbXtn/R/RAJ7UTfJld9UdthKm1W/f0cjwW
24
+ yqoVsFL+nda6xfta9EnRqqFLOJqyX/wwA2cPO9B8EyM8vFEE8AG8wLu1tF3ggoMg
25
+ rKut/WQADc3ymKAtsr9bOWajj7bIQVJnAgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
26
+ VR0PBAQDAgSwMB0GA1UdDgQWBBR2kf7ATPt3O7Lpc0uyyCiow3P88DAcBgNVHREE
27
+ FTATgRF0b2RiQHBhY2tldGZ1LmNvbTAcBgNVHRIEFTATgRF0b2RiQHBhY2tldGZ1
28
+ LmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAZMp8nY7WzGOPO6TrAlZg37D3s3Rcm0/z
29
+ 6DBzFcY4F5CF3xq1Z/DZ3JwhjILaHPAZTvVT4uj91K4BYh/QgteS52C+O/9qsZ25
30
+ L3Ocu4Yp+aU40KpjW+IjlzgTS3E21pCBrBTgT7NuTHmTmoNmHfE6Gbbig3a68C9z
31
+ LcXj2RaEQuhOKrq5vw/0AV34wRieClM/oW8kWAKJDQ8/WEocHQpO1K/dhQ9hHNir
32
+ lMpjKXsWuxdAZPyvNj15w9fw5a4gZgW26P4VBNJUD/iCe7QYhwXrhdhxf+cygW2A
33
+ gBCt2UC6yISUDFiajyTw8cTJB1UyfLIADS4hiOEShx7hvVee444bgmOA99C+YuzT
34
+ FFUt9KVtWsXKD0R6GBvbAUW4/LjmXCCM+Z3uWo1Ph6zljlNHz6/tg+SB7DVgsI3i
35
+ XuSkzAmFsPisZ7uZk/7gJVlmyaqIxdrPVt9ZOTeSc/8pgSoRurHEJ7KlUXv4kcYM
36
+ F3a8dA5tl/TC0vkHlCtghhLuD46SlAmH
37
+ -----END CERTIFICATE-----
38
+ date: 2023-06-28 00:00:00.000000000 Z
13
39
  dependencies:
14
40
  - !ruby/object:Gem::Dependency
15
41
  name: pcaprub
16
42
  requirement: !ruby/object:Gem::Requirement
17
43
  requirements:
18
- - - ">="
44
+ - - "~>"
19
45
  - !ruby/object:Gem::Version
20
- version: '0'
46
+ version: 0.13.1
21
47
  type: :runtime
22
48
  prerelease: false
23
49
  version_requirements: !ruby/object:Gem::Requirement
24
50
  requirements:
25
- - - ">="
51
+ - - "~>"
26
52
  - !ruby/object:Gem::Version
27
- version: '0'
53
+ version: 0.13.1
28
54
  - !ruby/object:Gem::Dependency
29
55
  name: rake
30
56
  requirement: !ruby/object:Gem::Requirement
@@ -43,46 +69,46 @@ dependencies:
43
69
  name: rspec
44
70
  requirement: !ruby/object:Gem::Requirement
45
71
  requirements:
46
- - - ">="
72
+ - - "~>"
47
73
  - !ruby/object:Gem::Version
48
- version: '0'
74
+ version: '3.0'
49
75
  type: :development
50
76
  prerelease: false
51
77
  version_requirements: !ruby/object:Gem::Requirement
52
78
  requirements:
53
- - - ">="
79
+ - - "~>"
54
80
  - !ruby/object:Gem::Version
55
- version: '0'
81
+ version: '3.0'
56
82
  - !ruby/object:Gem::Dependency
57
83
  name: rspec-its
58
84
  requirement: !ruby/object:Gem::Requirement
59
85
  requirements:
60
- - - ">="
86
+ - - "~>"
61
87
  - !ruby/object:Gem::Version
62
- version: '0'
88
+ version: '1.2'
63
89
  type: :development
64
90
  prerelease: false
65
91
  version_requirements: !ruby/object:Gem::Requirement
66
92
  requirements:
67
- - - ">="
93
+ - - "~>"
68
94
  - !ruby/object:Gem::Version
69
- version: '0'
95
+ version: '1.2'
70
96
  - !ruby/object:Gem::Dependency
71
97
  name: sdoc
72
98
  requirement: !ruby/object:Gem::Requirement
73
99
  requirements:
74
- - - ">="
100
+ - - "~>"
75
101
  - !ruby/object:Gem::Version
76
- version: '0'
102
+ version: '0.4'
77
103
  type: :development
78
104
  prerelease: false
79
105
  version_requirements: !ruby/object:Gem::Requirement
80
106
  requirements:
81
- - - ">="
107
+ - - "~>"
82
108
  - !ruby/object:Gem::Version
83
- version: '0'
109
+ version: '0.4'
84
110
  - !ruby/object:Gem::Dependency
85
- name: pry
111
+ name: pry-byebug
86
112
  requirement: !ruby/object:Gem::Requirement
87
113
  requirements:
88
114
  - - ">="
@@ -99,16 +125,16 @@ dependencies:
99
125
  name: coveralls
100
126
  requirement: !ruby/object:Gem::Requirement
101
127
  requirements:
102
- - - ">="
128
+ - - "~>"
103
129
  - !ruby/object:Gem::Version
104
- version: '0'
130
+ version: '0.8'
105
131
  type: :development
106
132
  prerelease: false
107
133
  version_requirements: !ruby/object:Gem::Requirement
108
134
  requirements:
109
- - - ">="
135
+ - - "~>"
110
136
  - !ruby/object:Gem::Version
111
- version: '0'
137
+ version: '0.8'
112
138
  description: "\n PacketFu is a mid-level packet manipulation library for Ruby.
113
139
  With\n it, users can read, parse, and write network packets with the level of\n
114
140
  \ ease and fun they expect from Ruby.\n "
@@ -122,6 +148,8 @@ extra_rdoc_files:
122
148
  - README.md
123
149
  files:
124
150
  - ".document"
151
+ - ".github/ISSUE_TEMPLATE.md"
152
+ - ".github/workflows/verify.yml"
125
153
  - ".gitignore"
126
154
  - ".mailmap"
127
155
  - ".rspec"
@@ -139,6 +167,7 @@ files:
139
167
  - bench/octets_after.txt
140
168
  - bench/octets_after_refactor.txt
141
169
  - bench/octets_before.txt
170
+ - certs/todb.pem
142
171
  - examples/100kpackets.rb
143
172
  - examples/ackscan.rb
144
173
  - examples/arp.rb
@@ -153,6 +182,7 @@ files:
153
182
  - examples/packetfu-shell.rb
154
183
  - examples/pcap2pcapng.rb
155
184
  - examples/ping.rb
185
+ - examples/readpcap.rb
156
186
  - examples/simple-sniffer.rb
157
187
  - examples/simple-stats.rb
158
188
  - examples/slammer.rb
@@ -217,11 +247,13 @@ files:
217
247
  - lib/packetfu/version.rb
218
248
  - packetfu.gemspec
219
249
  - spec/arp_spec.rb
250
+ - spec/capture_spec.rb
220
251
  - spec/eth_spec.rb
221
252
  - spec/fake_packets.rb
222
253
  - spec/hsrp_spec.rb
223
254
  - spec/icmp_spec.rb
224
255
  - spec/icmpv6_spec.rb
256
+ - spec/inject_spec.rb
225
257
  - spec/invalid_spec.rb
226
258
  - spec/ip_spec.rb
227
259
  - spec/ipv4_icmp.pcap
@@ -357,17 +389,14 @@ files:
357
389
  - test/sample2.pcapng
358
390
  - test/sample_hsrp_pcapr.cap
359
391
  - test/sample_lldp.pcap
360
- - test/test_capture.rb
361
- - test/test_inject.rb
362
392
  - test/test_packet.rb
363
- - test/test_structfu.rb
364
393
  - test/test_tcp.rb
365
394
  - test/vlan-pcapr.cap
366
395
  homepage: https://github.com/packetfu/packetfu
367
396
  licenses:
368
- - BSD
397
+ - BSD-3-Clause
369
398
  metadata: {}
370
- post_install_message:
399
+ post_install_message:
371
400
  rdoc_options: []
372
401
  require_paths:
373
402
  - lib
@@ -375,24 +404,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
375
404
  requirements:
376
405
  - - ">="
377
406
  - !ruby/object:Gem::Version
378
- version: 2.1.0
407
+ version: 2.7.0
379
408
  required_rubygems_version: !ruby/object:Gem::Requirement
380
409
  requirements:
381
410
  - - ">="
382
411
  - !ruby/object:Gem::Version
383
412
  version: '0'
384
413
  requirements: []
385
- rubyforge_project: packetfu
386
- rubygems_version: 2.6.8
387
- signing_key:
414
+ rubygems_version: 3.4.13
415
+ signing_key:
388
416
  specification_version: 4
389
417
  summary: PacketFu is a mid-level packet manipulation library.
390
418
  test_files:
391
419
  - spec/arp_spec.rb
420
+ - spec/capture_spec.rb
392
421
  - spec/eth_spec.rb
393
422
  - spec/hsrp_spec.rb
394
423
  - spec/icmp_spec.rb
395
424
  - spec/icmpv6_spec.rb
425
+ - spec/inject_spec.rb
396
426
  - spec/invalid_spec.rb
397
427
  - spec/ip_spec.rb
398
428
  - spec/ipv6_spec.rb
@@ -412,8 +442,5 @@ test_files:
412
442
  - spec/tcp_spec.rb
413
443
  - spec/udp_spec.rb
414
444
  - spec/utils_spec.rb
415
- - test/test_capture.rb
416
- - test/test_inject.rb
417
445
  - test/test_packet.rb
418
- - test/test_structfu.rb
419
446
  - test/test_tcp.rb
metadata.gz.sig ADDED
Binary file
data/test/test_capture.rb DELETED
@@ -1,58 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'test/unit'
3
- $:.unshift File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib")
4
- require 'packetfu'
5
-
6
-
7
- class CaptureTest < Test::Unit::TestCase
8
-
9
- def test_cap
10
- assert_nothing_raised { PacketFu::Capture }
11
- end
12
-
13
- def test_whoami
14
- assert_nothing_raised { PacketFu::Utils.whoami?(:iface => PacketFu::Utils.default_int) }
15
- end
16
-
17
- def test_new
18
- cap = PacketFu::Capture.new
19
- assert_kind_of PacketFu::Capture, cap
20
- cap = PacketFu::Capture.new(
21
- :filter => 'tcp and dst host 1.2.3.4'
22
- )
23
- end
24
-
25
- def test_filter
26
- daddr = PacketFu::Utils.rand_routable_daddr.to_s
27
- cap = PacketFu::Capture.new( :filter => "icmp and dst host #{daddr}")
28
- cap.start
29
- %x{ping -c 1 #{daddr}}
30
- sleep 1
31
- cap.save
32
- assert cap.array.size == 1
33
- pkt = PacketFu::Packet.parse(cap.array.first)
34
- assert pkt.ip_daddr == daddr
35
- end
36
-
37
- def test_no_filter
38
- daddr = PacketFu::Utils.rand_routable_daddr.to_s
39
- daddr2 = PacketFu::Utils.rand_routable_daddr.to_s
40
- cap = PacketFu::Capture.new
41
- cap.start
42
- %x{ping -c 1 #{daddr}}
43
- %x{ping -c 1 #{daddr2}}
44
- sleep 1
45
- cap.save
46
- assert cap.array.size > 1
47
- end
48
-
49
- def test_bpf_alias
50
- daddr = PacketFu::Utils.rand_routable_daddr.to_s
51
- cap = PacketFu::Capture.new( :filter => "icmp and dst host #{daddr}")
52
- assert cap.filter.object_id == cap.bpf.object_id
53
- end
54
-
55
- end
56
-
57
-
58
- # vim: nowrap sw=2 sts=0 ts=2 ff=unix ft=ruby
data/test/test_inject.rb DELETED
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'test/unit'
3
- $:.unshift File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib")
4
- require 'packetfu'
5
-
6
-
7
- class InjectTest < Test::Unit::TestCase
8
-
9
- def test_cap
10
- assert_nothing_raised { PacketFu::Capture }
11
- end
12
-
13
- def test_whoami
14
- assert_nothing_raised { PacketFu::Utils.whoami?(:iface => PacketFu::Utils.default_int) }
15
- end
16
-
17
- def test_to_w
18
- assert_equal(Process.euid, 0, "TEST FAIL: This test must be run as root")
19
- conf = PacketFu::Utils.whoami?(:iface => PacketFu::Utils.default_int)
20
- p = PacketFu::UDPPacket.new(:config => conf)
21
- p.udp_dport = 12345
22
- p.udp_sport = 12345
23
- p.payload = "PacketFu test packet"
24
- p.recalc
25
- assert p.to_w
26
- end
27
-
28
- end
29
-
30
-
31
- # vim: nowrap sw=2 sts=0 ts=2 ff=unix ft=ruby
@@ -1,114 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: binary -*-
3
-
4
- require 'test/unit'
5
- $:.unshift File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib")
6
- require 'packetfu'
7
-
8
- # Whee unit testing.
9
- class IntStringTest < Test::Unit::TestCase
10
- include StructFu
11
-
12
- def test_intstring_len
13
- s = IntString.new("hello!", Int32)
14
- assert_equal(s.len, s.int.v)
15
- assert_not_equal(s.len, s.length)
16
- s.len=10
17
- assert_equal(s.len, s[:int][:value])
18
- end
19
-
20
- def test_intstring_to_s
21
- s = IntString.new("hello!", Int16)
22
- assert_equal("\x00\x06hello!",s.to_s)
23
- s.len=10
24
- assert_equal("\x00\x0ahello!",s.to_s)
25
- s = IntString.new("hello!", Int16, :parse)
26
- s.len=10
27
- assert_equal("\x00\x0ahello!\x00\x00\x00\x00",s.to_s)
28
- s = IntString.new("hello!", Int16, :fix)
29
- s.len=10
30
- assert_equal("\x00\x06hello!",s.to_s)
31
- end
32
-
33
- def test_intstring_new
34
- assert_equal("\x06Hello!",IntString.new("Hello!").to_s)
35
- assert_equal("\x00\x06Hello!",IntString.new("Hello!",Int16).to_s)
36
- assert_equal("\x06\x00\x00\x00Hello!",IntString.new("Hello!",Int32le).to_s)
37
- end
38
-
39
- def test_intstring_read
40
- s = IntString.new
41
- s.read("\x06Hello!")
42
- assert_equal("Hello!", s.string)
43
- assert_equal("Hello!", s[:string])
44
- assert_equal(6, s.int.value)
45
- assert_equal(6, s.len)
46
- end
47
-
48
- def test_intstring_parse
49
- s = IntString.new
50
- s[:mode] = :parse
51
- s.parse("\x02Hello!")
52
- assert_equal("He", s.string)
53
- assert_equal(2, s.int.v)
54
- s.parse("\x0aHello!")
55
- assert_equal("Hello!\x00\x00\x00\x00", s.string)
56
- s[:mode] = :fix
57
- s.parse("\x0aHello!")
58
- assert_equal("Hello!", s.string)
59
- end
60
-
61
- def test_intstring_nocalc
62
- s = IntString.new
63
- s[:string] = "Hello"
64
- assert_equal(0,s.int.value)
65
- end
66
-
67
- end
68
-
69
- class IntTest < Test::Unit::TestCase
70
- include StructFu
71
-
72
- def test_int_to_s
73
- assert_equal("\x02",Int8.new(2).to_s)
74
- assert_equal("\x00\x07",Int16.new(7).to_s)
75
- assert_equal("\x00\x00\x00\x0a",Int32.new(10).to_s)
76
- end
77
-
78
- def test_int_big
79
- assert_equal("\x00\x07",Int16be.new(7).to_s)
80
- assert_equal("\x00\x00\x00\x0a",Int32be.new(10).to_s)
81
- end
82
-
83
- def test_int_little
84
- assert_equal("\x07\x00",Int16le.new(7).to_s)
85
- assert_equal("\x01\x04\x00\x00",Int32le.new(1025).to_s)
86
- end
87
-
88
- def test_read
89
- assert_equal(7,Int16.new.read("\x00\x07").to_i)
90
- assert_equal(Int32.new.read("\x00\x00\x00\x0a").to_i,10)
91
- i = Int32.new
92
- i.read("\x00\x00\x00\xff")
93
- assert_equal(i.v, 255)
94
- assert_equal(7, Int16le.new.read("\x07\x00").to_i)
95
- assert_equal(1025,Int32le.new.read("\x01\x04\x00\x00").to_i)
96
- i = Int32le.new
97
- i.read("\xff\x00\x00\x00")
98
- assert_equal(i.v, 255)
99
- end
100
-
101
- def test_int_compare
102
- little = Int32le.new
103
- big = Int32be.new
104
- little.v = 128
105
- big.v = 0x80
106
- assert_not_equal(little.to_s, big.to_s)
107
- assert_equal(little.v, big.v)
108
- assert_equal(little[:value], big[:value])
109
- assert_equal(little.value, big.value)
110
- end
111
-
112
- end
113
-
114
- # vim: nowrap sw=2 sts=0 ts=2 ff=unix ft=ruby