Class: PacketGen::Header::IKE

Inherits:
Base show all
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:

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)

Author:

  • Sylvain Daubert

Since:

  • 2.0.0

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

Since:

  • 2.0.0

500
UDP_PORT2 =

Well-known UDP port for IKE when NAT is detected

Since:

  • 2.0.0

4500
PROTO_IKE =

Since:

  • 2.0.0

1
PROTO_AH =

Since:

  • 2.0.0

2
PROTO_ESP =

Since:

  • 2.0.0

3
TYPE_IKE_SA_INIT =

Since:

  • 2.0.0

34
TYPE_IKE_AUTH =

Since:

  • 2.0.0

35
TYPE_CREATE_CHILD_SA =

Since:

  • 2.0.0

36
TYPE_INFORMATIONAL =

Since:

  • 2.0.0

37

Instance Attribute Summary collapse

Attributes inherited from Base

#packet

Instance Method Summary collapse

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.

Parameters:

  • options (Hash) (defaults to: {})

See Also:

Since:

  • 2.0.0



148
149
150
151
152
153
# File 'lib/packetgen/header/ike.rb', line 148

def initialize(options={})
  super
  calc_length unless options[:length]
  self.type = options[:type] if options[:type]
  self.type = options[:exchange_type] if options[:exchange_type]
end

Instance Attribute Details

#exchange_typeInteger Also known as: type

8-bit exchange type

Returns:

  • (Integer)


105
# File 'lib/packetgen/header/ike.rb', line 105

define_field :exchange_type, Types::Int8

#flag_iBoolean

bit set in message sent by the original initiator

Returns:

  • (Boolean)


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_rBoolean

indicate this message is a response to a message containing the same Message ID

Returns:

  • (Boolean)


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_vBoolean

version flag. Ignored by IKEv2 peers, and should be set to 0

Returns:

  • (Boolean)


144
# File 'lib/packetgen/header/ike.rb', line 144

define_bit_fields_on :flags, :rsv1, 2, :flag_r, :flag_v, :flag_i, :rsv2, 3

#flagsInteger

8-bit flags

Returns:

  • (Integer)


109
# File 'lib/packetgen/header/ike.rb', line 109

define_field :flags, Types::Int8

#init_spiInteger

64-bit initiator SPI

Returns:

  • (Integer)


89
# File 'lib/packetgen/header/ike.rb', line 89

define_field :init_spi, Types::Int64

#lengthInteger

32-bit length of total message (header + payloads)

Returns:

  • (Integer)


117
# File 'lib/packetgen/header/ike.rb', line 117

define_field :length, Types::Int32

#message_idInteger

32-bit message ID

Returns:

  • (Integer)


113
# File 'lib/packetgen/header/ike.rb', line 113

define_field :message_id, Types::Int32

#mjverInteger

4-bit major version value

Returns:

  • (Integer)


129
# File 'lib/packetgen/header/ike.rb', line 129

define_bit_fields_on :version, :mjver, 4, :mnver, 4

#mnverInteger

4-bit minor version value

Returns:

  • (Integer)


129
# File 'lib/packetgen/header/ike.rb', line 129

define_bit_fields_on :version, :mjver, 4, :mnver, 4

#nextInteger

8-bit next payload type

Returns:

  • (Integer)


97
# File 'lib/packetgen/header/ike.rb', line 97

define_field :next, Types::Int8

#resp_spiInteger

64-bit responder SPI

Returns:

  • (Integer)


93
# File 'lib/packetgen/header/ike.rb', line 93

define_field :resp_spi, Types::Int64

#rsv1Integer

Returns:

  • (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

#rsv2Integer

Returns:

  • (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

#versionInteger

8-bit IKE version

Returns:

  • (Integer)


101
# File 'lib/packetgen/header/ike.rb', line 101

define_field :version, Types::Int8, default: 0x20

Instance Method Details

#calc_lengthInteger

Calculate length field

Returns:

  • (Integer)

Since:

  • 2.0.0



184
185
186
# File 'lib/packetgen/header/ike.rb', line 184

def calc_length
  self[:length].value = self.sz
end

#human_exchange_typeString Also known as: human_type

Get exchange type name

Returns:

  • (String)

    String

Since:

  • 2.0.0



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

#inspectString

Returns:

  • (String)

Since:

  • 2.0.0



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

#payloadsArray<Payload>

IKE payloads

Returns:

Since:

  • 2.0.0



190
191
192
193
194
195
196
197
198
# File 'lib/packetgen/header/ike.rb', line 190

def payloads
  payloads = []
  body = self.body
  while body.is_a?(Payload) do
    payloads << body
    body = body.body
  end
  payloads
end