packetgen 1.4.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -44,6 +44,12 @@ module PacketGen
44
44
  # == Save packets to a file
45
45
  # Packet.write 'file.pcapng', packets
46
46
  #
47
+ # @since 2.0.0
48
+ #
49
+ # Packet accessor has changed. When header class is in a namespace
50
+ # (for example Dot11::* header classes), to avoid clashes in names, such
51
+ # accessors are named +namespace_class+. For example {Header::Dot11::Data}
52
+ # header is now accessed through +Packet#dot11_data+ and nor more +Packet#data+).
47
53
  # @author Sylvain Daubert
48
54
  class Packet
49
55
  # @return [Array<Header::Base]
@@ -216,10 +222,15 @@ module PacketGen
216
222
 
217
223
  # Encapulate another packet in +self+
218
224
  # @param [Packet] other
225
+ # @param [Boolean] parsing set to +true+ to not update last current header field
226
+ # from binding with first other's one. Use only when current heade field as
227
+ # its value set accordingly.
219
228
  # @return [self] +self+ with new headers from +other+
220
229
  # @since 1.1.0
221
- def encapsulate(other)
222
- other.headers.each { |h| add_header h }
230
+ def encapsulate(other, parsing: false)
231
+ other.headers.each_with_index do |h, i|
232
+ add_header h, parsing: (i > 0) || parsing
233
+ end
223
234
  end
224
235
 
225
236
  # Remove headers from +self+
@@ -327,19 +338,19 @@ module PacketGen
327
338
  # Add a header to packet
328
339
  # @param [Header::Base] header
329
340
  # @param [Header::Base] previous_header
341
+ # @param [Boolean] parsing
330
342
  # @return [void]
331
343
  def add_header(header, previous_header: nil, parsing: false)
332
- protocol = header.protocol_name
333
344
  prev_header = previous_header || @headers.last
334
345
  if prev_header
335
346
  bindings = prev_header.class.known_headers[header.class]
336
347
  if bindings.nil?
337
348
  bindings = prev_header.class.known_headers[header.class.superclass]
338
349
  if bindings.nil?
339
- msg = "#{prev_header.class} knowns no layer association with #{protocol}. "
340
- msg << "Try #{prev_header.class}.bind_layer(PacketGen::Header::#{protocol}, "
341
- msg << "#{prev_header.protocol_name.downcase}_proto_field: "
342
- msg << "value_for_#{protocol.downcase})"
350
+ msg = "#{prev_header.class} knowns no layer association with #{header.protocol_name}. "
351
+ msg << "Try #{prev_header.class}.bind_layer(#{header.class}, "
352
+ msg << "#{prev_header.method_name}_proto_field: "
353
+ msg << "value_for_#{header.method_name})"
343
354
  raise ArgumentError, msg
344
355
  end
345
356
  end
@@ -348,8 +359,8 @@ module PacketGen
348
359
  end
349
360
  header.packet = self
350
361
  @headers << header unless previous_header
351
- unless respond_to? protocol.downcase
352
- self.class.class_eval "def #{protocol.downcase}(arg=nil);" \
362
+ unless respond_to? header.method_name
363
+ self.class.class_eval "def #{header.method_name}(arg=nil);" \
353
364
  "header(#{header.class}, arg); end"
354
365
  end
355
366
  end
@@ -375,11 +386,14 @@ module PacketGen
375
386
  decode_packet_bottom_up = true
376
387
  while decode_packet_bottom_up do
377
388
  last_known_hdr = @headers.last
389
+ break unless last_known_hdr.respond_to? :body
390
+ break if last_known_hdr.body.empty?
378
391
  search_header(last_known_hdr) do |nh|
379
392
  str = last_known_hdr.body
380
393
  nheader = nh.new
381
394
  nheader = nheader.read(str)
382
395
  add_header nheader, parsing: true
396
+ nheader.dissect if nheader.respond_to? :dissect
383
397
  end
384
398
  decode_packet_bottom_up = (@headers.last != last_known_hdr)
385
399
  end
@@ -187,13 +187,21 @@ module PacketGen
187
187
  end
188
188
  end
189
189
 
190
+ # Delete a previously defined field
191
+ # @param [Symbol] name
192
+ # @return [void]
193
+ def self.delete_field(name)
194
+ @ordered_fields.delete name
195
+ @field_defs.delete name
196
+ end
197
+
190
198
  # Define a bitfield on given attribute
191
199
  # class MyHeader < PacketGen::Types::Fields
192
200
  # define_field :flags, Types::Int16
193
201
  # # define a bit field on :flag attribute:
194
202
  # # flag1, flag2 and flag3 are 1-bit fields
195
203
  # # type and stype are 3-bit fields. reserved is a 6-bit field
196
- # define_bit_fields_on :flags, :flag1, :flag2, :flag3, :type, 3, :stype, 3, :reserved: 7
204
+ # define_bit_fields_on :flags, :flag1, :flag2, :flag3, :type, 3, :stype, 3, :reserved, 7
197
205
  # end
198
206
  # A bitfield of size 1 bit defines 2 methods:
199
207
  # * +#field?+ which returns a Boolean,
@@ -340,9 +348,9 @@ module PacketGen
340
348
  # @return [String]
341
349
  def inspect
342
350
  str = Inspect.dashed_line(self.class, 2)
343
- @fields.each do |attr, value|
351
+ fields.each do |attr|
344
352
  next if attr == :body
345
- str << Inspect.inspect_attribute(attr, value, 2)
353
+ str << Inspect.inspect_attribute(attr, self[attr], 2)
346
354
  end
347
355
  str
348
356
  end
@@ -8,5 +8,5 @@
8
8
  # @author Sylvain Daubert
9
9
  module PacketGen
10
10
  # PacketGen version
11
- VERSION = "1.4.3"
11
+ VERSION = "2.0.0"
12
12
  end
data/packetgen.gemspec CHANGED
@@ -25,6 +25,8 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency 'pcaprub', '~>0.12.4'
26
26
  spec.add_dependency 'pry', '~>0.10'
27
27
  spec.add_dependency 'network_interface'
28
+ spec.add_dependency 'net-proto', '~>1.2'
29
+ spec.add_dependency 'rasn1', '~>0.3', '>= 0.3.1'
28
30
 
29
31
  spec.add_development_dependency 'bundler', '~> 1.7'
30
32
  spec.add_development_dependency 'rake', '~> 10.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packetgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Daubert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-04 00:00:00.000000000 Z
11
+ date: 2017-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pcaprub
@@ -52,6 +52,40 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: net-proto
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rasn1
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.3'
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 0.3.1
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '0.3'
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 0.3.1
55
89
  - !ruby/object:Gem::Dependency
56
90
  name: bundler
57
91
  requirement: !ruby/object:Gem::Requirement
@@ -142,7 +176,9 @@ files:
142
176
  - lib/packetgen/config.rb
143
177
  - lib/packetgen/header.rb
144
178
  - lib/packetgen/header/arp.rb
179
+ - lib/packetgen/header/asn1_base.rb
145
180
  - lib/packetgen/header/base.rb
181
+ - lib/packetgen/header/crypto.rb
146
182
  - lib/packetgen/header/dns.rb
147
183
  - lib/packetgen/header/dns/name.rb
148
184
  - lib/packetgen/header/dns/opt.rb
@@ -163,9 +199,23 @@ files:
163
199
  - lib/packetgen/header/eth.rb
164
200
  - lib/packetgen/header/icmp.rb
165
201
  - lib/packetgen/header/icmpv6.rb
202
+ - lib/packetgen/header/ike.rb
203
+ - lib/packetgen/header/ike/auth.rb
204
+ - lib/packetgen/header/ike/cert.rb
205
+ - lib/packetgen/header/ike/certreq.rb
206
+ - lib/packetgen/header/ike/id.rb
207
+ - lib/packetgen/header/ike/ke.rb
208
+ - lib/packetgen/header/ike/nonce.rb
209
+ - lib/packetgen/header/ike/notify.rb
210
+ - lib/packetgen/header/ike/payload.rb
211
+ - lib/packetgen/header/ike/sa.rb
212
+ - lib/packetgen/header/ike/sk.rb
213
+ - lib/packetgen/header/ike/ts.rb
214
+ - lib/packetgen/header/ike/vendor_id.rb
166
215
  - lib/packetgen/header/ip.rb
167
216
  - lib/packetgen/header/ipv6.rb
168
217
  - lib/packetgen/header/llc.rb
218
+ - lib/packetgen/header/snmp.rb
169
219
  - lib/packetgen/header/tcp.rb
170
220
  - lib/packetgen/header/tcp/option.rb
171
221
  - lib/packetgen/header/tcp/options.rb