Class: PacketGen::Header::IKE
- Inherits:
-
Base
- Object
- Types::Fields
- Base
- PacketGen::Header::IKE
- Defined in:
- lib/packetgen/header/ike.rb,
lib/packetgen/header/ike/id.rb,
lib/packetgen/header/ike/ke.rb,
lib/packetgen/header/ike/sa.rb,
lib/packetgen/header/ike/sk.rb,
lib/packetgen/header/ike/ts.rb,
lib/packetgen/header/ike/auth.rb,
lib/packetgen/header/ike/cert.rb,
lib/packetgen/header/ike/nonce.rb,
lib/packetgen/header/ike/notify.rb,
lib/packetgen/header/ike/certreq.rb,
lib/packetgen/header/ike/payload.rb,
lib/packetgen/header/ike/vendor_id.rb
Overview
IKE is the Internet Key Exchange protocol (RFC 7296). Ony IKEv2 is supported.
A IKE header consists of a header, and a set of payloads. This class handles IKE header. For payloads, see Payload.
IKE header
The format of a IKE header is shown below:
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IKE SA Initiator's SPI |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IKE SA Responder's SPI |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Payload | MjVer | MnVer | Exchange Type | Flags |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
A IKE header consists of:
-
a IKE SA initiator SPI (#init_spi, Types::Int64 type),
-
a IKE SA responder SPI (#resp_spi, Types::Int64 type),
-
a Next Payload field (#next, Types::Int8 type),
-
a Version field (#version, Types::Int8 type, with first 4-bit field as major number, and last 4-bit field as minor number),
-
a Exchange type (#exchange_type, Types::Int8 type),
-
a #flags field (Types::Int8 type),
-
a Message ID (#message_id, Types::Int32 type),
-
and a #length (Types::Int32 type).
Create a IKE header
Standalone
ike = PacketGen::Header::IKE.new
Classical IKE packet
pkt = PacketGen.gen('IP').add('UDP').add('IKE')
# access to IKE header
pkt.ike # => PacketGen::Header::IKE
NAT-T IKE packet
# NonESPMarker is used to insert a 32-bit null field between UDP header
# and IKE one to differentiate it from ESP-in-UDP (see RFC 3948)
pkt = PacketGen.gen('IP').add('UDP').add('NonESPMarker').add('IKE)
Defined Under Namespace
Classes: Attribute, Attributes, Auth, Cert, CertReq, IDi, IDr, KE, Nonce, Notify, Payload, SA, SAProposal, SAProposals, SK, TSi, TSr, TrafficSelector, TrafficSelectors, Transform, Transforms, VendorID
Constant Summary collapse
- UDP_PORT1 =
Classical well-known UDP port for IKE
500- UDP_PORT2 =
Well-known UDP port for IKE when NAT is detected
4500- PROTO_IKE =
1- PROTO_AH =
2- PROTO_ESP =
3- TYPE_IKE_SA_INIT =
34- TYPE_IKE_AUTH =
35- TYPE_CREATE_CHILD_SA =
36- TYPE_INFORMATIONAL =
37
Instance Attribute Summary collapse
-
#exchange_type ⇒ Integer
(also: #type)
8-bit exchange type.
-
#flag_i ⇒ Boolean
bit set in message sent by the original initiator.
-
#flag_r ⇒ Boolean
indicate this message is a response to a message containing the same Message ID.
-
#flag_v ⇒ Boolean
version flag.
-
#flags ⇒ Integer
8-bit flags.
-
#init_spi ⇒ Integer
64-bit initiator SPI.
-
#length ⇒ Integer
32-bit length of total message (header + payloads).
-
#message_id ⇒ Integer
32-bit message ID.
-
#mjver ⇒ Integer
4-bit major version value.
-
#mnver ⇒ Integer
4-bit minor version value.
-
#next ⇒ Integer
8-bit next payload type.
-
#resp_spi ⇒ Integer
64-bit responder SPI.
- #rsv1 ⇒ Integer
- #rsv2 ⇒ Integer
-
#version ⇒ Integer
8-bit IKE version.
Attributes inherited from Base
Instance Method Summary collapse
-
#calc_length ⇒ Integer
Calculate length field.
-
#human_exchange_type ⇒ String
(also: #human_type)
Get exchange type name.
-
#initialize(options = {}) ⇒ IKE
constructor
A new instance of IKE.
- #inspect ⇒ String
-
#payloads ⇒ Array<Payload>
IKE payloads.
Methods inherited from Base
bind_header, #header_id, inherited, #ip_header, known_headers, #method_name, #parse?, protocol_name, #protocol_name
Methods inherited from Types::Fields
#[], #[]=, #body=, define_bit_fields_on, define_field, define_field_after, define_field_before, delete_field, #fields, #force_binary, inherited, #is_optional?, #is_present?, #optional_fields, #read, #sz, #to_h, #to_s
Constructor Details
#initialize(options = {}) ⇒ IKE
Returns a new instance of IKE.
148 149 150 151 152 153 |
# File 'lib/packetgen/header/ike.rb', line 148 def initialize(={}) super calc_length unless [:length] self.type = [:type] if [:type] self.type = [:exchange_type] if [:exchange_type] end |
Instance Attribute Details
#exchange_type ⇒ Integer Also known as: type
8-bit exchange type
105 |
# File 'lib/packetgen/header/ike.rb', line 105 define_field :exchange_type, Types::Int8 |
#flag_i ⇒ Boolean
bit set in message sent by the original initiator
144 |
# File 'lib/packetgen/header/ike.rb', line 144 define_bit_fields_on :flags, :rsv1, 2, :flag_r, :flag_v, :flag_i, :rsv2, 3 |
#flag_r ⇒ Boolean
indicate this message is a response to a message containing the same Message ID
144 |
# File 'lib/packetgen/header/ike.rb', line 144 define_bit_fields_on :flags, :rsv1, 2, :flag_r, :flag_v, :flag_i, :rsv2, 3 |
#flag_v ⇒ Boolean
version flag. Ignored by IKEv2 peers, and should be set to 0
144 |
# File 'lib/packetgen/header/ike.rb', line 144 define_bit_fields_on :flags, :rsv1, 2, :flag_r, :flag_v, :flag_i, :rsv2, 3 |
#flags ⇒ Integer
8-bit flags
109 |
# File 'lib/packetgen/header/ike.rb', line 109 define_field :flags, Types::Int8 |
#init_spi ⇒ Integer
64-bit initiator SPI
89 |
# File 'lib/packetgen/header/ike.rb', line 89 define_field :init_spi, Types::Int64 |
#length ⇒ Integer
32-bit length of total message (header + payloads)
117 |
# File 'lib/packetgen/header/ike.rb', line 117 define_field :length, Types::Int32 |
#message_id ⇒ Integer
32-bit message ID
113 |
# File 'lib/packetgen/header/ike.rb', line 113 define_field :message_id, Types::Int32 |
#mjver ⇒ Integer
4-bit major version value
129 |
# File 'lib/packetgen/header/ike.rb', line 129 define_bit_fields_on :version, :mjver, 4, :mnver, 4 |
#mnver ⇒ Integer
4-bit minor version value
129 |
# File 'lib/packetgen/header/ike.rb', line 129 define_bit_fields_on :version, :mjver, 4, :mnver, 4 |
#next ⇒ Integer
8-bit next payload type
97 |
# File 'lib/packetgen/header/ike.rb', line 97 define_field :next, Types::Int8 |
#resp_spi ⇒ Integer
64-bit responder SPI
93 |
# File 'lib/packetgen/header/ike.rb', line 93 define_field :resp_spi, Types::Int64 |
#rsv1 ⇒ Integer
144 |
# File 'lib/packetgen/header/ike.rb', line 144 define_bit_fields_on :flags, :rsv1, 2, :flag_r, :flag_v, :flag_i, :rsv2, 3 |
#rsv2 ⇒ Integer
144 |
# File 'lib/packetgen/header/ike.rb', line 144 define_bit_fields_on :flags, :rsv1, 2, :flag_r, :flag_v, :flag_i, :rsv2, 3 |
Instance Method Details
#calc_length ⇒ Integer
Calculate length field
184 185 186 |
# File 'lib/packetgen/header/ike.rb', line 184 def calc_length self[:length].value = self.sz end |
#human_exchange_type ⇒ String Also known as: human_type
Get exchange type name
174 175 176 177 178 179 |
# File 'lib/packetgen/header/ike.rb', line 174 def human_exchange_type name = self.class.constants.grep(/TYPE_/). select { |c| self.class.const_get(c) == type }. first || "type #{type}" name.to_s.sub(/TYPE_/, '') end |
#inspect ⇒ String
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
# File 'lib/packetgen/header/ike.rb', line 201 def inspect str = Inspect.dashed_line(self.class, 2) to_h.each do |attr, value| next if attr == :body case attr when :flags str_flags = '' %w(r v i).each do |flag| str_flags << (send("flag_#{flag}?") ? flag.upcase : '.') end str << Inspect.shift_level(2) str << Inspect::FMT_ATTR % [value.class.to_s.sub(/.*::/, ''), attr, str_flags] when :exchange_type str << Inspect.shift_level(2) str << Inspect::FMT_ATTR % [value.class.to_s.sub(/.*::/, ''), attr, human_exchange_type] else str << Inspect.inspect_attribute(attr, value, 2) end end str end |