packetgen-plugin-ipsec 1.0.2 → 1.1.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.
@@ -1,241 +1,237 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of IPsec packetgen plugin.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-ipsec for more informations
3
5
  # Copyright (c) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
- module PacketGen
9
- module Plugin
10
- # This class handles a pseudo-Plugin used to differentiate ESP from IKE Plugins
11
- # in a UDP datagram with port 4500.
12
- # @author Sylvain Daubert
13
- class NonESPMarker < PacketGen::Header::Base
14
- # @!attribute non_esp_marker
15
- # 32-bit zero marker to differentiate IKE packet over UDP port 4500 from ESP ones
16
- # @return [Integer]
17
- define_field :non_esp_marker, PacketGen::Types::Int32, default: 0
18
- # @!attribute body
19
- # @return [PacketGen::Types::String,PacketGen::Header::Base]
20
- define_field :body, PacketGen::Types::String
21
-
22
- # Check non_esp_marker field
23
- # @see [PacketGen::Header::Base#parse?]
24
- def parse?
25
- non_esp_marker.zero?
26
- end
8
+ module PacketGen::Plugin
9
+ # This class handles a pseudo-Plugin used to differentiate ESP from IKE Plugins
10
+ # in a UDP datagram with port 4500.
11
+ # @author Sylvain Daubert
12
+ class NonESPMarker < PacketGen::Header::Base
13
+ # @!attribute non_esp_marker
14
+ # 32-bit zero marker to differentiate IKE packet over UDP port 4500 from ESP ones
15
+ # @return [Integer]
16
+ define_attr :non_esp_marker, BinStruct::Int32, default: 0
17
+ # @!attribute body
18
+ # @return [BinStruct::String,PacketGen::Header::Base]
19
+ define_attr :body, BinStruct::String
20
+
21
+ # Check non_esp_marker field
22
+ # @see [PacketGen::Header::Base#parse?]
23
+ def parse?
24
+ non_esp_marker.zero?
27
25
  end
26
+ end
28
27
 
29
- # IKE is the Internet Key Exchange protocol (RFC 7296). Ony IKEv2 is supported.
30
- #
31
- # A IKE Plugin consists of a Plugin, and a set of payloads. This class
32
- # handles IKE Plugin. For payloads, see {IKE::Payload}.
33
- #
34
- # == IKE Plugin
35
- # The format of a IKE Plugin is shown below:
36
- # 1 2 3
37
- # 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
38
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39
- # | IKE SA Initiator's SPI |
40
- # | |
41
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42
- # | IKE SA Responder's SPI |
43
- # | |
44
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45
- # | Next Payload | MjVer | MnVer | Exchange Type | Flags |
46
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
47
- # | Message ID |
48
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49
- # | Length |
50
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51
- # A IKE Plugin consists of:
52
- # * a IKE SA initiator SPI ({#init_spi}, {PacketGen::Types::Int64} type),
53
- # * a IKE SA responder SPI ({#resp_spi}, {PacketGen::Types::Int64} type),
54
- # * a Next Payload field ({#next}, {PacketGen::Types::Int8} type),
55
- # * a Version field ({#version}, {PacketGen::Types::Int8} type, with first 4-bit field
56
- # as major number, and last 4-bit field as minor number),
57
- # * a Exchange type ({#exchange_type}, {PacketGen::Types::Int8} type),
58
- # * a {#flags} field ({PacketGen::Types::Int8} type),
59
- # * a Message ID ({#message_id}, {PacketGen::Types::Int32} type),
60
- # * and a {#length} ({PacketGen::Types::Int32} type).
61
- #
62
- # == Create a IKE Plugin
63
- # === Standalone
64
- # ike = PacketGen::Plugin::IKE.new
65
- # === Classical IKE packet
66
- # pkt = PacketGen.gen('IP').add('UDP').add('IKE')
67
- # # access to IKE Plugin
68
- # pkt.ike # => PacketGen::Plugin::IKE
69
- # === NAT-T IKE packet
70
- # # NonESPMarker is used to insert a 32-bit null field between UDP Plugin
71
- # # and IKE one to differentiate it from ESP-in-UDP (see RFC 3948)
72
- # pkt = PacketGen.gen('IP').add('UDP').add('NonESPMarker').add('IKE)
73
- # @author Sylvain Daubert
74
- class IKE < PacketGen::Header::Base
75
- # Classical well-known UDP port for IKE
76
- UDP_PORT1 = 500
77
- # Well-known UDP port for IKE when NAT is detected
78
- UDP_PORT2 = 4500
79
-
80
- PROTOCOLS = {
81
- 'IKE' => 1,
82
- 'AH' => 2,
83
- 'ESP' => 3
84
- }.freeze
85
-
86
- EXCHANGE_TYPES = {
87
- 'IKE_SA_INIT' => 34,
88
- 'IKE_AUTH' => 35,
89
- 'CREATE_CHILD_SA' => 36,
90
- 'INFORMATIONAL' => 37
91
- }.freeze
92
-
93
- # @!attribute init_spi
94
- # 64-bit initiator SPI
95
- # @return [Integer]
96
- define_field :init_spi, PacketGen::Types::Int64
97
- # @!attribute resp_spi
98
- # 64-bit responder SPI
99
- # @return [Integer]
100
- define_field :resp_spi, PacketGen::Types::Int64
101
- # @!attribute next
102
- # 8-bit next payload type
103
- # @return [Integer]
104
- define_field :next, PacketGen::Types::Int8
105
- # @!attribute version
106
- # 8-bit IKE version
107
- # @return [Integer]
108
- define_field :version, PacketGen::Types::Int8, default: 0x20
109
- # @!attribute [r] exchange_type
110
- # 8-bit exchange type
111
- # @return [Integer]
112
- define_field :exchange_type, PacketGen::Types::Int8Enum, enum: EXCHANGE_TYPES
113
- # @!attribute flags
114
- # 8-bit flags
115
- # @return [Integer]
116
- define_field :flags, PacketGen::Types::Int8
117
- # @!attribute message_id
118
- # 32-bit message ID
119
- # @return [Integer]
120
- define_field :message_id, PacketGen::Types::Int32
121
- # @!attribute length
122
- # 32-bit length of total message (Plugin + payloads)
123
- # @return [Integer]
124
- define_field :length, PacketGen::Types::Int32
125
-
126
- # Defining a body permits using Packet#parse to parse IKE payloads.
127
- # But this method is hidden as prefered way to access payloads is via #payloads
128
- define_field :body, PacketGen::Types::String
129
-
130
- # @!attribute mjver
131
- # 4-bit major version value
132
- # @return [Integer]
133
- # @!attribute mnver
134
- # 4-bit minor version value
135
- # @return [Integer]
136
- define_bit_fields_on :version, :mjver, 4, :mnver, 4
137
-
138
- # @!attribute rsv1
139
- # @return [Integer]
140
- # @!attribute rsv2
141
- # @return [Integer]
142
- # @!attribute flag_i
143
- # bit set in message sent by the original initiator
144
- # @return [Boolean]
145
- # @!attribute flag_r
146
- # indicate this message is a response to a message containing the same Message ID
147
- # @return [Boolean]
148
- # @!attribute flag_v
149
- # version flag. Ignored by IKEv2 peers, and should be set to 0
150
- # @return [Boolean]
151
- define_bit_fields_on :flags, :rsv1, 2, :flag_r, :flag_v, :flag_i, :rsv2, 3
152
-
153
- # @param [Hash] options
154
- # @see PacketGen::Header::Base#initialize
155
- def initialize(options={})
156
- super
157
- calc_length unless options[:length]
158
- self.type = options[:type] if options[:type]
159
- self.type = options[:exchange_type] if options[:exchange_type]
160
- end
28
+ # IKE is the Internet Key Exchange protocol (RFC 7296). Ony IKEv2 is supported.
29
+ #
30
+ # A IKE Plugin consists of a Plugin, and a set of payloads. This class
31
+ # handles IKE Plugin. For payloads, see {IKE::Payload}.
32
+ #
33
+ # == IKE Plugin
34
+ # The format of a IKE Plugin is shown below:
35
+ # 1 2 3
36
+ # 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
37
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38
+ # | IKE SA Initiator's SPI |
39
+ # | |
40
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41
+ # | IKE SA Responder's SPI |
42
+ # | |
43
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44
+ # | Next Payload | MjVer | MnVer | Exchange Type | Flags |
45
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46
+ # | Message ID |
47
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48
+ # | Length |
49
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50
+ # A IKE Plugin consists of:
51
+ # * a IKE SA initiator SPI ({#init_spi}, {BinStruct::Int64} type),
52
+ # * a IKE SA responder SPI ({#resp_spi}, {BinStruct::Int64} type),
53
+ # * a Next Payload field ({#next}, {BinStruct::Int8} type),
54
+ # * a Version field ({#version}, {BinStruct::Int8} type, with first 4-bit field
55
+ # as major number, and last 4-bit field as minor number),
56
+ # * a Exchange type ({#exchange_type}, {BinStruct::Int8} type),
57
+ # * a {#flags} field ({BinStruct::Int8} type),
58
+ # * a Message ID ({#message_id}, {BinStruct::Int32} type),
59
+ # * and a {#length} ({BinStruct::Int32} type).
60
+ #
61
+ # == Create a IKE Plugin
62
+ # === Standalone
63
+ # ike = PacketGen::Plugin::IKE.new
64
+ # === Classical IKE packet
65
+ # pkt = PacketGen.gen('IP').add('UDP').add('IKE')
66
+ # # access to IKE Plugin
67
+ # pkt.ike # => PacketGen::Plugin::IKE
68
+ # === NAT-T IKE packet
69
+ # # NonESPMarker is used to insert a 32-bit null field between UDP Plugin
70
+ # # and IKE one to differentiate it from ESP-in-UDP (see RFC 3948)
71
+ # pkt = PacketGen.gen('IP').add('UDP').add('NonESPMarker').add('IKE)
72
+ # @author Sylvain Daubert
73
+ class IKE < PacketGen::Header::Base
74
+ # Classical well-known UDP port for IKE
75
+ UDP_PORT1 = 500
76
+ # Well-known UDP port for IKE when NAT is detected
77
+ UDP_PORT2 = 4500
78
+
79
+ # Protocols supported by IKE
80
+ PROTOCOLS = {
81
+ 'IKE' => 1,
82
+ 'AH' => 2,
83
+ 'ESP' => 3
84
+ }.freeze
85
+
86
+ # Known echange types
87
+ EXCHANGE_TYPES = {
88
+ 'IKE_SA_INIT' => 34,
89
+ 'IKE_AUTH' => 35,
90
+ 'CREATE_CHILD_SA' => 36,
91
+ 'INFORMATIONAL' => 37
92
+ }.freeze
93
+
94
+ # @!attribute init_spi
95
+ # 64-bit initiator SPI
96
+ # @return [Integer]
97
+ define_attr :init_spi, BinStruct::Int64
98
+ # @!attribute resp_spi
99
+ # 64-bit responder SPI
100
+ # @return [Integer]
101
+ define_attr :resp_spi, BinStruct::Int64
102
+ # @!attribute next
103
+ # 8-bit next payload type
104
+ # @return [Integer]
105
+ define_attr :next, BinStruct::Int8
106
+ # @!attribute version
107
+ # 8-bit IKE version
108
+ # @return [Integer]
109
+ # @!attribute mjver
110
+ # 4-bit major version value ({#version}'s 4 most significant bits)
111
+ # @return [Integer]
112
+ # @!attribute mnver
113
+ # 4-bit minor version value ({#version}'s 4 least significant bits)
114
+ # @return [Integer]
115
+ define_bit_attr :version, default: 0x20, mjver: 4, mver: 4
116
+ # @!attribute [r] exchange_type
117
+ # 8-bit exchange type
118
+ # @return [Integer]
119
+ define_attr :exchange_type, BinStruct::Int8Enum, enum: EXCHANGE_TYPES
120
+ # @!attribute flags. See {#flag_r}, {#flag_v} and {#flag_i}.
121
+ # 8-bit flags
122
+ # @return [Integer]
123
+ # @!attribute rsv1
124
+ # @return [Integer]
125
+ # @!attribute rsv2
126
+ # @return [Integer]
127
+ # @!attribute flag_i
128
+ # bit set in message sent by the original initiator
129
+ # @return [Boolean]
130
+ # @!attribute flag_r
131
+ # indicate this message is a response to a message containing the same Message ID
132
+ # @return [Boolean]
133
+ # @!attribute flag_v
134
+ # version flag. Ignored by IKEv2 peers, and should be set to 0
135
+ # @return [Boolean]
136
+ define_bit_attr :flags, rsv1: 2, flag_r: 1, flag_v: 1, flag_i: 1, rsv2: 3
137
+ # @!attribute message_id
138
+ # 32-bit message ID
139
+ # @return [Integer]
140
+ define_attr :message_id, BinStruct::Int32
141
+ # @!attribute length
142
+ # 32-bit length of total message (Plugin + payloads)
143
+ # @return [Integer]
144
+ define_attr :length, BinStruct::Int32
145
+
146
+ # Defining a body permits using Packet#parse to parse IKE payloads.
147
+ # But this method is hidden as prefered way to access payloads is via #payloads
148
+ define_attr :body, BinStruct::String
149
+
150
+ # @param [Hash] options
151
+ # @see PacketGen::Header::Base#initialize
152
+ def initialize(options={})
153
+ super
154
+ calc_length unless options[:length]
155
+ self.type = options[:type] if options[:type]
156
+ self.type = options[:exchange_type] if options[:exchange_type]
157
+ end
161
158
 
162
- alias type exchange_type
163
- alias type= exchange_type=
159
+ alias type exchange_type
160
+ alias type= exchange_type=
164
161
 
165
- # Get exchange type name
166
- # @return [String
167
- def human_exchange_type
168
- self[:exchange_type].to_human
169
- end
170
- alias human_type human_exchange_type
162
+ # Get exchange type name
163
+ # @return [String
164
+ def human_exchange_type
165
+ self[:exchange_type].to_human
166
+ end
167
+ alias human_type human_exchange_type
171
168
 
172
- # Calculate length field
173
- # @return [Integer]
174
- def calc_length
175
- PacketGen::Header::Base.calculate_and_set_length self
176
- end
169
+ # Calculate length field
170
+ # @return [Integer]
171
+ def calc_length
172
+ PacketGen::Header::Base.calculate_and_set_length self
173
+ end
177
174
 
178
- # IKE payloads
179
- # @return [Array<Payload>]
180
- def payloads
181
- payloads = []
182
- body = self.body
183
- while body.is_a?(Payload)
184
- payloads << body
185
- body = body.body
186
- end
187
- payloads
175
+ # IKE payloads
176
+ # @return [Array<Payload>]
177
+ def payloads
178
+ payloads = []
179
+ body = self.body
180
+ while body.is_a?(Payload)
181
+ payloads << body
182
+ body = body.body
188
183
  end
184
+ payloads
185
+ end
189
186
 
190
- # @return [String]
191
- def inspect
192
- super do |attr|
193
- case attr
194
- when :flags
195
- str_flags = ''.dup
196
- %w[r v i].each do |flag|
197
- str_flags << (send("flag_#{flag}?") ? flag.upcase : '.')
198
- end
199
- str = Inspect.shift_level
200
- str << Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''), attr,
201
- str_flags]
187
+ # @return [String]
188
+ def inspect
189
+ super do |attr|
190
+ case attr
191
+ when :flags
192
+ str_flags = +''
193
+ %w[r v i].each do |flag|
194
+ str_flags << (send("flag_#{flag}?") ? flag.upcase : '.')
202
195
  end
196
+ str = PacketGen::Inspect.shift_level
197
+ str << (PacketGen::Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''), attr, str_flags])
203
198
  end
204
199
  end
200
+ end
205
201
 
206
- # Toggle +I+ and +R+ flags.
207
- # @return [self]
208
- def reply!
209
- self.flag_r = !self.flag_r?
210
- self.flag_i = !self.flag_i?
211
- self
212
- end
202
+ # Toggle +I+ and +R+ flags.
203
+ # @return [self]
204
+ def reply!
205
+ self.flag_r = !self.flag_r?
206
+ self.flag_i = !self.flag_i?
207
+ self
208
+ end
213
209
 
214
- # @api private
215
- # @note This method is used internally by PacketGen and should not be
216
- # directly called
217
- # @param [Packet] packet
218
- # @return [void]
219
- def added_to_packet(packet)
220
- return unless packet.is? 'UDP'
221
- return unless packet.udp.sport.zero?
222
- packet.udp.sport = if packet.is?('NonESPMarker')
223
- UDP_PORT2
224
- else
225
- UDP_PORT1
226
- end
227
- end
210
+ # @api private
211
+ # @note This method is used internally by PacketGen and should not be
212
+ # directly called
213
+ # @param [Packet] packet
214
+ # @return [void]
215
+ def added_to_packet(packet)
216
+ return unless packet.is? 'UDP'
217
+ return unless packet.udp.sport.zero?
218
+
219
+ packet.udp.sport = if packet.is?('NonESPMarker')
220
+ UDP_PORT2
221
+ else
222
+ UDP_PORT1
223
+ end
228
224
  end
225
+ end
229
226
 
230
- Header.add_class IKE
231
- Header.add_class NonESPMarker
227
+ PacketGen::Header.add_class IKE
228
+ PacketGen::Header.add_class NonESPMarker
232
229
 
233
- PacketGen::Header::UDP.bind IKE, dport: IKE::UDP_PORT1
234
- PacketGen::Header::UDP.bind IKE, sport: IKE::UDP_PORT1
235
- PacketGen::Header::UDP.bind NonESPMarker, dport: IKE::UDP_PORT2
236
- PacketGen::Header::UDP.bind NonESPMarker, sport: IKE::UDP_PORT2
237
- NonESPMarker.bind IKE
238
- end
230
+ PacketGen::Header::UDP.bind IKE, dport: IKE::UDP_PORT1
231
+ PacketGen::Header::UDP.bind IKE, sport: IKE::UDP_PORT1
232
+ PacketGen::Header::UDP.bind NonESPMarker, dport: IKE::UDP_PORT2
233
+ PacketGen::Header::UDP.bind NonESPMarker, sport: IKE::UDP_PORT2
234
+ NonESPMarker.bind IKE
239
235
  end
240
236
 
241
237
  require_relative 'ike/payload'
@@ -1,6 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file is part of IPsec packetgen plugin.
4
+ # See https://github.com/sdaubert/packetgen-plugin-ipsec for more informations
5
+ # Copyright (c) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # This program is published under MIT license.
7
+
1
8
  module PacketGen
2
9
  module Plugin
3
10
  # Version of ipsec plugin
4
- IPSEC_VERSION = '1.0.2'
11
+ IPSEC_VERSION = '1.1.0'
5
12
  end
6
13
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'packetgen'
2
4
  require_relative 'packetgen/plugin/ipsec_version'
3
5
  require_relative 'packetgen/plugin/esp'
@@ -1,4 +1,6 @@
1
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'packetgen/plugin/ipsec_version'
4
6
 
@@ -8,8 +10,7 @@ Gem::Specification.new do |spec|
8
10
  spec.authors = ['Sylvain Daubert']
9
11
  spec.email = ['sylvain.daubert@laposte.net']
10
12
 
11
- spec.summary = %q{IPsec plugin for packetgen.}
12
- #spec.description = %q{TODO: Write a longer description or delete this line.}
13
+ spec.summary = 'IPsec plugin for packetgen.'
13
14
  spec.homepage = 'https://github.com/sdaubert/packetgen-plugin-ipsec'
14
15
 
15
16
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -17,13 +18,7 @@ Gem::Specification.new do |spec|
17
18
  end
18
19
  spec.require_paths = ['lib']
19
20
 
20
- spec.required_ruby_version = '>= 2.3.0'
21
-
22
- spec.add_dependency 'packetgen', '~>3.0'
21
+ spec.required_ruby_version = '>= 3.0.0'
23
22
 
24
- spec.add_development_dependency 'bundler', '>= 1.17', '< 3'
25
- spec.add_development_dependency 'rake', '~> 10.0'
26
- spec.add_development_dependency 'rspec', '~> 3.7'
27
- spec.add_development_dependency 'simplecov', '~> 0.16'
28
- spec.add_development_dependency 'yard', '~> 0.9'
23
+ spec.add_dependency 'packetgen', '~>4.0'
29
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packetgen-plugin-ipsec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
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: 2019-09-19 00:00:00.000000000 Z
11
+ date: 2025-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: packetgen
@@ -16,100 +16,24 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '4.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '1.17'
34
- - - "<"
35
- - !ruby/object:Gem::Version
36
- version: '3'
37
- type: :development
38
- prerelease: false
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: '1.17'
44
- - - "<"
45
- - !ruby/object:Gem::Version
46
- version: '3'
47
- - !ruby/object:Gem::Dependency
48
- name: rake
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '10.0'
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: '10.0'
61
- - !ruby/object:Gem::Dependency
62
- name: rspec
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '3.7'
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '3.7'
75
- - !ruby/object:Gem::Dependency
76
- name: simplecov
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '0.16'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '0.16'
89
- - !ruby/object:Gem::Dependency
90
- name: yard
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '0.9'
96
- type: :development
97
- prerelease: false
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '0.9'
103
- description:
26
+ version: '4.0'
27
+ description:
104
28
  email:
105
29
  - sylvain.daubert@laposte.net
106
30
  executables: []
107
31
  extensions: []
108
32
  extra_rdoc_files: []
109
33
  files:
34
+ - ".github/workflows/specs.yml"
110
35
  - ".gitignore"
111
36
  - ".rubocop.yml"
112
- - ".travis.yml"
113
37
  - Gemfile
114
38
  - LICENSE
115
39
  - README.md
@@ -135,7 +59,7 @@ files:
135
59
  homepage: https://github.com/sdaubert/packetgen-plugin-ipsec
136
60
  licenses: []
137
61
  metadata: {}
138
- post_install_message:
62
+ post_install_message:
139
63
  rdoc_options: []
140
64
  require_paths:
141
65
  - lib
@@ -143,16 +67,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
67
  requirements:
144
68
  - - ">="
145
69
  - !ruby/object:Gem::Version
146
- version: 2.3.0
70
+ version: 3.0.0
147
71
  required_rubygems_version: !ruby/object:Gem::Requirement
148
72
  requirements:
149
73
  - - ">="
150
74
  - !ruby/object:Gem::Version
151
75
  version: '0'
152
76
  requirements: []
153
- rubyforge_project:
154
- rubygems_version: 2.7.6.2
155
- signing_key:
77
+ rubygems_version: 3.3.15
78
+ signing_key:
156
79
  specification_version: 4
157
80
  summary: IPsec plugin for packetgen.
158
81
  test_files: []