rex-socket 0.1.19 → 0.1.24

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: 679b9b84b7330ecd3b3c19bf55e6829bdf5c55f19ec928902867e58200a1b6f7
4
- data.tar.gz: e083b54db2bd91b5de5ca8db7a795443bff6f52fc2cb3dee695e0c3b869af0a7
3
+ metadata.gz: 7a3ef67ae8bd23b0e0b85c459748cec22f99bd99d296d0388c8831d2f45a49b3
4
+ data.tar.gz: 88175f6a22f757299c3f0f4e4689555ccfbf34d79c1eb9b722e1caa505849ea6
5
5
  SHA512:
6
- metadata.gz: c33ba960993643b36c4a9fe36772094ee2ac9396b928e63ec78f2d04c79f7396dba4aaa08aad61180f179471679c94e319392ed3eb4e7203f50c1e0c254c04be
7
- data.tar.gz: d02f730116d109024e0364f4b8612b584e11fbc1307166321a4178b75b307699a6f9301fa78df913b77e541e373506bcd18b028d2db2bfb4d725a81e84c5f4b0
6
+ metadata.gz: 158ed62e8cadbbf95175372bd3e44289e3d2bc1c0cbcc6e80c5803ece3e7f7186ba13cf5f40b2233dbafaf82fb056e4975bc28edebdf446b4ab7147c343dc9de
7
+ data.tar.gz: 9a069f248fb298505dedb93426b064a2c157989f73c649efc92948269679c4d527e0b5909662042229a46e96106a83eb3dd4d602a1879f6beeacaeed6afac88e
Binary file
@@ -0,0 +1,3 @@
1
+ ϟۇA���v�����K&m㼼r�I:��� ����9�9�|����|�@�W0�0a��\�z/��z��0V��8����aB�s�%Dߦ� _�{]HG �U!̫���SH=(k����i|R���̾��3e�7� to±3_��3��� y�ɰ�_��e �H�\�.F�@F�c.a—�N�� �q�� �!Rv�U}���F����������r
2
+ "�kt=�(
3
+ ��&�2G^�y�$�u��&V���
@@ -3,4 +3,4 @@ group: stable
3
3
  cache: bundler
4
4
  language: ruby
5
5
  rvm:
6
- - 2.3.2
6
+ - 2.6.5
@@ -732,14 +732,19 @@ module Socket
732
732
  end
733
733
 
734
734
  #
735
- # Wrapper around getsockname
735
+ # Wrapper around getsockname that stores the local address and local port values.
736
736
  #
737
737
  def getlocalname
738
- getsockname
738
+ if self.localhost.nil? && self.localport.nil?
739
+ _, self.localhost, self.localport = getsockname
740
+ end
741
+
742
+ family = Socket.is_ipv4?(self.localhost) ? ::Socket::AF_INET : ::Socket::AF_INET6
743
+ [family, self.localhost, self.localport]
739
744
  end
740
745
 
741
746
  #
742
- # Return peer connection information.
747
+ # Returns peer connection information as an array.
743
748
  #
744
749
  def getpeername_as_array
745
750
  peer_name = nil
@@ -77,45 +77,33 @@ class Rex::Socket::Parameters
77
77
  # retried.
78
78
  # @option hash [Fixnum] 'Timeout' The number of seconds before a connection
79
79
  # should time out
80
- def initialize(hash)
80
+ def initialize(hash = {})
81
81
  if (hash['PeerHost'])
82
82
  self.peerhost = hash['PeerHost']
83
83
  elsif (hash['PeerAddr'])
84
84
  self.peerhost = hash['PeerAddr']
85
- else
86
- self.peerhost = nil
87
85
  end
88
86
 
89
87
  if (hash['LocalHost'])
90
88
  self.localhost = hash['LocalHost']
91
89
  elsif (hash['LocalAddr'])
92
90
  self.localhost = hash['LocalAddr']
93
- else
94
- self.localhost = '0.0.0.0'
95
91
  end
96
92
 
97
93
  if (hash['PeerPort'])
98
94
  self.peerport = hash['PeerPort'].to_i
99
- else
100
- self.peerport = 0
101
95
  end
102
96
 
103
97
  if (hash['LocalPort'])
104
98
  self.localport = hash['LocalPort'].to_i
105
- else
106
- self.localport = 0
107
99
  end
108
100
 
109
101
  if (hash['Bare'])
110
102
  self.bare = hash['Bare']
111
- else
112
- self.bare = false
113
103
  end
114
104
 
115
105
  if (hash['SSL'] and hash['SSL'].to_s =~ /^(t|y|1)/i)
116
106
  self.ssl = true
117
- else
118
- self.ssl = false
119
107
  end
120
108
 
121
109
  if hash['SSLContext']
@@ -179,33 +167,16 @@ class Rex::Socket::Parameters
179
167
  # The protocol this socket will be using
180
168
  if (hash['Proto'])
181
169
  self.proto = hash['Proto'].downcase
182
- else
183
- self.proto = 'tcp'
184
170
  end
185
171
 
186
172
  # Whether or not the socket should be a server
187
- self.server = hash['Server'] || false
173
+ self.server = hash['Server']
188
174
 
189
175
  # The communication subsystem to use to create the socket
190
176
  self.comm = hash['Comm']
191
177
 
192
178
  # The context that was passed in, if any.
193
- self.context = hash['Context'] || {}
194
-
195
- # If no comm was supplied, try to use the comm that is best fit to
196
- # handle the provided host based on the current routing table.
197
- if( self.server )
198
- if (self.comm == nil and self.localhost)
199
- self.comm = Rex::Socket::SwitchBoard.best_comm(self.localhost)
200
- end
201
- else
202
- if (self.comm == nil and self.peerhost)
203
- self.comm = Rex::Socket::SwitchBoard.best_comm(self.peerhost)
204
- end
205
- end
206
-
207
- # If we still haven't found a comm, we default to the local comm.
208
- self.comm = Rex::Socket::Comm::Local if (self.comm == nil)
179
+ self.context = hash['Context']
209
180
 
210
181
  # If we are a UDP server, turn off the server flag as it was only set when
211
182
  # creating the UDP socket in order to avail of the switch board above.
@@ -216,19 +187,29 @@ class Rex::Socket::Parameters
216
187
  # The number of connection retries to make (client only)
217
188
  if hash['Retries']
218
189
  self.retries = hash['Retries'].to_i
219
- else
220
- self.retries = 0
221
190
  end
222
191
 
223
192
  # The number of seconds before a connect attempt times out (client only)
224
193
  if hash['Timeout']
225
194
  self.timeout = hash['Timeout'].to_i
226
- else
227
- self.timeout = 5
228
195
  end
229
196
 
230
197
  # Whether to force IPv6 addressing
231
- self.v6 = hash['IPv6'] || false
198
+ self.v6 = hash['IPv6']
199
+ end
200
+
201
+ def merge(other)
202
+ self.dup.merge!(other)
203
+ end
204
+
205
+ def merge!(other)
206
+ other = self.class.new(other) if other.is_a? Hash
207
+
208
+ other.instance_variables.each do |name|
209
+ value = other.instance_variable_get(name)
210
+ instance_variable_set(name, value) unless value.nil?
211
+ end
212
+ self
232
213
  end
233
214
 
234
215
  ##
@@ -294,7 +275,6 @@ class Rex::Socket::Parameters
294
275
  return v6
295
276
  end
296
277
 
297
-
298
278
  ##
299
279
  #
300
280
  # Attributes
@@ -308,50 +288,94 @@ class Rex::Socket::Parameters
308
288
 
309
289
  # The remote port. Equivalent to the PeerPort parameter hash key.
310
290
  # @return [Fixnum]
311
- attr_accessor :peerport
291
+ attr_writer :peerport
292
+ def peerport
293
+ @peerport || 0
294
+ end
312
295
 
313
296
  # The local host. Equivalent to the LocalHost parameter hash key.
314
297
  # @return [String]
315
- attr_accessor :localhost
298
+ attr_writer :localhost
299
+ def localhost
300
+ @localhost || '0.0.0.0'
301
+ end
316
302
 
317
303
  # The local port. Equivalent to the LocalPort parameter hash key.
318
304
  # @return [Fixnum]
319
- attr_accessor :localport
305
+ attr_writer :localport
306
+ def localport
307
+ @localport || 0
308
+ end
320
309
 
321
310
  # The protocol to to use, such as TCP. Equivalent to the Proto parameter
322
311
  # hash key.
323
312
  # @return [String]
324
- attr_accessor :proto
313
+ attr_writer :proto
314
+ def proto
315
+ @proto || 'tcp'
316
+ end
325
317
 
326
318
  # Whether or not this is a server. Equivalent to the Server parameter
327
319
  # hash key.
328
320
  # @return [Bool]
329
- attr_accessor :server
321
+ attr_writer :server
322
+ def server
323
+ @server || false
324
+ end
330
325
 
331
326
  # The {Comm} instance that should be used to create the underlying socket.
332
327
  # @return [Comm]
333
- attr_accessor :comm
328
+ attr_writer :comm
329
+ def comm
330
+ return @comm unless @comm.nil?
331
+
332
+ best_comm = nil
333
+ # If no comm was explicitly specified, try to use the comm that is best fit
334
+ # to handle the provided host based on the current routing table.
335
+ if server and localhost
336
+ best_comm = Rex::Socket::SwitchBoard.best_comm(localhost)
337
+ elsif peerhost
338
+ best_comm = Rex::Socket::SwitchBoard.best_comm(peerhost)
339
+ end
340
+
341
+ best_comm || Rex::Socket::Comm::Local
342
+ end
334
343
 
335
344
  # The context hash that was passed in to the structure. (default: {})
336
345
  # @return [Hash]
337
- attr_accessor :context
346
+ attr_writer :context
347
+ def context
348
+ @context || {}
349
+ end
338
350
 
339
351
  # The number of attempts that should be made.
340
352
  # @return [Fixnum]
341
- attr_accessor :retries
353
+ attr_writer :retries
354
+ def retries
355
+ @retries || 0
356
+ end
342
357
 
343
358
  # The number of seconds before a connection attempt should time out.
344
359
  # @return [Fixnum]
345
- attr_accessor :timeout
360
+ attr_writer :timeout
361
+ def timeout
362
+ @timeout || 5
363
+ end
346
364
 
347
365
  # Whether or not this is a bare (non-extended) socket instance that should
348
366
  # be created.
349
367
  # @return [Bool]
350
- attr_accessor :bare
368
+ attr_writer :bare
369
+ def bare
370
+ @comm || false
371
+ end
351
372
 
352
373
  # Whether or not SSL should be used to wrap the connection.
353
374
  # @return [Bool]
354
- attr_accessor :ssl
375
+ attr_writer :ssl
376
+ def ssl
377
+ @ssl || false
378
+ end
355
379
 
356
380
  # Pre configured SSL Context to use
357
381
  # @return [OpenSSL::SSL::SSLContext]
@@ -384,21 +408,26 @@ class Rex::Socket::Parameters
384
408
  # The client SSL certificate
385
409
  #
386
410
  attr_accessor :ssl_client_cert
411
+
387
412
  #
388
413
  # The client SSL key
389
414
  #
390
415
  attr_accessor :ssl_client_key
416
+
391
417
  #
392
418
  # SSL certificate verification mode for SSL context
393
419
  attr_accessor :ssl_verify_mode
420
+
394
421
  #
395
422
  # Whether we should use IPv6
396
423
  # @return [Bool]
397
- attr_accessor :v6
398
-
424
+ attr_writer :v6
425
+ def v6
426
+ @v6 || false
427
+ end
399
428
 
400
429
  # List of proxies to use
401
- # @return [String]
430
+ # @return [Array]
402
431
  attr_accessor :proxies
403
432
 
404
433
  alias peeraddr peerhost
@@ -13,10 +13,12 @@ module Rex::Socket::Ssl
13
13
 
14
14
  module CertProvider
15
15
 
16
- def self.ssl_generate_subject(cn = Rex::Text.rand_hostname, org = Rex::Text.rand_name)
17
- st = Rex::Text.rand_state
18
- loc = Rex::Text.rand_name.capitalize
19
- "/C=US/ST=#{st}/L=#{loc}/O=#{org.capitalize}/CN=#{cn}"
16
+ def self.ssl_generate_subject(cn: nil, org: nil, loc: nil, st: nil)
17
+ st ||= Rex::Text.rand_state
18
+ loc ||= Rex::Text.rand_name.capitalize
19
+ org ||= Rex::Text.rand_name.capitalize
20
+ cn ||= Rex::Text.rand_hostname
21
+ "/C=US/ST=#{st}/L=#{loc}/O=#{org}/CN=#{cn}"
20
22
  end
21
23
 
22
24
  def self.ssl_generate_issuer
@@ -30,11 +32,11 @@ module Rex::Socket::Ssl
30
32
  # certificate. This matches a typical "snakeoil" cert.
31
33
  #
32
34
  # @return [String, String, Array]
33
- def self.ssl_generate_certificate(cn = Rex::Text.rand_hostname, org = Rex::Text.rand_name)
35
+ def self.ssl_generate_certificate(cert_vars: {}, **opts)
34
36
  yr = 24*3600*365
35
37
  vf = Time.at(Time.now.to_i - rand(yr * 3) - yr)
36
- vt = Time.at(vf.to_i + (rand(9)+1) * yr)
37
- subject = ssl_generate_subject(cn, org)
38
+ vt = Time.at(vf.to_i + (rand(4..9) * yr))
39
+ subject = ssl_generate_subject(**cert_vars)
38
40
  issuer = ssl_generate_issuer
39
41
  key = OpenSSL::PKey::RSA.new(2048){ }
40
42
  cert = OpenSSL::X509::Certificate.new
@@ -88,8 +90,8 @@ module Rex::Socket::Ssl
88
90
  @@cert_provider.ssl_generate_issuer
89
91
  end
90
92
 
91
- def self.ssl_generate_certificate(cn = Rex::Text.rand_hostname, org = Rex::Text.rand_name)
92
- @@cert_provider.ssl_generate_certificate(cn, org)
93
+ def self.ssl_generate_certificate(**opts)
94
+ @@cert_provider.ssl_generate_certificate(**opts)
93
95
  end
94
96
 
95
97
  #
@@ -102,8 +104,8 @@ module Rex::Socket::Ssl
102
104
  #
103
105
  # Shim for the ssl_generate_certificate module method
104
106
  #
105
- def ssl_generate_certificate(cn = Rex::Text.rand_hostname, org = Rex::Text.rand_name)
106
- Rex::Socket::Ssl.ssl_generate_certificate(cn, org)
107
+ def ssl_generate_certificate(**opts)
108
+ Rex::Socket::Ssl.ssl_generate_certificate(**opts)
107
109
  end
108
110
 
109
111
  #
@@ -117,7 +119,7 @@ module Rex::Socket::Ssl
117
119
  if params.ssl_cert
118
120
  key, cert, chain = ssl_parse_pem(params.ssl_cert)
119
121
  else
120
- key, cert, chain = ssl_generate_certificate(params.ssl_cn)
122
+ key, cert, chain = ssl_generate_certificate(cert_vars: {cn: params.ssl_cn})
121
123
  end
122
124
 
123
125
  ctx = OpenSSL::SSL::SSLContext.new()
@@ -61,6 +61,11 @@ module Rex::Socket::TcpServer
61
61
 
62
62
  t.peerhost = pn[1]
63
63
  t.peerport = pn[2]
64
+
65
+ ln = t.getlocalname
66
+
67
+ t.localhost = ln[1]
68
+ t.localport = ln[2]
64
69
  end
65
70
 
66
71
  t
@@ -1,5 +1,5 @@
1
1
  module Rex
2
2
  module Socket
3
- VERSION = "0.1.19"
3
+ VERSION = "0.1.24"
4
4
  end
5
5
  end
@@ -28,7 +28,9 @@ class X509Certificate
28
28
 
29
29
  certs = []
30
30
  ssl_cert.scan(/-----BEGIN\s*[^\-]+-----+\r?\n[^\-]*-----END\s*[^\-]+-----\r?\n?/nm).each do |pem|
31
- if pem =~ /PRIVATE KEY/
31
+ if pem =~ /EC PRIVATE KEY/
32
+ key = OpenSSL::PKey::EC.new(pem)
33
+ elsif pem =~ /PRIVATE KEY/
32
34
  key = OpenSSL::PKey::RSA.new(pem)
33
35
  elsif pem =~ /CERTIFICATE/
34
36
  certs << OpenSSL::X509::Certificate.new(pem)
metadata CHANGED
@@ -1,14 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rex-socket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.19
4
+ version: 0.1.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Maloney
8
8
  autorequire:
9
9
  bindir: exe
10
- cert_chain: []
11
- date: 2019-08-28 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
14
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
15
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
16
+ b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
17
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
18
+ cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
19
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
20
+ JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
21
+ mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
22
+ wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
23
+ VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
24
+ AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
25
+ AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
26
+ BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
27
+ pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
28
+ dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
29
+ fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
30
+ NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
31
+ H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
32
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
33
+ -----END CERTIFICATE-----
34
+ - |
35
+ -----BEGIN CERTIFICATE-----
36
+ MIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1U0O1b5VQCDANBgkqhkiG9w0BAQsFADBl
37
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
38
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
39
+ b3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcNMjgxMDIyMTIwMDAwWjByMQswCQYDVQQG
40
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
41
+ cnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBT
42
+ aWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+NOzHH8O
43
+ Ea9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid2zLXcep2nQUut4/6kkPApfmJ1DcZ17aq
44
+ 8JyGpdglrA55KDp+6dFn08b7KSfH03sjlOSRI5aQd4L5oYQjZhJUM1B0sSgmuyRp
45
+ wsJS8hRniolF1C2ho+mILCCVrhxKhwjfDPXiTWAYvqrEsq5wMWYzcT6scKKrzn/p
46
+ fMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzLfnQ5Ng2Q7+S1TqSp6moKq4TzrGdOtcT3
47
+ jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR93O8vYWxYoNzQYIH5DiLanMg0A9kczye
48
+ n6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNV
49
+ HQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMweQYIKwYBBQUHAQEEbTBr
50
+ MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUH
51
+ MAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ
52
+ RFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2lj
53
+ ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6
54
+ Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmww
55
+ TwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
56
+ d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMwHQYDVR0OBBYEFFrEuXsq
57
+ CqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgP
58
+ MA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1aJLPzItEVyCx8JSl2qB1dHC06GsTvMGHX
59
+ fgtg/cM9D8Svi/3vKt8gVTew4fbRknUPUbRupY5a4l4kgU4QpO4/cY5jDhNLrddf
60
+ RHnzNhQGivecRk5c/5CxGwcOkRX7uq+1UcKNJK4kxscnKqEpKBo6cSgCPC6Ro8Al
61
+ EeKcFEehemhor5unXCBc2XGxDI+7qPjFEmifz0DLQESlE/DmZAwlCEIysjaKJAL+
62
+ L3J+HNdJRZboWR3p+nRka7LrZkPas7CM1ekN3fYBIM6ZMWM9CBoYs4GbT8aTEAb8
63
+ B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhsRDKyZqHnGKSaZFHv
64
+ -----END CERTIFICATE-----
65
+ - |
66
+ -----BEGIN CERTIFICATE-----
67
+ MIIFIzCCBAugAwIBAgIQDX9ZkVJ2eNVTlibR5ALyJTANBgkqhkiG9w0BAQsFADBy
68
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
69
+ d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQg
70
+ SUQgQ29kZSBTaWduaW5nIENBMB4XDTE5MTAxNjAwMDAwMFoXDTIwMTAxOTEyMDAw
71
+ MFowYDELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxDzANBgNV
72
+ BAcTBkJvc3RvbjETMBEGA1UEChMKUmFwaWQ3IExMQzETMBEGA1UEAxMKUmFwaWQ3
73
+ IExMQzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANHnKegPAghKuZk4
74
+ Gy1jKaZEXbWc4fxioTemv/F1yIYzAjCWP65qjKtyeeFDe4/kJzG9nseF9oa93YBf
75
+ 1nyEqxNSZMw/sCAZ87lOl713dRi73uxOoszy2PT5xEB+Q5R6cbzExkWG2zrLdXDr
76
+ so0Bd6VHw+IsAoBBkAq5FrZOJQYGn5VY20xw/2DqtCeoW4QDWyqTnbJmwO9tZrfr
77
+ 3Le2crfk2eOgafaPNhLon5uuIKCZsk2YkUSNURSS3M7gosMwU9Gg4JTBi7X5+oww
78
+ rY43dJT28YklxmNVu8o5kJxW4dqLKJLOIgSXZ63nceT/EaCSg7DcofHNcUzejFwb
79
+ M7Zbb2kCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaAFFrEuXsqCqOl6nEDwGD5LfZl
80
+ dQ5YMB0GA1UdDgQWBBR18CAeMsIEU+0pXal/XXw9LCtMADAOBgNVHQ8BAf8EBAMC
81
+ B4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0fBHAwbjA1oDOgMYYvaHR0cDov
82
+ L2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1nMS5jcmwwNaAzoDGG
83
+ L2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3Js
84
+ MEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
85
+ d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQBMIGEBggrBgEFBQcBAQR4MHYw
86
+ JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBOBggrBgEFBQcw
87
+ AoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3Vy
88
+ ZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEL
89
+ BQADggEBAFpzR9s7lcYKDzSJucOHztEPj+iSIeCzxEw34NTE9M2AfkYIu82c4r2a
90
+ bzIGmzZWiCGufjOp0gF5xW6sSSJ9n0TqH0nhHhvjtZQkmkGtOBbN1zeYDFS2ozAp
91
+ sljF/g68Y1eYs3NaFf7kQUa6vb6RdjW3J8M9AQ8gthBt7gr/guVxd/gJUYbdDdBX
92
+ cWfJJi/X7GVBOBmmvA43qoKideuhOBrVGBHvIF/yO9p23dIiUrGmW9kxXCSxgute
93
+ JI/W23RbIRksG2pioMhd4dCXq3FLLlkOV1YfCwWixNB+iIhQPPZVaPNfgPhCn4Dt
94
+ DeGjje/qA4fkLtRmOtb9PUBq3ToRDE4=
95
+ -----END CERTIFICATE-----
96
+ date: 2020-09-22 00:00:00.000000000 Z
12
97
  dependencies:
13
98
  - !ruby/object:Gem::Dependency
14
99
  name: bundler
@@ -123,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
208
  version: '0'
124
209
  requirements: []
125
210
  rubyforge_project:
126
- rubygems_version: 2.7.8
211
+ rubygems_version: 2.7.10
127
212
  signing_key:
128
213
  specification_version: 4
129
214
  summary: The Ruby Exploitation (Rex) Socket Abstraction Library.
@@ -0,0 +1 @@
1
+ nECza��??��°p