packetgen 2.6.0 → 2.7.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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +28 -0
  4. data/Rakefile +6 -6
  5. data/bin/pgconsole +6 -6
  6. data/lib/packetgen.rb +4 -3
  7. data/lib/packetgen/capture.rb +5 -7
  8. data/lib/packetgen/config.rb +3 -3
  9. data/lib/packetgen/deprecation.rb +17 -0
  10. data/lib/packetgen/header.rb +40 -38
  11. data/lib/packetgen/header/arp.rb +46 -31
  12. data/lib/packetgen/header/asn1_base.rb +8 -8
  13. data/lib/packetgen/header/base.rb +108 -36
  14. data/lib/packetgen/header/bootp.rb +28 -19
  15. data/lib/packetgen/header/crypto.rb +6 -8
  16. data/lib/packetgen/header/dhcp.rb +4 -5
  17. data/lib/packetgen/header/dhcp/option.rb +46 -34
  18. data/lib/packetgen/header/dhcp/options.rb +0 -1
  19. data/lib/packetgen/header/dhcpv6.rb +10 -10
  20. data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
  21. data/lib/packetgen/header/dhcpv6/option.rb +16 -21
  22. data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
  23. data/lib/packetgen/header/dns.rb +13 -11
  24. data/lib/packetgen/header/dns/name.rb +4 -6
  25. data/lib/packetgen/header/dns/opt.rb +31 -31
  26. data/lib/packetgen/header/dns/option.rb +0 -2
  27. data/lib/packetgen/header/dns/qdsection.rb +1 -2
  28. data/lib/packetgen/header/dns/question.rb +19 -13
  29. data/lib/packetgen/header/dns/rr.rb +11 -14
  30. data/lib/packetgen/header/dns/rrsection.rb +5 -7
  31. data/lib/packetgen/header/dot11.rb +45 -29
  32. data/lib/packetgen/header/dot11/control.rb +3 -5
  33. data/lib/packetgen/header/dot11/data.rb +34 -6
  34. data/lib/packetgen/header/dot11/element.rb +0 -1
  35. data/lib/packetgen/header/dot11/management.rb +9 -5
  36. data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
  37. data/lib/packetgen/header/dot1q.rb +2 -2
  38. data/lib/packetgen/header/dot1x.rb +3 -4
  39. data/lib/packetgen/header/eap.rb +62 -53
  40. data/lib/packetgen/header/eap/fast.rb +0 -1
  41. data/lib/packetgen/header/eap/md5.rb +1 -2
  42. data/lib/packetgen/header/eap/tls.rb +9 -10
  43. data/lib/packetgen/header/eap/ttls.rb +9 -10
  44. data/lib/packetgen/header/esp.rb +33 -33
  45. data/lib/packetgen/header/eth.rb +11 -8
  46. data/lib/packetgen/header/gre.rb +5 -6
  47. data/lib/packetgen/header/http/headers.rb +11 -14
  48. data/lib/packetgen/header/http/request.rb +20 -20
  49. data/lib/packetgen/header/http/response.rb +16 -18
  50. data/lib/packetgen/header/http/verbs.rb +5 -5
  51. data/lib/packetgen/header/icmp.rb +1 -3
  52. data/lib/packetgen/header/icmpv6.rb +1 -3
  53. data/lib/packetgen/header/igmp.rb +5 -6
  54. data/lib/packetgen/header/igmpv3.rb +5 -9
  55. data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
  56. data/lib/packetgen/header/igmpv3/mq.rb +2 -2
  57. data/lib/packetgen/header/igmpv3/mr.rb +4 -3
  58. data/lib/packetgen/header/ike.rb +33 -8
  59. data/lib/packetgen/header/ike/auth.rb +4 -6
  60. data/lib/packetgen/header/ike/cert.rb +0 -2
  61. data/lib/packetgen/header/ike/certreq.rb +1 -3
  62. data/lib/packetgen/header/ike/id.rb +1 -3
  63. data/lib/packetgen/header/ike/ke.rb +0 -2
  64. data/lib/packetgen/header/ike/nonce.rb +0 -2
  65. data/lib/packetgen/header/ike/notify.rb +22 -24
  66. data/lib/packetgen/header/ike/payload.rb +198 -199
  67. data/lib/packetgen/header/ike/sa.rb +21 -30
  68. data/lib/packetgen/header/ike/sk.rb +16 -17
  69. data/lib/packetgen/header/ike/ts.rb +22 -24
  70. data/lib/packetgen/header/ike/vendor_id.rb +0 -2
  71. data/lib/packetgen/header/ip.rb +30 -23
  72. data/lib/packetgen/header/ip/addr.rb +5 -6
  73. data/lib/packetgen/header/ip/option.rb +11 -15
  74. data/lib/packetgen/header/ip/options.rb +1 -2
  75. data/lib/packetgen/header/ipv6.rb +27 -12
  76. data/lib/packetgen/header/ipv6/addr.rb +2 -2
  77. data/lib/packetgen/header/ipv6/extension.rb +1 -1
  78. data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
  79. data/lib/packetgen/header/llc.rb +4 -3
  80. data/lib/packetgen/header/mdns.rb +11 -5
  81. data/lib/packetgen/header/mld.rb +4 -4
  82. data/lib/packetgen/header/mldv2.rb +4 -3
  83. data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
  84. data/lib/packetgen/header/mldv2/mlq.rb +3 -4
  85. data/lib/packetgen/header/mldv2/mlr.rb +4 -3
  86. data/lib/packetgen/header/netbios.rb +18 -5
  87. data/lib/packetgen/header/ospfv2.rb +6 -7
  88. data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
  89. data/lib/packetgen/header/ospfv2/hello.rb +2 -3
  90. data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
  91. data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
  92. data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
  93. data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
  94. data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
  95. data/lib/packetgen/header/ospfv3.rb +3 -4
  96. data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
  97. data/lib/packetgen/header/ospfv3/hello.rb +2 -3
  98. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
  99. data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
  100. data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
  101. data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
  102. data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
  103. data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
  104. data/lib/packetgen/header/snmp.rb +45 -32
  105. data/lib/packetgen/header/tcp.rb +13 -9
  106. data/lib/packetgen/header/tcp/option.rb +16 -11
  107. data/lib/packetgen/header/tcp/options.rb +3 -4
  108. data/lib/packetgen/header/tftp.rb +15 -17
  109. data/lib/packetgen/header/udp.rb +10 -4
  110. data/lib/packetgen/inspect.rb +7 -9
  111. data/lib/packetgen/packet.rb +44 -22
  112. data/lib/packetgen/pcapng.rb +1 -5
  113. data/lib/packetgen/pcapng/block.rb +17 -11
  114. data/lib/packetgen/pcapng/epb.rb +6 -11
  115. data/lib/packetgen/pcapng/file.rb +37 -44
  116. data/lib/packetgen/pcapng/idb.rb +17 -22
  117. data/lib/packetgen/pcapng/shb.rb +7 -10
  118. data/lib/packetgen/pcapng/spb.rb +21 -17
  119. data/lib/packetgen/pcapng/unknown_block.rb +17 -13
  120. data/lib/packetgen/proto.rb +1 -2
  121. data/lib/packetgen/types/array.rb +119 -34
  122. data/lib/packetgen/types/cstring.rb +1 -5
  123. data/lib/packetgen/types/enum.rb +8 -10
  124. data/lib/packetgen/types/fields.rb +34 -28
  125. data/lib/packetgen/types/int.rb +11 -13
  126. data/lib/packetgen/types/int_string.rb +6 -8
  127. data/lib/packetgen/types/oui.rb +3 -6
  128. data/lib/packetgen/types/string.rb +4 -6
  129. data/lib/packetgen/types/tlv.rb +11 -14
  130. data/lib/packetgen/utils.rb +15 -23
  131. data/lib/packetgen/utils/arp_spoofer.rb +12 -18
  132. data/lib/packetgen/version.rb +1 -1
  133. data/packetgen.gemspec +9 -8
  134. metadata +19 -17
@@ -36,20 +36,20 @@ module PacketGen
36
36
  #
37
37
  # @author Kent 'picat' Gruber
38
38
  class Response < Base
39
- # @!attribute version
39
+ # @!attribute version
40
40
  # @return [Types::String]
41
- define_field :version, Types::String, default: "HTTP/1.1"
42
- # @!attribute status_code
41
+ define_field :version, Types::String, default: 'HTTP/1.1'
42
+ # @!attribute status_code
43
43
  # @return [Types::String]
44
44
  define_field :status_code, Types::String
45
- # @!attribute status_mesg
45
+ # @!attribute status_mesg
46
46
  # @return [Types::String]
47
- define_field :status_mesg, Types::String
47
+ define_field :status_mesg, Types::String
48
48
  # @!attribute headers
49
49
  # associated http/1.1 headers
50
50
  # @return [Types::String]
51
51
  define_field :headers, HTTP::Headers
52
- # @!attribute body
52
+ # @!attribute body
53
53
  # @return [HTTP::PHeaders]
54
54
  define_field :body, Types::String
55
55
 
@@ -64,7 +64,7 @@ module PacketGen
64
64
  self.headers ||= options[:headers]
65
65
  end
66
66
 
67
- # Read in the HTTP portion of the packet, and parse it.
67
+ # Read in the HTTP portion of the packet, and parse it.
68
68
  # @return [PacketGen::HTTP::Response]
69
69
  def read(str)
70
70
  str = str.bytes.map!(&:chr).join unless str.valid_encoding?
@@ -89,8 +89,8 @@ module PacketGen
89
89
  first_line = headers.shift.split
90
90
  self[:version] = first_line[0]
91
91
  self[:status_code] = first_line[1]
92
- self[:status_mesg] = first_line[2..-1].join(" ")
93
- self[:headers].read(headers.join("\n"))
92
+ self[:status_mesg] = first_line[2..-1].join(' ')
93
+ self[:headers].read(headers.join("\n"))
94
94
  end
95
95
  self[:body] = data.join("\n")
96
96
  self
@@ -99,20 +99,18 @@ module PacketGen
99
99
  # String representation of data.
100
100
  # @return [String]
101
101
  def to_s
102
- raise FormatError, "Missing #status_code." if self.status_code.empty?
103
- raise FormatError, "Missing #status_mesg." if self.status_mesg.empty?
104
- raise FormatError, "Missing #version." if self.version.empty?
105
- str = "".dup # build 'dat string
106
- str << self[:version] << " " << self[:status_code] << " " << self[:status_mesg] << "\r\n"
107
- if self[:headers].given?
108
- str << self[:headers].to_s
109
- end
102
+ raise FormatError, 'Missing #status_code.' if self.status_code.empty?
103
+ raise FormatError, 'Missing #status_mesg.' if self.status_mesg.empty?
104
+ raise FormatError, 'Missing #version.' if self.version.empty?
105
+ str = ''.dup # build 'dat string
106
+ str << self[:version] << ' ' << self[:status_code] << ' ' << self[:status_mesg] << "\r\n"
107
+ str << self[:headers].to_s if self[:headers].given?
110
108
  str << self.body
111
109
  end
112
110
  end
113
111
  end
114
112
 
115
113
  self.add_class HTTP::Response
116
- TCP.bind_header HTTP::Response, body: ->(b) { /^HTTP\/1\.1\s\d{3,}\s.+/ =~ b.chars.select(&:valid_encoding?).join }
114
+ TCP.bind HTTP::Response, body: ->(b) { %r[^HTTP/1\.1\s\d{3,}\s.+] =~ b.chars.select(&:valid_encoding?).join }
117
115
  end
118
116
  end
@@ -8,15 +8,15 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  # @since 2.2.0
11
- module HTTP
11
+ module HTTP
12
12
  # @abstract Collection of useful HTTP verbs.
13
13
  # @author Kent 'picat' Gruber
14
-
14
+
15
15
  # Valid HTTP Verbs
16
- VERBS = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH']
17
-
16
+ VERBS = %w[GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE PATCH].freeze
17
+
18
18
  # Identifiable HTTP request regular expression.
19
- REQUEST_REGEX = Regexp.new("(" + VERBS.dup.join("|") + ")" + '\s+\S+\s+HTTP/1.1')
19
+ REQUEST_REGEX = Regexp.new('(' + VERBS.dup.join('|') + ')' + '\s+\S+\s+HTTP/1.1')
20
20
  end
21
21
  end
22
22
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # A ICMP header consists of:
12
11
  # * a {#type} field ({Types::Int8} type),
13
12
  # * a {#code} field ({Types::Int8} type),
@@ -29,7 +28,6 @@ module PacketGen
29
28
  # icmp.body.read 'this is a body'
30
29
  # @author Sylvain Daubert
31
30
  class ICMP < Base
32
-
33
31
  # ICMP internet protocol number
34
32
  IP_PROTOCOL = 1
35
33
 
@@ -59,6 +57,6 @@ module PacketGen
59
57
 
60
58
  self.add_class ICMP
61
59
 
62
- IP.bind_header ICMP, protocol: ICMP::IP_PROTOCOL
60
+ IP.bind ICMP, protocol: ICMP::IP_PROTOCOL
63
61
  end
64
62
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # A ICMPv6 header consists of:
12
11
  # * a +type+ field ({Types::Int8} type),
13
12
  # * a +code+ field ({Types::Int8} type),
@@ -29,7 +28,6 @@ module PacketGen
29
28
  # icmpv6.body.read 'this is a body'
30
29
  # @author Sylvain Daubert
31
30
  class ICMPv6 < ICMP
32
-
33
31
  # ICMPv6 internet protocol number
34
32
  IP_PROTOCOL = 58
35
33
 
@@ -45,6 +43,6 @@ module PacketGen
45
43
  end
46
44
 
47
45
  self.add_class ICMPv6
48
- IPv6.bind_header ICMPv6, next: ICMPv6::IP_PROTOCOL
46
+ IPv6.bind ICMPv6, next: ICMPv6::IP_PROTOCOL
49
47
  end
50
48
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # This class supports IGMPv2 (RFC 2236).
12
11
  #
13
12
  # From RFC 2236, a IGMP header has the following format:
@@ -40,18 +39,18 @@ module PacketGen
40
39
  # icmp.checksum = 0x248a
41
40
  # icmp.group_addr = '224.0.0.1'
42
41
  # @author Sylvain Daubert
42
+ # @since 2.4.0
43
43
  class IGMP < Base
44
-
45
44
  # IGMP internet protocol number
46
45
  IP_PROTOCOL = 2
47
-
46
+
48
47
  # Known types
49
48
  TYPES = {
50
49
  'MembershipQuery' => 0x11,
51
50
  'MembershipReportv1' => 0x12,
52
51
  'MembershipReportv2' => 0x16,
53
52
  'LeaveGroup' => 0x17,
54
- }
53
+ }.freeze
55
54
 
56
55
  # @!attribute type
57
56
  # 8-bit IGMP Type
@@ -113,7 +112,7 @@ module PacketGen
113
112
  end
114
113
 
115
114
  self.add_class IGMP
116
- IP.bind_header IGMP, op: :and, protocol: IGMP::IP_PROTOCOL, frag: 0, ttl: 1,
117
- tos: ->(v) { v.nil? ? 0 : v != 0xc0 }
115
+ IP.bind IGMP, protocol: IGMP::IP_PROTOCOL, frag: 0, ttl: 1,
116
+ tos: ->(v) { v.nil? ? 0 : v != 0xc0 }
118
117
  end
119
118
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # This class supports IGMPv3 (RFC3376).
12
11
  #
13
12
  # From RFC 3376, a IGMP header has the following format:
@@ -63,17 +62,15 @@ module PacketGen
63
62
  # pkt.igmpv3 #=> PacketGen::Header::IGMPv3
64
63
  # pkt.igmpv3_mr #=> PacketGen::Header::IGMPv3::MR
65
64
  # @author Sylvain Daubert
65
+ # @since 2.4.0
66
66
  class IGMPv3 < IGMP
67
-
68
67
  # Known types
69
68
  TYPES = {
70
69
  'MembershipQuery' => 0x11,
71
70
  'MembershipReport' => 0x22,
72
- }
71
+ }.freeze
73
72
 
74
73
  delete_field :group_addr
75
- #undef group_addr
76
- #undef group_addr=
77
74
 
78
75
  # Encode value for IGMPv3 Max Resp Code and QQIC.
79
76
  # Value may be encoded as a float, so some error may occur.
@@ -83,12 +80,12 @@ module PacketGen
83
80
  def self.encode(value)
84
81
  if value < 128
85
82
  value
86
- elsif value > 31743
83
+ elsif value > 31_743
87
84
  255
88
85
  else
89
86
  exp = 0
90
87
  value >>= 3
91
- while value > 31 do
88
+ while value > 31
92
89
  exp += 1
93
90
  value >>= 1
94
91
  end
@@ -134,8 +131,7 @@ module PacketGen
134
131
  end
135
132
 
136
133
  self.add_class IGMPv3
137
- IP.bind_header IGMPv3, op: :and, protocol: IGMPv3::IP_PROTOCOL, frag: 0, ttl: 1,
138
- tos: 0xc0
134
+ IP.bind IGMPv3, protocol: IGMPv3::IP_PROTOCOL, frag: 0, ttl: 1, tos: 0xc0
139
135
  end
140
136
  end
141
137
 
@@ -40,7 +40,6 @@ module PacketGen
40
40
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41
41
  # @author Sylvain Daubert
42
42
  class GroupRecord < Types::Fields
43
-
44
43
  # Known record types
45
44
  RECORD_TYPES = {
46
45
  'MODE_IS_INCLUDE' => 1,
@@ -49,7 +48,7 @@ module PacketGen
49
48
  'CHANGE_TO_EXCLUDE_MODE' => 4,
50
49
  'ALLOW_NEW_SOURCES' => 5,
51
50
  'BLOCK_OLD_SOURCES' => 6
52
- }
51
+ }.freeze
53
52
 
54
53
  # @!attribute type
55
54
  # 8-bit record type
@@ -76,7 +75,7 @@ module PacketGen
76
75
  # @!attribute aux_data
77
76
  # @return [String]
78
77
  define_field :aux_data, Types::String,
79
- builder: ->(h, t) { t.new(length_from: ->() { h[:aux_data_len].to_i * 4 }) }
78
+ builder: ->(h, t) { t.new(length_from: -> { h[:aux_data_len].to_i * 4 }) }
80
79
 
81
80
  def human_type
82
81
  self[:type].to_human
@@ -86,12 +85,12 @@ module PacketGen
86
85
  "#{human_type}(ma:#{multicast_addr}|src:#{source_addr.to_human})"
87
86
  end
88
87
  end
89
-
88
+
90
89
  # Class to handle series of {GroupRecord}.
91
90
  # @author Sylvain Daubert
92
91
  class GroupRecords < Types::Array
93
92
  set_of GroupRecord
94
-
93
+
95
94
  # Separator used in {#to_human}.
96
95
  HUMAN_SEPARATOR = ';'
97
96
  end
@@ -61,7 +61,7 @@ module PacketGen
61
61
  # Array of IP source addresses
62
62
  # @return [IP::ArrayOfAddr]
63
63
  define_field :source_addr, IP::ArrayOfAddr,
64
- builder: ->(h,t) { t.new(counter: h[:number_of_sources]) }
64
+ builder: ->(h, t) { t.new(counter: h[:number_of_sources]) }
65
65
 
66
66
  # @!attribute resv
67
67
  # 4-bit reserved field in
@@ -93,6 +93,6 @@ module PacketGen
93
93
  end
94
94
 
95
95
  self.add_class IGMPv3::MQ
96
- IGMPv3.bind_header IGMPv3::MQ, type: 0x11
96
+ IGMPv3.bind IGMPv3::MQ, type: 0x11
97
97
  end
98
98
  end
@@ -4,6 +4,7 @@
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
7
+
7
8
  require_relative 'group_record'
8
9
 
9
10
  module PacketGen
@@ -12,7 +13,7 @@ module PacketGen
12
13
  # IGMPv3 Membership Report.
13
14
  #
14
15
  # This is a subpayload for IGMPv3 packets only. This kind of payload is
15
- # sent by IP systems to report (to neighboring routers) the current multicast
16
+ # sent by IP systems to report (to neighboring routers) the current multicast
16
17
  # reception state, or changes in the multicast reception state, of their
17
18
  # interfaces. Reports have the following format:
18
19
  # 0 1 2 3
@@ -52,7 +53,7 @@ module PacketGen
52
53
  # 16-bit Number of group records in {#group_records}
53
54
  # @return [Integer]
54
55
  define_field :number_of_gr, Types::Int16, default: 0
55
-
56
+
56
57
  # @!attribute group_records
57
58
  # Array of group records
58
59
  # @return [GroupRecords]
@@ -62,6 +63,6 @@ module PacketGen
62
63
  end
63
64
 
64
65
  self.add_class IGMPv3::MR
65
- IGMPv3.bind_header IGMPv3::MR, type: 0x22
66
+ IGMPv3.bind IGMPv3::MR, type: 0x22
66
67
  end
67
68
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # This class handles a pseudo-header used to differentiate ESP from IKE headers
12
11
  # in a UDP datagram with port 4500.
13
12
  # @author Sylvain Daubert
@@ -24,7 +23,7 @@ module PacketGen
24
23
  # Check non_esp_marker field
25
24
  # @see [Base#parse?]
26
25
  def parse?
27
- non_esp_marker == 0
26
+ non_esp_marker.zero?
28
27
  end
29
28
  end
30
29
 
@@ -75,7 +74,6 @@ module PacketGen
75
74
  # @author Sylvain Daubert
76
75
  # @since 2.0.0
77
76
  class IKE < Base
78
-
79
77
  # Classical well-known UDP port for IKE
80
78
  UDP_PORT1 = 500
81
79
  # Well-known UDP port for IKE when NAT is detected
@@ -182,7 +180,7 @@ module PacketGen
182
180
  def payloads
183
181
  payloads = []
184
182
  body = self.body
185
- while body.is_a?(Payload) do
183
+ while body.is_a?(Payload)
186
184
  payloads << body
187
185
  body = body.body
188
186
  end
@@ -197,7 +195,7 @@ module PacketGen
197
195
  case attr
198
196
  when :flags
199
197
  str_flags = ''.dup
200
- %w(r v i).each do |flag|
198
+ %w[r v i].each do |flag|
201
199
  str_flags << (send("flag_#{flag}?") ? flag.upcase : '.')
202
200
  end
203
201
  str << Inspect.shift_level(2)
@@ -213,14 +211,41 @@ module PacketGen
213
211
  end
214
212
  str
215
213
  end
214
+
215
+ # Toggle +I+ and +R+ flags.
216
+ # @return [self]
217
+ def reply!
218
+ self.flag_r = !self.flag_r?
219
+ self.flag_i = !self.flag_i?
220
+ self
221
+ end
222
+
223
+ # @api private
224
+ # @note This method is used internally by PacketGen and should not be
225
+ # directly called
226
+ # @param [Packet] packet
227
+ # @return [void]
228
+ # @since 2.7.0 Set UDP sport according to bindings, only if sport is 0.
229
+ # Needed by new bind API.
230
+ def added_to_packet(packet)
231
+ return unless packet.is? 'UDP'
232
+ return unless packet.udp.sport.zero?
233
+ packet.udp.sport = if packet.is?('NonESPMarker')
234
+ UDP_PORT2
235
+ else
236
+ UDP_PORT1
237
+ end
238
+ end
216
239
  end
217
240
 
218
241
  self.add_class IKE
219
242
  self.add_class NonESPMarker
220
243
 
221
- UDP.bind_header IKE, dport: IKE::UDP_PORT1, sport: IKE::UDP_PORT1
222
- UDP.bind_header NonESPMarker, dport: IKE::UDP_PORT2, sport: IKE::UDP_PORT2
223
- NonESPMarker.bind_header IKE
244
+ UDP.bind IKE, dport: IKE::UDP_PORT1
245
+ UDP.bind IKE, sport: IKE::UDP_PORT1
246
+ UDP.bind NonESPMarker, dport: IKE::UDP_PORT2
247
+ UDP.bind NonESPMarker, sport: IKE::UDP_PORT2
248
+ NonESPMarker.bind IKE
224
249
  end
225
250
  end
226
251
 
@@ -9,7 +9,6 @@
9
9
  module PacketGen
10
10
  module Header
11
11
  class IKE
12
-
13
12
  # This class handles Authentication payloads.
14
13
  #
15
14
  # A AUTH payload consists of the IKE generic payload header (see {Payload})
@@ -36,7 +35,6 @@ module PacketGen
36
35
  # pkt.calc_length
37
36
  # @author Sylvain Daubert
38
37
  class Auth < Payload
39
-
40
38
  # Payload type number
41
39
  PAYLOAD_TYPE = 39
42
40
 
@@ -50,7 +48,7 @@ module PacketGen
50
48
  'PASSWORD' => 12,
51
49
  'NULL' => 13,
52
50
  'DIGITAL_SIGNATURE' => 14
53
- }
51
+ }.freeze
54
52
 
55
53
  # @attribute [r] method
56
54
  # 8-bit Auth Method
@@ -137,9 +135,9 @@ module PacketGen
137
135
  when Transform::PRF_HMAC_MD5, Transform::PRF_HMAC_SHA1,
138
136
  Transform::PRF_HMAC_SHA2_256, Transform::PRF_HMAC_SHA2_384,
139
137
  Transform::PRF_HMAC_SHA2_512
140
- digestname = Transform.constants.grep(/PRF_/).
141
- detect { |c| Transform.const_get(c) == type }.
142
- to_s.sub(/^PRF_HMAC_/, '').sub(/2_/, '')
138
+ digestname = Transform.constants.grep(/PRF_/)
139
+ .detect { |c| Transform.const_get(c) == type }
140
+ .to_s.sub(/^PRF_HMAC_/, '').sub(/2_/, '')
143
141
  digest = OpenSSL::Digest.const_get(digestname).new
144
142
  else
145
143
  raise NotImplementedError, 'for now, only HMAC-based PRF are supported'