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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +28 -0
- data/Rakefile +6 -6
- data/bin/pgconsole +6 -6
- data/lib/packetgen.rb +4 -3
- data/lib/packetgen/capture.rb +5 -7
- data/lib/packetgen/config.rb +3 -3
- data/lib/packetgen/deprecation.rb +17 -0
- data/lib/packetgen/header.rb +40 -38
- data/lib/packetgen/header/arp.rb +46 -31
- data/lib/packetgen/header/asn1_base.rb +8 -8
- data/lib/packetgen/header/base.rb +108 -36
- data/lib/packetgen/header/bootp.rb +28 -19
- data/lib/packetgen/header/crypto.rb +6 -8
- data/lib/packetgen/header/dhcp.rb +4 -5
- data/lib/packetgen/header/dhcp/option.rb +46 -34
- data/lib/packetgen/header/dhcp/options.rb +0 -1
- data/lib/packetgen/header/dhcpv6.rb +10 -10
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
- data/lib/packetgen/header/dhcpv6/option.rb +16 -21
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
- data/lib/packetgen/header/dns.rb +13 -11
- data/lib/packetgen/header/dns/name.rb +4 -6
- data/lib/packetgen/header/dns/opt.rb +31 -31
- data/lib/packetgen/header/dns/option.rb +0 -2
- data/lib/packetgen/header/dns/qdsection.rb +1 -2
- data/lib/packetgen/header/dns/question.rb +19 -13
- data/lib/packetgen/header/dns/rr.rb +11 -14
- data/lib/packetgen/header/dns/rrsection.rb +5 -7
- data/lib/packetgen/header/dot11.rb +45 -29
- data/lib/packetgen/header/dot11/control.rb +3 -5
- data/lib/packetgen/header/dot11/data.rb +34 -6
- data/lib/packetgen/header/dot11/element.rb +0 -1
- data/lib/packetgen/header/dot11/management.rb +9 -5
- data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
- data/lib/packetgen/header/dot1q.rb +2 -2
- data/lib/packetgen/header/dot1x.rb +3 -4
- data/lib/packetgen/header/eap.rb +62 -53
- data/lib/packetgen/header/eap/fast.rb +0 -1
- data/lib/packetgen/header/eap/md5.rb +1 -2
- data/lib/packetgen/header/eap/tls.rb +9 -10
- data/lib/packetgen/header/eap/ttls.rb +9 -10
- data/lib/packetgen/header/esp.rb +33 -33
- data/lib/packetgen/header/eth.rb +11 -8
- data/lib/packetgen/header/gre.rb +5 -6
- data/lib/packetgen/header/http/headers.rb +11 -14
- data/lib/packetgen/header/http/request.rb +20 -20
- data/lib/packetgen/header/http/response.rb +16 -18
- data/lib/packetgen/header/http/verbs.rb +5 -5
- data/lib/packetgen/header/icmp.rb +1 -3
- data/lib/packetgen/header/icmpv6.rb +1 -3
- data/lib/packetgen/header/igmp.rb +5 -6
- data/lib/packetgen/header/igmpv3.rb +5 -9
- data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
- data/lib/packetgen/header/igmpv3/mq.rb +2 -2
- data/lib/packetgen/header/igmpv3/mr.rb +4 -3
- data/lib/packetgen/header/ike.rb +33 -8
- data/lib/packetgen/header/ike/auth.rb +4 -6
- data/lib/packetgen/header/ike/cert.rb +0 -2
- data/lib/packetgen/header/ike/certreq.rb +1 -3
- data/lib/packetgen/header/ike/id.rb +1 -3
- data/lib/packetgen/header/ike/ke.rb +0 -2
- data/lib/packetgen/header/ike/nonce.rb +0 -2
- data/lib/packetgen/header/ike/notify.rb +22 -24
- data/lib/packetgen/header/ike/payload.rb +198 -199
- data/lib/packetgen/header/ike/sa.rb +21 -30
- data/lib/packetgen/header/ike/sk.rb +16 -17
- data/lib/packetgen/header/ike/ts.rb +22 -24
- data/lib/packetgen/header/ike/vendor_id.rb +0 -2
- data/lib/packetgen/header/ip.rb +30 -23
- data/lib/packetgen/header/ip/addr.rb +5 -6
- data/lib/packetgen/header/ip/option.rb +11 -15
- data/lib/packetgen/header/ip/options.rb +1 -2
- data/lib/packetgen/header/ipv6.rb +27 -12
- data/lib/packetgen/header/ipv6/addr.rb +2 -2
- data/lib/packetgen/header/ipv6/extension.rb +1 -1
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
- data/lib/packetgen/header/llc.rb +4 -3
- data/lib/packetgen/header/mdns.rb +11 -5
- data/lib/packetgen/header/mld.rb +4 -4
- data/lib/packetgen/header/mldv2.rb +4 -3
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
- data/lib/packetgen/header/mldv2/mlq.rb +3 -4
- data/lib/packetgen/header/mldv2/mlr.rb +4 -3
- data/lib/packetgen/header/netbios.rb +18 -5
- data/lib/packetgen/header/ospfv2.rb +6 -7
- data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
- data/lib/packetgen/header/ospfv2/hello.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
- data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
- data/lib/packetgen/header/ospfv3.rb +3 -4
- data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
- data/lib/packetgen/header/ospfv3/hello.rb +2 -3
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
- data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
- data/lib/packetgen/header/snmp.rb +45 -32
- data/lib/packetgen/header/tcp.rb +13 -9
- data/lib/packetgen/header/tcp/option.rb +16 -11
- data/lib/packetgen/header/tcp/options.rb +3 -4
- data/lib/packetgen/header/tftp.rb +15 -17
- data/lib/packetgen/header/udp.rb +10 -4
- data/lib/packetgen/inspect.rb +7 -9
- data/lib/packetgen/packet.rb +44 -22
- data/lib/packetgen/pcapng.rb +1 -5
- data/lib/packetgen/pcapng/block.rb +17 -11
- data/lib/packetgen/pcapng/epb.rb +6 -11
- data/lib/packetgen/pcapng/file.rb +37 -44
- data/lib/packetgen/pcapng/idb.rb +17 -22
- data/lib/packetgen/pcapng/shb.rb +7 -10
- data/lib/packetgen/pcapng/spb.rb +21 -17
- data/lib/packetgen/pcapng/unknown_block.rb +17 -13
- data/lib/packetgen/proto.rb +1 -2
- data/lib/packetgen/types/array.rb +119 -34
- data/lib/packetgen/types/cstring.rb +1 -5
- data/lib/packetgen/types/enum.rb +8 -10
- data/lib/packetgen/types/fields.rb +34 -28
- data/lib/packetgen/types/int.rb +11 -13
- data/lib/packetgen/types/int_string.rb +6 -8
- data/lib/packetgen/types/oui.rb +3 -6
- data/lib/packetgen/types/string.rb +4 -6
- data/lib/packetgen/types/tlv.rb +11 -14
- data/lib/packetgen/utils.rb +15 -23
- data/lib/packetgen/utils/arp_spoofer.rb +12 -18
- data/lib/packetgen/version.rb +1 -1
- data/packetgen.gemspec +9 -8
- 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:
|
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,
|
103
|
-
raise FormatError,
|
104
|
-
raise FormatError,
|
105
|
-
str =
|
106
|
-
str << self[:version] <<
|
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.
|
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 = [
|
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(
|
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.
|
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.
|
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.
|
117
|
-
|
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 >
|
83
|
+
elsif value > 31_743
|
87
84
|
255
|
88
85
|
else
|
89
86
|
exp = 0
|
90
87
|
value >>= 3
|
91
|
-
while value > 31
|
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.
|
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: ->
|
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.
|
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.
|
66
|
+
IGMPv3.bind IGMPv3::MR, type: 0x22
|
66
67
|
end
|
67
68
|
end
|
data/lib/packetgen/header/ike.rb
CHANGED
@@ -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
|
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)
|
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
|
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.
|
222
|
-
UDP.
|
223
|
-
|
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
|
-
|
142
|
-
|
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'
|