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.
- checksums.yaml +4 -4
- data/.github/workflows/specs.yml +32 -0
- data/.rubocop.yml +28 -3
- data/Gemfile +18 -0
- data/README.md +12 -6
- data/Rakefile +10 -4
- data/lib/packetgen/plugin/crypto.rb +38 -4
- data/lib/packetgen/plugin/esp.rb +410 -378
- data/lib/packetgen/plugin/ike/auth.rb +153 -140
- data/lib/packetgen/plugin/ike/cert.rb +61 -62
- data/lib/packetgen/plugin/ike/certreq.rb +51 -52
- data/lib/packetgen/plugin/ike/id.rb +80 -81
- data/lib/packetgen/plugin/ike/ke.rb +64 -65
- data/lib/packetgen/plugin/ike/nonce.rb +29 -31
- data/lib/packetgen/plugin/ike/notify.rb +134 -139
- data/lib/packetgen/plugin/ike/payload.rb +75 -76
- data/lib/packetgen/plugin/ike/sa.rb +515 -452
- data/lib/packetgen/plugin/ike/sk.rb +221 -221
- data/lib/packetgen/plugin/ike/ts.rb +226 -223
- data/lib/packetgen/plugin/ike/vendor_id.rb +28 -30
- data/lib/packetgen/plugin/ike.rb +213 -217
- data/lib/packetgen/plugin/ipsec_version.rb +8 -1
- data/lib/packetgen-plugin-ipsec.rb +2 -0
- data/packetgen-plugin-ipsec.gemspec +6 -11
- metadata +11 -88
- data/.travis.yml +0 -14
data/lib/packetgen/plugin/ike.rb
CHANGED
@@ -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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
#
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
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
|
-
|
163
|
-
|
159
|
+
alias type exchange_type
|
160
|
+
alias type= exchange_type=
|
164
161
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
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
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
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
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
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
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
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
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
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
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
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
|
-
|
231
|
-
|
227
|
+
PacketGen::Header.add_class IKE
|
228
|
+
PacketGen::Header.add_class NonESPMarker
|
232
229
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
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
|
11
|
+
IPSEC_VERSION = '1.1.0'
|
5
12
|
end
|
6
13
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
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 =
|
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 = '>=
|
21
|
-
|
22
|
-
spec.add_dependency 'packetgen', '~>3.0'
|
21
|
+
spec.required_ruby_version = '>= 3.0.0'
|
23
22
|
|
24
|
-
spec.
|
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
|
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:
|
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: '
|
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: '
|
27
|
-
|
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:
|
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
|
-
|
154
|
-
|
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: []
|