rex-socket 0.1.26 → 0.1.30

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b0bf99960d66db7491db5490f75d4c87a8bfde429dcc76a4e4e1d07306cf61b8
4
- data.tar.gz: 7e665ba1dba7574c1fa7adb9523b9e8781daff17185daef8300cc0d1f5cd8d0b
3
+ metadata.gz: 647d60dcc0fb176246243a7eaed1ca68a35c596c7034cf4de863ca233d08d9f0
4
+ data.tar.gz: 80fcd4c8fe671a6da97a5e262700331dfa5fe0292c679952b510abdc7af13cfa
5
5
  SHA512:
6
- metadata.gz: a15da2ba7b185bf822db6f467fde6ae641008861f2758c865b9c66b524904dffd02add948e18cb544105747aaf8ce5f90f3083c8eaa18ac84284917ff29fe9cf
7
- data.tar.gz: c6585bddb9cc7b52f29f3d9f193200132801fbb141162550f9d6a9553af51a853a3946c3c42fca55dbaed217a88cd68372066db5d76a8bcbc356a780c6bde61a
6
+ metadata.gz: a5c001e83da2f988ff40eefcd5175bdf0684b22c5529820be68c9eda4b6d862a6f88bbd39a950941a30bcccc5b9a21479a44982e56a4e351b353c0ce480bc9a9
7
+ data.tar.gz: bdc211d907a45d1a0701fbc34721712fec81dea7e9417d1b3e94259916e13779a1e91e1742fd2b9526aaf4c8839c62373e58183c3ac7ad7dea64c3b8fd5d093d
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/lib/rex/socket.rb CHANGED
@@ -14,6 +14,8 @@ module Rex
14
14
  ###
15
15
  module Socket
16
16
 
17
+ LogSource = 'rex-socket'
18
+
17
19
  module Comm
18
20
  end
19
21
 
@@ -745,7 +747,7 @@ module Socket
745
747
  peer_name = Socket.from_sockaddr(self.getpeername)
746
748
  rescue ::Errno::EINVAL => e
747
749
  # Ruby's getpeername method may call rb_sys_fail("getpeername(2)")
748
- elog("#{e.message} (#{e.class})#{e.backtrace * "\n"}\n", 'core', LEV_3)
750
+ elog("#{e.message} (#{e.class})#{e.backtrace * "\n"}\n", LogSource, LEV_3)
749
751
  end
750
752
 
751
753
  return peer_name
@@ -110,10 +110,7 @@ class Rex::Socket::Parameters
110
110
  self.sslctx = hash['SSLContext']
111
111
  end
112
112
 
113
- supported_ssl_versions = ['Auto', 'SSL2', 'SSL23', 'TLS1', 'SSL3', :Auto, :SSLv2, :SSLv3, :SSLv23, :TLSv1]
114
- if (hash['SSLVersion'] and supported_ssl_versions.include? hash['SSLVersion'])
115
- self.ssl_version = hash['SSLVersion']
116
- end
113
+ self.ssl_version = hash.fetch('SSLVersion', nil)
117
114
 
118
115
  supported_ssl_verifiers = %W{CLIENT_ONCE FAIL_IF_NO_PEER_CERT NONE PEER}
119
116
  if (hash['SSLVerifyMode'] and supported_ssl_verifiers.include? hash['SSLVerifyMode'])
@@ -383,7 +380,27 @@ class Rex::Socket::Parameters
383
380
 
384
381
  # What version of SSL to use (Auto, SSL2, SSL3, SSL23, TLS1)
385
382
  # @return [String,Symbol]
386
- attr_accessor :ssl_version
383
+ attr_reader :ssl_version
384
+ def ssl_version=(version)
385
+ # Let the caller specify a particular SSL/TLS version
386
+ case version
387
+ when 'SSL2'
388
+ version = :SSLv2
389
+ # 'TLS' will be the new name for autonegotation with newer versions of OpenSSL
390
+ when 'SSL23', 'TLS', 'Auto'
391
+ version = :SSLv23
392
+ when 'SSL3'
393
+ version = :SSLv3
394
+ when 'TLS1','TLS1.0'
395
+ version = :TLSv1
396
+ when 'TLS1.1'
397
+ version = :TLSv1_1
398
+ when 'TLS1.2'
399
+ version = :TLSv1_2
400
+ end
401
+
402
+ @ssl_version = version
403
+ end
387
404
 
388
405
  # What specific SSL Cipher(s) to use, may be a string containing the cipher
389
406
  # name or an array of strings containing cipher names e.g.
@@ -23,6 +23,9 @@ module Socket
23
23
  ###
24
24
  class RangeWalker
25
25
 
26
+ MATCH_IPV4_RANGE = /^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})-([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/
27
+ private_constant :MATCH_IPV4_RANGE
28
+
26
29
  # The total number of IPs within the range
27
30
  #
28
31
  # @return [Fixnum]
@@ -74,108 +77,37 @@ class RangeWalker
74
77
  # @return [self]
75
78
  # @return [false] if +parseme+ cannot be parsed
76
79
  def parse(parseme)
77
- return nil if not parseme
80
+ return nil unless parseme
81
+
78
82
  ranges = []
79
83
  parseme.split(', ').map{ |a| a.split(' ') }.flatten.each do |arg|
80
- opts = {}
81
84
 
82
85
  # Handle IPv6 CIDR first
83
86
  if arg.include?(':') && arg.include?('/')
84
- return false if !valid_cidr_chars?(arg)
85
-
86
- ip_part, mask_part = arg.split("/")
87
- return false unless (0..128).include? mask_part.to_i
87
+ next if (new_ranges = parse_ipv6_cidr(arg)).nil?
88
88
 
89
- addr, scope_id = ip_part.split('%')
90
- return false unless Rex::Socket.is_ipv6?(addr)
91
-
92
- range = expand_cidr(addr + '/' + mask_part)
93
- range.options[:scope_id] = scope_id if scope_id
94
- ranges.push(range)
95
89
  # Handle plain IPv6 next (support ranges, but not CIDR)
96
90
  elsif arg.include?(':')
97
- addrs = arg.split('-', 2)
98
-
99
- # Handle a single address
100
- if addrs.length == 1
101
- addr, scope_id = addrs[0].split('%')
102
- opts[:scope_id] = scope_id if scope_id
103
- opts[:ipv6] = true
104
-
105
- return false unless Rex::Socket.is_ipv6?(addr)
106
- addr = Rex::Socket.addr_atoi(addr)
107
- ranges.push(Range.new(addr, addr, opts))
108
- next
109
- end
110
-
111
- addr1, scope_id = addrs[0].split('%')
112
- opts[:scope_id] = scope_id if scope_id
113
- opts[:ipv6] = true
114
-
115
- addr2, scope_id = addrs[1].split('%')
116
- ( opts[:scope_id] ||= scope_id ) if scope_id
117
-
118
- # Both have to be IPv6 for this to work
119
- return false unless (Rex::Socket.is_ipv6?(addr1) && Rex::Socket.is_ipv6?(addr2))
120
-
121
- # Handle IPv6 ranges in the form of 2001::1-2001::10
122
- addr1 = Rex::Socket.addr_atoi(addr1)
123
- addr2 = Rex::Socket.addr_atoi(addr2)
124
-
125
- ranges.push(Range.new(addr1, addr2, opts))
126
- next
91
+ next if (new_ranges = parse_ipv6(arg)).nil?
127
92
 
128
93
  # Handle IPv4 CIDR
129
94
  elsif arg.include?("/")
130
- # Then it's CIDR notation and needs special case
131
- return false if !valid_cidr_chars?(arg)
132
- ip_part, mask_part = arg.split("/")
133
- return false unless (0..32).include? mask_part.to_i
134
- if ip_part =~ /^\d{1,3}(\.\d{1,3}){1,3}$/
135
- return false unless ip_part =~ Rex::Socket::MATCH_IPV4
136
- end
137
- begin
138
- Rex::Socket.getaddress(ip_part) # This allows for "www.metasploit.com/24" which is fun.
139
- rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
140
- return false # Can't resolve the ip_part, so bail.
141
- end
142
-
143
- expanded = expand_cidr(arg)
144
- if expanded
145
- ranges.push(expanded)
146
- else
147
- return false
148
- end
95
+ next if (new_ranges = parse_ipv4_cidr(arg)).nil?
149
96
 
150
97
  # Handle hostnames
151
98
  elsif arg =~ /[^-0-9,.*]/
152
- # Then it's a domain name and we should send it on to addr_atoi
153
- # unmolested to force a DNS lookup.
154
- begin
155
- ranges += Rex::Socket.addr_atoi_list(arg).map { |a| Range.new(a, a, opts) }
156
- rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
157
- return false
158
- end
99
+ next if (new_ranges = parse_hostname(arg)).nil?
159
100
 
160
101
  # Handle IPv4 ranges
161
- elsif arg =~ /^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})-([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/
162
-
102
+ elsif arg =~ MATCH_IPV4_RANGE
163
103
  # Then it's in the format of 1.2.3.4-5.6.7.8
164
- # Note, this will /not/ deal with DNS names, or the fancy/obscure 10...1-10...2
165
- begin
166
- start, stop = Rex::Socket.addr_atoi($1), Rex::Socket.addr_atoi($2)
167
- return false if start > stop # The end is greater than the beginning.
168
- ranges.push(Range.new(start, stop, opts))
169
- rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
170
- return false
171
- end
104
+ next if (new_ranges = parse_ipv4_ranges(arg)).nil?
105
+
172
106
  else
173
- # Returns an array of ranges
174
- expanded = expand_nmap(arg)
175
- if expanded
176
- expanded.each { |r| ranges.push(r) }
177
- end
107
+ next if (new_ranges = expand_nmap(arg)).nil?
178
108
  end
109
+
110
+ ranges += new_ranges
179
111
  end
180
112
 
181
113
  # Remove any duplicate ranges
@@ -198,11 +130,12 @@ class RangeWalker
198
130
  self
199
131
  end
200
132
 
201
- # Returns the next IP address.
133
+ # Returns the next host in the range.
202
134
  #
203
- # @return [String] The next address in the range
204
- def next_ip
205
- return false if not valid?
135
+ # @return [Hash<Symbol, String>] The next host in the range
136
+ def next_host
137
+ return unless valid?
138
+
206
139
  if (@curr_addr > @ranges[@curr_range_index].stop)
207
140
  # Then we are at the end of this range. Grab the next one.
208
141
 
@@ -213,14 +146,26 @@ class RangeWalker
213
146
 
214
147
  @curr_addr = @ranges[@curr_range_index].start
215
148
  end
216
- addr = Rex::Socket.addr_itoa(@curr_addr, @ranges[@curr_range_index].ipv6?)
217
149
 
218
- if @ranges[@curr_range_index].options[:scope_id]
219
- addr = addr + '%' + @ranges[@curr_range_index].options[:scope_id]
150
+ range = @ranges[@curr_range_index]
151
+ addr = Rex::Socket.addr_itoa(@curr_addr, range.ipv6?)
152
+
153
+ if range.options[:scope_id]
154
+ addr = addr + '%' + range.options[:scope_id]
220
155
  end
221
156
 
157
+ hostname = range.is_a?(Host) ? range.hostname : nil
158
+
222
159
  @curr_addr += 1
223
- return addr
160
+ return { address: addr, hostname: hostname }
161
+ end
162
+
163
+ # Returns the next IP address.
164
+ #
165
+ # @return [String] The next address in the range
166
+ def next_ip
167
+ return nil if (host = next_host).nil?
168
+ host[:address]
224
169
  end
225
170
 
226
171
  alias :next :next_ip
@@ -271,7 +216,7 @@ class RangeWalker
271
216
  # {#next_ip}
272
217
  #
273
218
  # @return [self]
274
- def each(&block)
219
+ def each_ip(&block)
275
220
  while (ip = next_ip)
276
221
  block.call(ip)
277
222
  end
@@ -280,6 +225,17 @@ class RangeWalker
280
225
  self
281
226
  end
282
227
 
228
+ alias each each_ip
229
+
230
+ def each_host(&block)
231
+ while (host_hash = next_host)
232
+ block.call(host_hash)
233
+ end
234
+ reset
235
+
236
+ self
237
+ end
238
+
283
239
  #
284
240
  # Returns an Array with one element, a {Range} defined by the given CIDR
285
241
  # block.
@@ -291,7 +247,7 @@ class RangeWalker
291
247
  def expand_cidr(arg)
292
248
  start,stop = Rex::Socket.cidr_crack(arg)
293
249
  if !start or !stop
294
- return false
250
+ return
295
251
  end
296
252
  range = Range.new
297
253
  range.start = Rex::Socket.addr_atoi(start)
@@ -319,18 +275,16 @@ class RangeWalker
319
275
  #
320
276
  def expand_nmap(arg)
321
277
  # Can't really do anything with IPv6
322
- return false if arg.include?(":")
278
+ return if arg.include?(":")
323
279
 
324
280
  # nmap calls these errors, but it's hard to catch them with our
325
281
  # splitting below, so short-cut them here
326
- return false if arg.include?(",-") or arg.include?("-,")
282
+ return if arg.include?(",-") or arg.include?("-,")
327
283
 
328
284
  bytes = []
329
285
  sections = arg.split('.')
330
- if sections.length != 4
331
- # Too many or not enough dots
332
- return false
333
- end
286
+ return unless sections.length == 4 # Too many or not enough dots
287
+
334
288
  sections.each { |section|
335
289
  if section.empty?
336
290
  # pretty sure this is an unintentional artifact of the C
@@ -344,7 +298,7 @@ class RangeWalker
344
298
  # I think this ought to be 1-254, but this is how nmap does it.
345
299
  section = "0-255"
346
300
  elsif section.include?("*")
347
- return false
301
+ return
348
302
  end
349
303
 
350
304
  # Break down the sections into ranges like so
@@ -361,18 +315,18 @@ class RangeWalker
361
315
  # if the upper bound is empty, stop at 255
362
316
  #
363
317
  bounds = r.split('-', -1)
364
- return false if (bounds.length > 2)
318
+ return if (bounds.length > 2)
365
319
 
366
320
  bounds[0] = 0 if bounds[0].nil? or bounds[0].empty?
367
321
  bounds[1] = 255 if bounds[1].nil? or bounds[1].empty?
368
322
  bounds.map!{|b| b.to_i}
369
- return false if bounds[0] > bounds[1]
323
+ return if bounds[0] > bounds[1]
370
324
  else
371
325
  # Then it's a single value
372
326
  bounds[0] = r.to_i
373
327
  end
374
- return false if bounds[0] > 255 or (bounds[1] and bounds[1] > 255)
375
- return false if bounds[1] and bounds[0] > bounds[1]
328
+ return if bounds[0] > 255 or (bounds[1] and bounds[1] > 255)
329
+ return if bounds[1] and bounds[0] > bounds[1]
376
330
  if bounds[1]
377
331
  bounds[0].upto(bounds[1]) do |i|
378
332
  sets.push(i)
@@ -430,6 +384,98 @@ class RangeWalker
430
384
 
431
385
  protected
432
386
 
387
+ def parse_hostname(arg)
388
+ begin
389
+ ranges = Rex::Socket.getaddresses(arg).map { |addr| Host.new(addr, arg) }
390
+ rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
391
+ return
392
+ end
393
+
394
+ ranges
395
+ end
396
+
397
+ def parse_ipv4_cidr(arg)
398
+ # Then it's CIDR notation and needs special case
399
+ return if !valid_cidr_chars?(arg)
400
+
401
+ ip_part, mask_part = arg.split("/")
402
+ return unless (0..32).include? mask_part.to_i
403
+ if ip_part =~ /^\d{1,3}(\.\d{1,3}){1,3}$/
404
+ return unless Rex::Socket.is_ipv4?(ip_part)
405
+ end
406
+
407
+ begin
408
+ hosts = Rex::Socket.getaddresses(ip_part).select { |addr| Rex::Socket.is_ipv4?(addr) } # drop non-IPv4 addresses
409
+ rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
410
+ return # Can't resolve the ip_part, so bail.
411
+ end
412
+
413
+ hosts.map { |addr| expand_cidr("#{addr}/#{mask_part}") }
414
+ end
415
+
416
+ def parse_ipv4_ranges(arg)
417
+ # Note, this will /not/ deal with DNS names, or the fancy/obscure 10...1-10...2
418
+ return unless arg =~ MATCH_IPV4_RANGE
419
+
420
+ begin
421
+ start, stop = Rex::Socket.addr_atoi($1), Rex::Socket.addr_atoi($2)
422
+ return if start > stop # The end is greater than the beginning.
423
+ range = Range.new(start, stop)
424
+ rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
425
+ return
426
+ end
427
+
428
+ [range]
429
+ end
430
+
431
+ def parse_ipv6(arg)
432
+ opts = {}
433
+ addrs = arg.split('-', 2)
434
+
435
+ # Handle a single address
436
+ if addrs.length == 1
437
+ addr, scope_id = addrs[0].split('%')
438
+ opts[:scope_id] = scope_id if scope_id
439
+ opts[:ipv6] = true
440
+
441
+ return unless Rex::Socket.is_ipv6?(addr)
442
+ addr = Rex::Socket.addr_atoi(addr)
443
+ range = Range.new(addr, addr, opts)
444
+ else
445
+ addr1, scope_id = addrs[0].split('%')
446
+ opts[:scope_id] = scope_id if scope_id
447
+ opts[:ipv6] = true
448
+
449
+ addr2, scope_id = addrs[1].split('%')
450
+ ( opts[:scope_id] ||= scope_id ) if scope_id
451
+
452
+ # Both have to be IPv6 for this to work
453
+ return unless (Rex::Socket.is_ipv6?(addr1) && Rex::Socket.is_ipv6?(addr2))
454
+
455
+ # Handle IPv6 ranges in the form of 2001::1-2001::10
456
+ addr1 = Rex::Socket.addr_atoi(addr1)
457
+ addr2 = Rex::Socket.addr_atoi(addr2)
458
+
459
+ range = Range.new(addr1, addr2, opts)
460
+ end
461
+
462
+ [range]
463
+ end
464
+
465
+ def parse_ipv6_cidr(arg)
466
+ return if !valid_cidr_chars?(arg)
467
+
468
+ ip_part, mask_part = arg.split("/")
469
+ return unless (0..128).include? mask_part.to_i
470
+
471
+ addr, scope_id = ip_part.split('%')
472
+ return unless Rex::Socket.is_ipv6?(addr)
473
+
474
+ range = expand_cidr(addr + '/' + mask_part)
475
+ range.options[:scope_id] = scope_id if scope_id
476
+ [range]
477
+ end
478
+
433
479
  def valid_cidr_chars?(arg)
434
480
  return false if arg.include? ',-' # Improper CIDR notation (can't mix with 1,3 or 1-3 style IP ranges)
435
481
  return false if arg.scan("/").size > 1 # ..but there are too many slashes
@@ -464,7 +510,7 @@ class Range
464
510
  def initialize(start=nil, stop=nil, options=nil)
465
511
  @start = start
466
512
  @stop = stop
467
- @options = options
513
+ @options = options || {}
468
514
  end
469
515
 
470
516
  # Compare attributes with +other+
@@ -488,5 +534,21 @@ class Range
488
534
  end
489
535
  end
490
536
 
537
+ # A single host
538
+ class Host < Range
539
+ attr_accessor :hostname
540
+
541
+ def initialize(address, hostname=nil, options=nil)
542
+ address = Rex::Socket.addr_atoi(address) if address.is_a? String
543
+
544
+ super(address, address, options)
545
+ @hostname = hostname
546
+ end
547
+
548
+ def address
549
+ Rex::Socket.addr_itoa(@start)
550
+ end
551
+
552
+ end
491
553
  end
492
554
  end
@@ -11,6 +11,9 @@ require 'openssl'
11
11
  ###
12
12
  module Rex::Socket::Ssl
13
13
 
14
+ # Default to SSLv23 (automatically negotiate)
15
+ DEFAULT_SSL_VERSION = :SSLv23
16
+
14
17
  module CertProvider
15
18
 
16
19
  def self.ssl_generate_subject(cn: nil, org: nil, loc: nil, st: nil)
@@ -122,7 +125,14 @@ module Rex::Socket::Ssl
122
125
  key, cert, chain = ssl_generate_certificate(cert_vars: {cn: params.ssl_cn})
123
126
  end
124
127
 
125
- ctx = OpenSSL::SSL::SSLContext.new()
128
+ version = params&.ssl_version || DEFAULT_SSL_VERSION
129
+ # Raise an error if no selected versions are supported
130
+ unless Rex::Socket::SslTcp.system_ssl_methods.include? version
131
+ raise ArgumentError,
132
+ "This version of Ruby does not support the requested SSL/TLS version #{version}"
133
+ end
134
+
135
+ ctx = OpenSSL::SSL::SSLContext.new(version)
126
136
  ctx.key = key
127
137
  ctx.cert = cert
128
138
  ctx.extra_chain_cert = chain
@@ -65,35 +65,14 @@ begin
65
65
  def initsock(params = nil)
66
66
  super
67
67
 
68
- # Default to SSLv23 (automatically negotiate)
69
- version = :SSLv23
70
-
71
- # Let the caller specify a particular SSL/TLS version
72
- if params
73
- case params.ssl_version
74
- when 'SSL2', :SSLv2
75
- version = :SSLv2
76
- # 'TLS' will be the new name for autonegotation with newer versions of OpenSSL
77
- when 'SSL23', :SSLv23, 'TLS', 'Auto'
78
- version = :SSLv23
79
- when 'SSL3', :SSLv3
80
- version = :SSLv3
81
- when 'TLS1','TLS1.0', :TLSv1
82
- version = :TLSv1
83
- when 'TLS1.1', :TLSv1_1
84
- version = :TLSv1_1
85
- when 'TLS1.2', :TLSv1_2
86
- version = :TLSv1_2
87
- end
88
- end
89
-
68
+ version = params&.ssl_version || Rex::Socket::Ssl::DEFAULT_SSL_VERSION
90
69
  # Raise an error if no selected versions are supported
91
70
  unless Rex::Socket::SslTcp.system_ssl_methods.include? version
92
71
  raise ArgumentError,
93
- "This version of Ruby does not support the requested SSL/TLS version #{params.ssl_version}"
72
+ "This version of Ruby does not support the requested SSL/TLS version #{version}"
94
73
  end
95
74
 
96
- # Try intializing the socket with this SSL/TLS version
75
+ # Try initializing the socket with this SSL/TLS version
97
76
  # This will throw an exception if it fails
98
77
  initsock_with_ssl_version(params, version)
99
78
 
@@ -276,7 +276,7 @@ protected
276
276
  # Initializes the underlying stuff.
277
277
  #
278
278
  def _init
279
- if (@_initialized != true)
279
+ unless @_initialized
280
280
  @_initialized = true
281
281
  self.routes = Array.new
282
282
  self.mutex = Mutex.new
@@ -1,5 +1,5 @@
1
1
  module Rex
2
2
  module Socket
3
- VERSION = "0.1.26"
3
+ VERSION = "0.1.30"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rex-socket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.26
4
+ version: 0.1.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - Metasploit Hackers
@@ -93,7 +93,7 @@ cert_chain:
93
93
  EknWpNgVhohbot1lfVAMmIhdtOVaRVcQQixWPwprDj/ydB8ryDMDosIMcw+fkoXU
94
94
  9GJsSaSRRYQ9UUkVL27b64okU8D48m8=
95
95
  -----END CERTIFICATE-----
96
- date: 2021-03-10 00:00:00.000000000 Z
96
+ date: 2021-08-05 00:00:00.000000000 Z
97
97
  dependencies:
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rake
metadata.gz.sig CHANGED
Binary file