packetgen 3.3.0 → 3.3.1
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.
- checksums.yaml +4 -4
- data/lib/packetgen/types/abstract_tlv.rb +109 -57
- data/lib/packetgen/types/int.rb +112 -12
- data/lib/packetgen/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cdbaefa45999efbdef944fd579a9657a4ce4cfbf247bab09a4a7692ac22f9126
|
4
|
+
data.tar.gz: 8bce62a68be0b6803eea0a1323009c0413c20e1b4628062f22bcb240909f93a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20246ef1684a643dc0f18ecb25558e78ae70197f141dfa059bbd5559806c87229436432816a7ca3c1008910f15c010842a08dca0de5e50499fad283566953f01
|
7
|
+
data.tar.gz: c8576c49901a2c49336b638f859d80446c0773701177e3aeb4d24324c264d00f58ec4fbe6a3c5a1dd71247385f0fcb421953e4b1865144119a9d07242c0d6f97
|
@@ -60,63 +60,101 @@ module PacketGen
|
|
60
60
|
class AbstractTLV < Types::Fields
|
61
61
|
include Fieldable
|
62
62
|
|
63
|
+
# @private
|
64
|
+
FIELD_TYPES = { 'T' => :type, 'L' => :length, 'V' => :value }.freeze
|
65
|
+
|
63
66
|
class << self
|
64
67
|
# @return [Hash]
|
65
68
|
attr_accessor :aliases
|
69
|
+
# @deprecated
|
66
70
|
attr_accessor :header_in_length
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
klass.
|
88
|
-
|
89
|
-
klass.
|
71
|
+
# @private
|
72
|
+
attr_accessor :field_in_length
|
73
|
+
|
74
|
+
# Generate a TLV class
|
75
|
+
# @param [Class] type_class Class to use for +type+
|
76
|
+
# @param [Class] length_class Class to use for +length+
|
77
|
+
# @param [Class] value_class Class to use for +value+
|
78
|
+
# @param [Boolean] header_in_length if +true +, +type+ and +length+ fields are
|
79
|
+
# included in length. Deprecated, use +field_in_length+ instead.
|
80
|
+
# @param [String] field_order give field order. Each character in [T,L,V] MUST be present once, in the desired order.
|
81
|
+
# @param [String] field_in_length give fields to compute length on.
|
82
|
+
# @return [Class]
|
83
|
+
# @since 3.1.4 Add +header_in_length+ parameter
|
84
|
+
# @since 3.3.1 Add +field_order+ and +field_in_length' parameters. Deprecate +header_in_length+ parameter.
|
85
|
+
def create(type_class: Int8Enum, length_class: Int8, value_class: String,
|
86
|
+
aliases: {}, header_in_length: false, field_order: 'TLV', field_in_length: 'V')
|
87
|
+
Deprecation.deprecated_option(self, 'create', 'header_in_length', klass_method: true) if header_in_length
|
88
|
+
raise Error, '.create cannot be called on a subclass of PacketGen::Types::AbstractTLV' unless self.equal?(AbstractTLV)
|
89
|
+
|
90
|
+
klass = Class.new(self)
|
91
|
+
klass.aliases = aliases
|
92
|
+
klass.header_in_length = header_in_length
|
93
|
+
klass.field_in_length = field_in_length
|
94
|
+
|
95
|
+
check_field_in_length(field_in_length)
|
96
|
+
check_field_order(field_order)
|
97
|
+
generate_fields(klass, field_order, type_class, length_class, value_class)
|
98
|
+
|
99
|
+
aliases.each do |al, orig|
|
100
|
+
klass.instance_eval do
|
101
|
+
alias_method al, orig if klass.method_defined?(orig)
|
102
|
+
alias_method :"#{al}=", :"#{orig}=" if klass.method_defined?(:"#{orig}=")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
klass
|
90
107
|
end
|
91
|
-
klass.define_field :length, length_class
|
92
|
-
klass.define_field :value, value_class
|
93
108
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
109
|
+
# @!attribute type
|
110
|
+
# @abstract Type attribute for real TLV class
|
111
|
+
# @return [Integer]
|
112
|
+
# @!attribute length
|
113
|
+
# @abstract Length attribute for real TLV class
|
114
|
+
# @return [Integer]
|
115
|
+
# @!attribute value
|
116
|
+
# @abstract Value attribute for real TLV class
|
117
|
+
# @return [Object]
|
118
|
+
|
119
|
+
# @abstract Should only be called on real TLV classes, created by {.create}.
|
120
|
+
# Set enum hash for {#type} field.
|
121
|
+
# @param [Hash] hsh enum hash
|
122
|
+
# @return [void]
|
123
|
+
def define_type_enum(hsh)
|
124
|
+
field_defs[:type][:enum].clear
|
125
|
+
field_defs[:type][:enum].merge!(hsh)
|
99
126
|
end
|
100
127
|
|
101
|
-
|
102
|
-
end
|
103
|
-
# @!attribute type
|
104
|
-
# @abstract Type attribute for real TLV class
|
105
|
-
# @return [Integer]
|
106
|
-
# @!attribute length
|
107
|
-
# @abstract Length attribute for real TLV class
|
108
|
-
# @return [Integer]
|
109
|
-
# @!attribute value
|
110
|
-
# @abstract Value attribute for real TLV class
|
111
|
-
# @return [Object]
|
128
|
+
private
|
112
129
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
130
|
+
def check_field_in_length(field_in_length)
|
131
|
+
return if /^[TLV]{1,3}$/.match?(field_in_length)
|
132
|
+
|
133
|
+
raise 'field_in_length must only contain T, L and/or V characters'
|
134
|
+
end
|
135
|
+
|
136
|
+
def check_field_order(field_order)
|
137
|
+
return if field_order.match(/^[TLV]{3,3}$/) && (field_order[0] != field_order[1]) && (field_order[0] != field_order[2]) && (field_order[1] != field_order[2])
|
138
|
+
|
139
|
+
raise 'field_order must contain all three letters TLV, each once'
|
140
|
+
end
|
141
|
+
|
142
|
+
def generate_fields(klass, field_order, type_class, length_class, value_class)
|
143
|
+
field_order.each_char do |field_type|
|
144
|
+
case field_type
|
145
|
+
when 'T'
|
146
|
+
if type_class < Enum
|
147
|
+
klass.define_field(:type, type_class, enum: {})
|
148
|
+
else
|
149
|
+
klass.define_field(:type, type_class)
|
150
|
+
end
|
151
|
+
when 'L'
|
152
|
+
klass.define_field(:length, length_class)
|
153
|
+
when 'V'
|
154
|
+
klass.define_field(:value, value_class)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
120
158
|
end
|
121
159
|
|
122
160
|
# @abstract Should only be called on real TLV classes, created by {.create}.
|
@@ -126,6 +164,7 @@ module PacketGen
|
|
126
164
|
# @option options [Object] :value
|
127
165
|
def initialize(options={})
|
128
166
|
@header_in_length = self.class.header_in_length
|
167
|
+
@field_in_length = self.class.field_in_length
|
129
168
|
self.class.aliases.each do |al, orig|
|
130
169
|
options[orig] = options[al] if options.key?(al)
|
131
170
|
end
|
@@ -141,11 +180,13 @@ module PacketGen
|
|
141
180
|
# @return [Fields] self
|
142
181
|
def read(str)
|
143
182
|
idx = 0
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
183
|
+
fields.each do |field_name|
|
184
|
+
field = self[field_name]
|
185
|
+
length = field_name == :value ? real_length : field.sz
|
186
|
+
field.read(str[idx, length])
|
187
|
+
idx += field.sz
|
188
|
+
end
|
189
|
+
|
149
190
|
self
|
150
191
|
end
|
151
192
|
|
@@ -154,9 +195,17 @@ module PacketGen
|
|
154
195
|
# @param [::String,Integer] val
|
155
196
|
# @return [::String,Integer]
|
156
197
|
def value=(val)
|
157
|
-
self[:value].from_human
|
158
|
-
|
159
|
-
|
198
|
+
self[:value].from_human(val)
|
199
|
+
|
200
|
+
fil = @field_in_length
|
201
|
+
fil = 'TLV' if @header_in_length
|
202
|
+
|
203
|
+
length = 0
|
204
|
+
fil.each_char do |field_type|
|
205
|
+
length += self[FIELD_TYPES[field_type]].sz
|
206
|
+
end
|
207
|
+
self.length = length
|
208
|
+
|
160
209
|
val
|
161
210
|
end
|
162
211
|
|
@@ -180,7 +229,10 @@ module PacketGen
|
|
180
229
|
if @header_in_length
|
181
230
|
self.length - self[:type].sz - self[:length].sz
|
182
231
|
else
|
183
|
-
self.length
|
232
|
+
length = self.length
|
233
|
+
length -= self[:type].sz if @field_in_length.include?('T')
|
234
|
+
length -= self[:length].sz if @field_in_length.include?('L')
|
235
|
+
length
|
184
236
|
end
|
185
237
|
end
|
186
238
|
end
|
data/lib/packetgen/types/int.rb
CHANGED
@@ -11,6 +11,7 @@ module PacketGen
|
|
11
11
|
# Base integer class to handle binary integers
|
12
12
|
# @abstract
|
13
13
|
# @author Sylvain Daubert
|
14
|
+
# @since 3.3.1 support native endianess
|
14
15
|
class Int
|
15
16
|
include Fieldable
|
16
17
|
|
@@ -18,7 +19,8 @@ module PacketGen
|
|
18
19
|
# @return [Integer]
|
19
20
|
attr_accessor :value
|
20
21
|
# Integer endianness
|
21
|
-
# @return [:little,:big]
|
22
|
+
# @return [:little,:big,:native]
|
23
|
+
# @since 3.3.1 add :native
|
22
24
|
attr_accessor :endian
|
23
25
|
# Integer size, in bytes
|
24
26
|
# @return [Integer]
|
@@ -128,10 +130,10 @@ module PacketGen
|
|
128
130
|
# @author Sylvain Daubert
|
129
131
|
class Int16 < Int
|
130
132
|
# @param [Integer,nil] value
|
131
|
-
# @param [:big, :little] endian
|
133
|
+
# @param [:big, :little, :native] endian
|
132
134
|
def initialize(value=nil, endian=:big)
|
133
135
|
super(value, endian, 2)
|
134
|
-
@packstr = { big: 'n', little: 'v' }
|
136
|
+
@packstr = { big: 'n', little: 'v', native: 'S' }
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
@@ -153,6 +155,19 @@ module PacketGen
|
|
153
155
|
end
|
154
156
|
end
|
155
157
|
|
158
|
+
# native endian 2-byte unsigned integer
|
159
|
+
# @author Sylvain Daubert
|
160
|
+
# @since 3.3.1
|
161
|
+
class Int16n < Int16
|
162
|
+
# @param [Integer,nil] value
|
163
|
+
undef endian=
|
164
|
+
|
165
|
+
# @param [Integer, nil] value
|
166
|
+
def initialize(value=nil)
|
167
|
+
super(value, :native)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
156
171
|
# 2-byte signed integer
|
157
172
|
# @author Sylvain Daubert
|
158
173
|
# @since 2.8.2
|
@@ -161,7 +176,7 @@ module PacketGen
|
|
161
176
|
# @param [:big, :little] endian
|
162
177
|
def initialize(value=nil, endian=:big)
|
163
178
|
super
|
164
|
-
@packstr = { big: 's>', little: 's<' }
|
179
|
+
@packstr = { big: 's>', little: 's<', native: 's' }
|
165
180
|
end
|
166
181
|
end
|
167
182
|
|
@@ -185,13 +200,33 @@ module PacketGen
|
|
185
200
|
end
|
186
201
|
end
|
187
202
|
|
203
|
+
# native endian 2-byte signed integer
|
204
|
+
# @author Sylvain Daubert
|
205
|
+
# @since 3.3.1
|
206
|
+
class SInt16n < SInt16
|
207
|
+
# @param [Integer,nil] value
|
208
|
+
undef endian=
|
209
|
+
|
210
|
+
# @param [Integer, nil] value
|
211
|
+
def initialize(value=nil)
|
212
|
+
super(value, :native)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
188
216
|
# 3-byte unsigned integer
|
189
217
|
# @author Sylvain Daubert
|
190
218
|
# @since 2.1.4
|
191
219
|
class Int24 < Int
|
192
220
|
# @param [Integer,nil] value
|
193
|
-
# @param [:big, :little] endian
|
221
|
+
# @param [:big, :little, :native] endian
|
194
222
|
def initialize(value=nil, endian=:big)
|
223
|
+
if endian == :native
|
224
|
+
endian = if [1].pack('S').unpack1('n') == 1
|
225
|
+
:big
|
226
|
+
else
|
227
|
+
:little
|
228
|
+
end
|
229
|
+
end
|
195
230
|
super(value, endian, 3)
|
196
231
|
end
|
197
232
|
|
@@ -247,14 +282,27 @@ module PacketGen
|
|
247
282
|
end
|
248
283
|
end
|
249
284
|
|
285
|
+
# native endian 3-byte unsigned integer
|
286
|
+
# @author Sylvain Daubert
|
287
|
+
# @since 3.3.1
|
288
|
+
class Int24n < Int24
|
289
|
+
# @param [Integer,nil] value
|
290
|
+
undef endian=
|
291
|
+
|
292
|
+
# @param [Integer, nil] value
|
293
|
+
def initialize(value=nil)
|
294
|
+
super(value, :native)
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
250
298
|
# 4-byte unsigned integer
|
251
299
|
# @author Sylvain Daubert
|
252
300
|
class Int32 < Int
|
253
301
|
# @param [Integer,nil] value
|
254
|
-
# @param [:big, :little] endian
|
302
|
+
# @param [:big, :little, :native] endian
|
255
303
|
def initialize(value=nil, endian=:big)
|
256
304
|
super(value, endian, 4)
|
257
|
-
@packstr = { big: 'N', little: 'V' }
|
305
|
+
@packstr = { big: 'N', little: 'V', native: 'L' }
|
258
306
|
end
|
259
307
|
end
|
260
308
|
|
@@ -276,6 +324,19 @@ module PacketGen
|
|
276
324
|
end
|
277
325
|
end
|
278
326
|
|
327
|
+
# native endian 4-byte unsigned integer
|
328
|
+
# @author Sylvain Daubert
|
329
|
+
# @since 3.3.1
|
330
|
+
class Int32n < Int32
|
331
|
+
# @param [Integer,nil] value
|
332
|
+
undef endian=
|
333
|
+
|
334
|
+
# @param [Integer, nil] value
|
335
|
+
def initialize(value=nil)
|
336
|
+
super(value, :native)
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
279
340
|
# 4-byte unsigned integer
|
280
341
|
# @author Sylvain Daubert
|
281
342
|
# @since 2.8.2
|
@@ -284,7 +345,7 @@ module PacketGen
|
|
284
345
|
# @param [:big, :little] endian
|
285
346
|
def initialize(value=nil, endian=:big)
|
286
347
|
super
|
287
|
-
@packstr = { big: 'l>', little: 'l<' }
|
348
|
+
@packstr = { big: 'l>', little: 'l<', native: 'l' }
|
288
349
|
end
|
289
350
|
end
|
290
351
|
|
@@ -308,14 +369,27 @@ module PacketGen
|
|
308
369
|
end
|
309
370
|
end
|
310
371
|
|
372
|
+
# native endian 4-byte unsigned integer
|
373
|
+
# @author Sylvain Daubert
|
374
|
+
# @since 3.3.1
|
375
|
+
class SInt32n < SInt32
|
376
|
+
# @param [Integer,nil] value
|
377
|
+
undef endian=
|
378
|
+
|
379
|
+
# @param [Integer, nil] value
|
380
|
+
def initialize(value=nil)
|
381
|
+
super(value, :native)
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
311
385
|
# 8-byte unsigned integer
|
312
386
|
# @author Sylvain Daubert
|
313
387
|
class Int64 < Int
|
314
388
|
# @param [Integer,nil] value
|
315
|
-
# @param [:big, :little] endian
|
389
|
+
# @param [:big, :little, :native] endian
|
316
390
|
def initialize(value=nil, endian=:big)
|
317
391
|
super(value, endian, 8)
|
318
|
-
@packstr = { big: 'Q>', little: 'Q<' }
|
392
|
+
@packstr = { big: 'Q>', little: 'Q<', native: 'Q' }
|
319
393
|
end
|
320
394
|
end
|
321
395
|
|
@@ -337,15 +411,28 @@ module PacketGen
|
|
337
411
|
end
|
338
412
|
end
|
339
413
|
|
414
|
+
# native endian 8-byte unsigned integer
|
415
|
+
# @author Sylvain Daubert
|
416
|
+
# @since 3.3.1
|
417
|
+
class Int64n < Int64
|
418
|
+
# @param [Integer,nil] value
|
419
|
+
undef endian=
|
420
|
+
|
421
|
+
# @param [Integer, nil] value
|
422
|
+
def initialize(value=nil)
|
423
|
+
super(value, :native)
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
340
427
|
# 8-byte unsigned integer
|
341
428
|
# @author Sylvain Daubert
|
342
429
|
# @since 2.8.2
|
343
430
|
class SInt64 < Int64
|
344
431
|
# @param [Integer,nil] value
|
345
|
-
# @param [:big, :little] endian
|
432
|
+
# @param [:big, :little, :native] endian
|
346
433
|
def initialize(value=nil, endian=:big)
|
347
434
|
super
|
348
|
-
@packstr = { big: 'q>', little: 'q<' }
|
435
|
+
@packstr = { big: 'q>', little: 'q<', native: 'q' }
|
349
436
|
end
|
350
437
|
end
|
351
438
|
|
@@ -368,5 +455,18 @@ module PacketGen
|
|
368
455
|
super(value, :little)
|
369
456
|
end
|
370
457
|
end
|
458
|
+
|
459
|
+
# native endian 8-byte unsigned integer
|
460
|
+
# @author Sylvain Daubert
|
461
|
+
# @since 3.3.1
|
462
|
+
class SInt64n < SInt64
|
463
|
+
# @param [Integer,nil] value
|
464
|
+
undef endian=
|
465
|
+
|
466
|
+
# @param [Integer, nil] value
|
467
|
+
def initialize(value=nil)
|
468
|
+
super(value, :native)
|
469
|
+
end
|
470
|
+
end
|
371
471
|
end
|
372
472
|
end
|
data/lib/packetgen/version.rb
CHANGED
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: 3.3.
|
4
|
+
version: 3.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: interfacez
|
@@ -189,7 +189,7 @@ files:
|
|
189
189
|
- lib/packetgen/utils.rb
|
190
190
|
- lib/packetgen/utils/arp_spoofer.rb
|
191
191
|
- lib/packetgen/version.rb
|
192
|
-
homepage:
|
192
|
+
homepage:
|
193
193
|
licenses:
|
194
194
|
- MIT
|
195
195
|
metadata:
|
@@ -198,7 +198,7 @@ metadata:
|
|
198
198
|
bug_tracker_uri: https://github.com/sdaubert/packetgen/issues
|
199
199
|
documentation_uri: https://www.rubydoc.info/gems/packetgen
|
200
200
|
wiki_uri: https://github.com/sdaubert/packetgen/wiki
|
201
|
-
post_install_message:
|
201
|
+
post_install_message:
|
202
202
|
rdoc_options:
|
203
203
|
- "--title"
|
204
204
|
- PacketGen - network packet dissector
|
@@ -219,8 +219,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
219
|
- !ruby/object:Gem::Version
|
220
220
|
version: '0'
|
221
221
|
requirements: []
|
222
|
-
rubygems_version: 3.
|
223
|
-
signing_key:
|
222
|
+
rubygems_version: 3.3.15
|
223
|
+
signing_key:
|
224
224
|
specification_version: 4
|
225
225
|
summary: Network packet generator and dissector
|
226
226
|
test_files: []
|