packetfu 1.1.13 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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