net-ssh 5.1.0 → 5.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e14e949eb49846743dae609d76bb3ff8e7e26332
4
- data.tar.gz: b373032655d4f986f1695d231eafc1d7f3a7fffd
3
+ metadata.gz: 2bb9cafa5bb69001f6ac6c303a18369ea759d93a
4
+ data.tar.gz: d2cb338177e2ce3abc7755c4b5e3f163048a56e0
5
5
  SHA512:
6
- metadata.gz: 073c77cec7e4420dec75779906809319fb65f8163a4b99cfd3fbafaa1f1fce1e209ac96cb8ac22c82c182835f1ff7609625492108612f2158c1ba26fffd828a1
7
- data.tar.gz: 293eb2965ccb35840c5bc29abc8c5be3ae78ab55461ce7ca42cc21045ed3ef02bcf44356e2bb33ef115e479ef1c11e269e88cd8d6f260a79b6e75273fe869175
6
+ metadata.gz: 4c3a4b65a0ac623b3567d04d79f50cf081286dd4aa74ea0f97fae2edb1f3c70bb470b9511c18530c241e5ad4956828df434f12d29655e11e8f934992aeb0d13e
7
+ data.tar.gz: c69a452a092f2f3077db5b7c6249e20b143fe9161f53b078f99375e45f815b04d716cf4bee53447ba28189126cc889db423891f4fb1e3d1a5f965f5bdc484c7f
checksums.yaml.gz.sig CHANGED
Binary file
data/.rubocop.yml CHANGED
@@ -3,3 +3,6 @@ inherit_from: .rubocop_todo.yml
3
3
  AllCops:
4
4
  Exclude:
5
5
  - 'tryout/**/*'
6
+
7
+ Style/DoubleNegation:
8
+ Enabled: false
data/CHANGES.txt CHANGED
@@ -1,8 +1,24 @@
1
+ === 5.2.0.rc3
2
+
3
+ * Fix check_host_ip read from config
4
+ * Support ssh-ed25519 in kown hosts
5
+
6
+ === 5.2.0.rc2
7
+
8
+ * Read check_host_ip from ssh config files
9
+
10
+ === 5.2.0.rc1
11
+
12
+ * Interpret * and ? in know_hosts file [Romain Tartière, #660]
13
+ * New :check_host_ip so ip checking can be disabled in known hosts [Romain Tartière, #656]
14
+
15
+ === 5.1.0
16
+
1
17
  === 5.1.0.rc1
2
18
 
3
19
  * Support new OpenSSH private key format for rsa - bcrypt for rsa (ed25519 already supported) [#646]
4
20
  * Support IdentityAgent is ssh config [Frank Groeneveld, #645]
5
- * Improve Match processin in ssh config [Aleksandrs Ļedovskis, #642]
21
+ * Improve Match processing in ssh config [Aleksandrs Ļedovskis, #642]
6
22
  * Ignore signature verification when verify_host_key is never [Piotr Kliczewski, #641]
7
23
  * Alg preference was changed to prefer stronger encryptions [Tray, #637]
8
24
 
@@ -29,6 +29,17 @@ module Net
29
29
  MEND = "-----END OPENSSH PRIVATE KEY-----\n"
30
30
  MAGIC = "openssh-key-v1"
31
31
 
32
+ class DecryptError < ArgumentError
33
+ def initialize(message, encrypted_key: false)
34
+ super(message)
35
+ @encrypted_key = encrypted_key
36
+ end
37
+
38
+ def encrypted_key?
39
+ return @encrypted_key
40
+ end
41
+ end
42
+
32
43
  def self.read(datafull, password)
33
44
  raise ArgumentError.new("Expected #{MBEGIN} at start of private key") unless datafull.start_with?(MBEGIN)
34
45
  raise ArgumentError.new("Expected #{MEND} at end of private key") unless datafull.end_with?(MEND)
@@ -74,7 +85,7 @@ module Net
74
85
  check1 = decoded.read_long
75
86
  check2 = decoded.read_long
76
87
 
77
- raise ArgumentError, "Decrypt failed on private key" if (check1 != check2)
88
+ raise DecryptError.new("Decrypt failed on private key", encrypted_key: kdfname == 'bcrypt') if (check1 != check2)
78
89
 
79
90
  type_name = decoded.read_string
80
91
  case type_name
@@ -24,6 +24,7 @@ module Net
24
24
  # * IdentityFile => maps to the :keys option
25
25
  # * IdentityAgent => :identity_agent
26
26
  # * IdentitiesOnly => :keys_only
27
+ # * CheckHostIP => :check_host_ip
27
28
  # * Macs => maps to the :hmac option
28
29
  # * PasswordAuthentication => maps to the :auth_methods option password
29
30
  # * Port => :port
@@ -202,7 +203,8 @@ module Net
202
203
  fingerprinthash: :fingerprint_hash,
203
204
  port: :port,
204
205
  user: :user,
205
- userknownhostsfile: :user_known_hosts_file
206
+ userknownhostsfile: :user_known_hosts_file,
207
+ checkhostip: :check_host_ip
206
208
  }
207
209
  case key
208
210
  when :ciphers
@@ -50,16 +50,17 @@ module Net
50
50
  # encrypted (requiring a passphrase to use), the user will be
51
51
  # prompted to enter their password unless passphrase works.
52
52
  def load_data_private_key(data, passphrase=nil, ask_passphrase=true, filename="", prompt=Prompt.default)
53
- key_read, error_classes = classify_key(data, filename)
53
+ key_type = classify_key(data, filename)
54
54
 
55
- encrypted_key = data.match(/ENCRYPTED/)
55
+ encrypted_key = nil
56
56
  tries = 0
57
57
 
58
58
  prompter = nil
59
59
  result =
60
60
  begin
61
- key_read[data, passphrase || 'invalid']
62
- rescue *error_classes
61
+ key_type.read(data, passphrase || 'invalid')
62
+ rescue *key_type.error_classes => e
63
+ encrypted_key = !!key_type.encrypted_key?(data, e) if encrypted_key.nil?
63
64
  if encrypted_key && ask_passphrase
64
65
  tries += 1
65
66
  if tries <= 3
@@ -106,20 +107,108 @@ module Net
106
107
 
107
108
  private
108
109
 
110
+ # rubocop:disable Style/Documentation, Lint/DuplicateMethods
111
+ class KeyType
112
+ def self.read(key_data, passphrase)
113
+ raise Exception, "TODO subclasses should implement read"
114
+ end
115
+
116
+ def self.error_classes
117
+ raise Exception, "TODO subclasses should implement read"
118
+ end
119
+
120
+ def self.encrypted_key?(data, error)
121
+ raise Exception, "TODO subclasses should implement is_encrypted_key"
122
+ end
123
+ end
124
+
125
+ class OpenSSHPrivateKeyType < KeyType
126
+ def self.read(key_data, passphrase)
127
+ Net::SSH::Authentication::ED25519::OpenSSHPrivateKeyLoader.read(key_data, passphrase)
128
+ end
129
+
130
+ def self.error_classes
131
+ [Net::SSH::Authentication::ED25519::OpenSSHPrivateKeyLoader::DecryptError]
132
+ end
133
+
134
+ def self.encrypted_key?(key_data, decode_error)
135
+ decode_error.is_a?(Net::SSH::Authentication::ED25519::OpenSSHPrivateKeyLoader::DecryptError) && decode_error.encrypted_key?
136
+ end
137
+ end
138
+
139
+ class OpenSSLKeyTypeBase < KeyType
140
+ def self.open_ssl_class
141
+ raise Exception, "TODO: subclasses should implement"
142
+ end
143
+
144
+ def self.read(key_data, passphrase)
145
+ open_ssl_class.new(key_data, passphrase)
146
+ end
147
+
148
+ def self.encrypted_key?(key_data, error)
149
+ key_data.match(/ENCRYPTED/)
150
+ end
151
+ end
152
+
153
+ class OpenSSLPKeyType < OpenSSLKeyTypeBase
154
+ def self.read(key_data, passphrase)
155
+ open_ssl_class.read(key_data, passphrase)
156
+ end
157
+
158
+ def self.open_ssl_class
159
+ OpenSSL::PKey
160
+ end
161
+
162
+ def self.error_classes
163
+ [ArgumentError, OpenSSL::PKey::PKeyError]
164
+ end
165
+ end
166
+
167
+ class OpenSSLDSAKeyType < OpenSSLKeyTypeBase
168
+ def self.open_ssl_class
169
+ OpenSSL::PKey::DSA
170
+ end
171
+
172
+ def self.error_classes
173
+ [OpenSSL::PKey::DSAError]
174
+ end
175
+ end
176
+
177
+ class OpenSSLRSAKeyType < OpenSSLKeyTypeBase
178
+ def self.open_ssl_class
179
+ OpenSSL::PKey::RSA
180
+ end
181
+
182
+ def self.error_classes
183
+ [OpenSSL::PKey::RSAError]
184
+ end
185
+ end
186
+
187
+ class OpenSSLECKeyType < OpenSSLKeyTypeBase
188
+ def self.open_ssl_class
189
+ OpenSSL::PKey::EC
190
+ end
191
+
192
+ def self.error_classes
193
+ [OpenSSL::PKey::ECError]
194
+ end
195
+ end
196
+ # rubocop:enable Style/Documentation, Lint/DuplicateMethods
197
+
109
198
  # Determine whether the file describes an RSA or DSA key, and return how load it
110
199
  # appropriately.
111
200
  def classify_key(data, filename)
112
201
  if data.match(/-----BEGIN OPENSSH PRIVATE KEY-----/)
113
202
  Net::SSH::Authentication::ED25519Loader.raiseUnlessLoaded("OpenSSH keys only supported if ED25519 is available")
114
- return ->(key_data, passphrase) { Net::SSH::Authentication::ED25519::OpenSSHPrivateKeyLoader.read(key_data, passphrase) }, [ArgumentError]
203
+ return OpenSSHPrivateKeyType
115
204
  elsif OpenSSL::PKey.respond_to?(:read)
116
- return ->(key_data, passphrase) { OpenSSL::PKey.read(key_data, passphrase) }, [ArgumentError, OpenSSL::PKey::PKeyError]
205
+ return OpenSSLPKeyType
117
206
  elsif data.match(/-----BEGIN DSA PRIVATE KEY-----/)
118
- return ->(key_data, passphrase) { OpenSSL::PKey::DSA.new(key_data, passphrase) }, [OpenSSL::PKey::DSAError]
207
+ return OpenSSLDSAKeyType
119
208
  elsif data.match(/-----BEGIN RSA PRIVATE KEY-----/)
120
- return ->(key_data, passphrase) { OpenSSL::PKey::RSA.new(key_data, passphrase) }, [OpenSSL::PKey::RSAError]
209
+ return OpenSSLRSAKeyType
121
210
  elsif data.match(/-----BEGIN EC PRIVATE KEY-----/) && defined?(OpenSSL::PKey::EC)
122
- return ->(key_data, passphrase) { OpenSSL::PKey::EC.new(key_data, passphrase) }, [OpenSSL::PKey::ECError]
211
+ return OpenSSLECKeyType
123
212
  elsif data.match(/-----BEGIN (.+) PRIVATE KEY-----/)
124
213
  raise OpenSSL::PKey::PKeyError, "not a supported key type '#{$1}'"
125
214
  else
@@ -2,6 +2,7 @@ require 'strscan'
2
2
  require 'openssl'
3
3
  require 'base64'
4
4
  require 'net/ssh/buffer'
5
+ require 'net/ssh/authentication/ed25519_loader'
5
6
 
6
7
  module Net
7
8
  module SSH
@@ -48,18 +49,19 @@ module Net
48
49
  else
49
50
  SUPPORTED_TYPE = %w[ssh-rsa ssh-dss]
50
51
  end
52
+ SUPPORTED_TYPE.push('ssh-ed25519') if Net::SSH::Authentication::ED25519Loader::LOADED
51
53
 
52
54
  class <<self
53
55
  # Searches all known host files (see KnownHosts.hostfiles) for all keys
54
56
  # of the given host. Returns an enumerable of keys found.
55
57
  def search_for(host, options={})
56
- HostKeys.new(search_in(hostfiles(options), host), host, self, options)
58
+ HostKeys.new(search_in(hostfiles(options), host, options), host, self, options)
57
59
  end
58
60
 
59
61
  # Search for all known keys for the given host, in every file given in
60
62
  # the +files+ array. Returns the list of keys.
61
- def search_in(files, host)
62
- files.flat_map { |file| KnownHosts.new(file).keys_for(host) }
63
+ def search_in(files, host, options = {})
64
+ files.flat_map { |file| KnownHosts.new(file).keys_for(host, options) }
63
65
  end
64
66
 
65
67
  # Looks in the given +options+ hash for the :user_known_hosts_file and
@@ -119,11 +121,13 @@ module Net
119
121
  # "[net.ssh.test]:5555"
120
122
  # "[1,2,3,4]:5555"
121
123
  # "[net.ssh.test]:5555,[1.2.3.4]:5555
122
- def keys_for(host)
124
+ def keys_for(host, options = {})
123
125
  keys = []
124
126
  return keys unless File.readable?(source)
125
127
 
126
128
  entries = host.split(/,/)
129
+ host_name = entries[0]
130
+ host_ip = entries[1]
127
131
 
128
132
  File.open(source) do |file|
129
133
  scanner = StringScanner.new("")
@@ -134,8 +138,10 @@ module Net
134
138
  next if scanner.match?(/$|#/)
135
139
 
136
140
  hostlist = scanner.scan(/\S+/).split(/,/)
137
- found = entries.all? { |entry| hostlist.include?(entry) } ||
138
- known_host_hash?(hostlist, entries)
141
+ found = hostlist.any? { |pattern| match(host_name, pattern) } || known_host_hash?(hostlist, entries)
142
+ next unless found
143
+
144
+ found = hostlist.include?(host_ip) if options[:check_host_ip] && entries.size > 1 && hostlist.size > 1
139
145
  next unless found
140
146
 
141
147
  scanner.skip(/\s*/)
@@ -152,6 +158,17 @@ module Net
152
158
  keys
153
159
  end
154
160
 
161
+ def match(host, pattern)
162
+ # see man 8 sshd for pattern details
163
+ pattern_regexp = pattern.split('*').map do |x|
164
+ x.split('?').map do |y|
165
+ Regexp.escape(y)
166
+ end.join('.')
167
+ end.join('[^.]*')
168
+
169
+ host =~ Regexp.new("\\A#{pattern_regexp}\\z")
170
+ end
171
+
155
172
  # Indicates whether one of the entries matches an hostname that has been
156
173
  # stored as a HMAC-SHA1 hash in the known hosts.
157
174
  def known_host_hash?(hostlist, entries)
@@ -279,7 +279,7 @@ module Net
279
279
  # method.
280
280
  class CompatibleVerifier
281
281
  def initialize(verifier)
282
- @verifier
282
+ @verifier = verifier
283
283
  end
284
284
 
285
285
  def verify(arguments)
@@ -49,7 +49,7 @@ module Net
49
49
  MAJOR = 5
50
50
 
51
51
  # The minor component of this version of the Net::SSH library
52
- MINOR = 1
52
+ MINOR = 2
53
53
 
54
54
  # The tiny component of this version of the Net::SSH library
55
55
  TINY = 0
data/lib/net/ssh.rb CHANGED
@@ -73,7 +73,7 @@ module Net
73
73
  max_win_size send_env use_agent number_of_password_prompts
74
74
  append_all_supported_algorithms non_interactive password_prompt
75
75
  agent_socket_factory minimum_dh_bits verify_host_key
76
- fingerprint_hash
76
+ fingerprint_hash check_host_ip
77
77
  ]
78
78
 
79
79
  # The standard means of starting a new SSH connection. When used with a
@@ -108,6 +108,8 @@ module Net
108
108
  # * :bind_address => the IP address on the connecting machine to use in
109
109
  # establishing connection. (:bind_address is discarded if :proxy
110
110
  # is set.)
111
+ # * :check_host_ip => Also ckeck IP address when connecting to remote host.
112
+ # Defaults to +true+.
111
113
  # * :compression => the compression algorithm to use, or +true+ to use
112
114
  # whatever is supported.
113
115
  # * :compression_level => the compression level to use when sending data
@@ -221,6 +223,8 @@ module Net
221
223
  options = configuration_for(host, options.fetch(:config, true)).merge(options)
222
224
  host = options.fetch(:host_name, host)
223
225
 
226
+ options[:check_host_ip] = true unless options.key?(:check_host_ip)
227
+
224
228
  if options[:non_interactive]
225
229
  options[:number_of_password_prompts] = 0
226
230
  end
@@ -1,21 +1,20 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZuZXRz
3
- c2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj
4
- b20wHhcNMTgwMzExMDU0MzU1WhcNMTkwMzExMDU0MzU1WjBBMQ8wDQYDVQQDDAZu
5
- ZXRzc2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ
6
- FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGJ4TbZ9H+qZ08
7
- pQfJhPJTHaDCyQvCsKTFrL5O9z3tllQ7B/zksMMM+qFBpNYu9HCcg4yBATacE/PB
8
- qVVyUrpr6lbH/XwoN5ljXm+bdCfmnjZvTCL2FTE6o+bcnaF0IsJyC0Q2B1fbWdXN
9
- 6Off1ZWoUk6We2BIM1bn6QJLxBpGyYhvOPXsYoqSuzDf2SJDDsWFZ8kV5ON13Ohm
10
- JbBzn0oD8HF8FuYOewwsC0C1q4w7E5GtvHcQ5juweS7+RKsyDcVcVrLuNzoGRttS
11
- KP4yMn+TzaXijyjRg7gECfJr3TGASaA4bQsILFGG5dAWcwO4OMrZedR7SHj/o0Kf
12
- 3gL7P0axAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
13
- BBQF8qLA7Z4zg0SJGtUbv3eoQ8tjIzAfBgNVHREEGDAWgRRuZXRzc2hAc29sdXRp
14
- b3VzLmNvbTAfBgNVHRIEGDAWgRRuZXRzc2hAc29sdXRpb3VzLmNvbTANBgkqhkiG
15
- 9w0BAQsFAAOCAQEAnINf4yDsUx62QPKC2E+5Dj0hN2yUjcYzTGwxyz8x+nCiC0X3
16
- cyjftyEViuKvAKtZ0Uo4OG0x2SZ5O7I45OkUo1bAOFcuYRFYiD1JRlyvl8aB+2Vl
17
- pFyi/4ClnmjNxnplXL+mmScv/4VacBD1/LNBUVNluhLue2yIakAXFy0KthqLzIG8
18
- BYIiexqQMKfkw+auIcyXe1luZnCt6JFksW0BVoZGTj5Sj7sC2+cS4y9XYog1dSks
19
- ZFwoIuXKeDmTTpryd/vI7sdLXDuV6MbWOLGh6gXn9RDDXG1EqEXW0bjovATBMpdH
20
- 9OGohJvAFzcvhDTWPwT6w3PG5B80pqb9j1hEAg==
2
+ MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpuZXRz
3
+ c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0xOTAzMTEwOTQ1MzZaFw0yMDAzMTAw
4
+ OTQ1MzZaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB
5
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxieE22fR/qmdPKUHyYTyUx2g
6
+ wskLwrCkxay+Tvc97ZZUOwf85LDDDPqhQaTWLvRwnIOMgQE2nBPzwalVclK6a+pW
7
+ x/18KDeZY15vm3Qn5p42b0wi9hUxOqPm3J2hdCLCcgtENgdX21nVzejn39WVqFJO
8
+ lntgSDNW5+kCS8QaRsmIbzj17GKKkrsw39kiQw7FhWfJFeTjddzoZiWwc59KA/Bx
9
+ fBbmDnsMLAtAtauMOxORrbx3EOY7sHku/kSrMg3FXFay7jc6BkbbUij+MjJ/k82l
10
+ 4o8o0YO4BAnya90xgEmgOG0LCCxRhuXQFnMDuDjK2XnUe0h4/6NCn94C+z9GsQID
11
+ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUBfKiwO2e
12
+ M4NEiRrVG793qEPLYyMwHwYDVR0RBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20w
13
+ HwYDVR0SBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20wDQYJKoZIhvcNAQELBQAD
14
+ ggEBAILNXrrFaLruwlBoTx3F7iL5wiRUT+cOMfdon25gzX8Tf87hi6rITnRgFfak
15
+ w+C/rbrYOuEfUJMeZSU5ASxzrB4ohgJ5AFxuxGNkWEQJC4nICGn3ML8PmHzEV12z
16
+ +nMm9AtBM16dJTdTKA2B6du0ZtTtbm4M3ULB7rhkUO2L2RbDyyiGQw85IBdaVdzr
17
+ GmrxZPAOhBABOREsvJU1+3GIyJncqXmtrYUGUoLiIf/WO0mxPzYALZC/6ZYfu2UP
18
+ +MqVFjDxsJA7cDfACke51RypSH1gZoPjzoW6w0sMRAzZT8hU1eGyqtNuBiSZ1UKv
19
+ B/ztNLEP0OWhpj/NZ1fnGRvo/T0=
21
20
  -----END CERTIFICATE-----
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamis Buck
@@ -12,27 +12,26 @@ bindir: exe
12
12
  cert_chain:
13
13
  - |
14
14
  -----BEGIN CERTIFICATE-----
15
- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZuZXRz
16
- c2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj
17
- b20wHhcNMTgwMzExMDU0MzU1WhcNMTkwMzExMDU0MzU1WjBBMQ8wDQYDVQQDDAZu
18
- ZXRzc2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ
19
- FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGJ4TbZ9H+qZ08
20
- pQfJhPJTHaDCyQvCsKTFrL5O9z3tllQ7B/zksMMM+qFBpNYu9HCcg4yBATacE/PB
21
- qVVyUrpr6lbH/XwoN5ljXm+bdCfmnjZvTCL2FTE6o+bcnaF0IsJyC0Q2B1fbWdXN
22
- 6Off1ZWoUk6We2BIM1bn6QJLxBpGyYhvOPXsYoqSuzDf2SJDDsWFZ8kV5ON13Ohm
23
- JbBzn0oD8HF8FuYOewwsC0C1q4w7E5GtvHcQ5juweS7+RKsyDcVcVrLuNzoGRttS
24
- KP4yMn+TzaXijyjRg7gECfJr3TGASaA4bQsILFGG5dAWcwO4OMrZedR7SHj/o0Kf
25
- 3gL7P0axAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
26
- BBQF8qLA7Z4zg0SJGtUbv3eoQ8tjIzAfBgNVHREEGDAWgRRuZXRzc2hAc29sdXRp
27
- b3VzLmNvbTAfBgNVHRIEGDAWgRRuZXRzc2hAc29sdXRpb3VzLmNvbTANBgkqhkiG
28
- 9w0BAQsFAAOCAQEAnINf4yDsUx62QPKC2E+5Dj0hN2yUjcYzTGwxyz8x+nCiC0X3
29
- cyjftyEViuKvAKtZ0Uo4OG0x2SZ5O7I45OkUo1bAOFcuYRFYiD1JRlyvl8aB+2Vl
30
- pFyi/4ClnmjNxnplXL+mmScv/4VacBD1/LNBUVNluhLue2yIakAXFy0KthqLzIG8
31
- BYIiexqQMKfkw+auIcyXe1luZnCt6JFksW0BVoZGTj5Sj7sC2+cS4y9XYog1dSks
32
- ZFwoIuXKeDmTTpryd/vI7sdLXDuV6MbWOLGh6gXn9RDDXG1EqEXW0bjovATBMpdH
33
- 9OGohJvAFzcvhDTWPwT6w3PG5B80pqb9j1hEAg==
15
+ MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpuZXRz
16
+ c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0xOTAzMTEwOTQ1MzZaFw0yMDAzMTAw
17
+ OTQ1MzZaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB
18
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxieE22fR/qmdPKUHyYTyUx2g
19
+ wskLwrCkxay+Tvc97ZZUOwf85LDDDPqhQaTWLvRwnIOMgQE2nBPzwalVclK6a+pW
20
+ x/18KDeZY15vm3Qn5p42b0wi9hUxOqPm3J2hdCLCcgtENgdX21nVzejn39WVqFJO
21
+ lntgSDNW5+kCS8QaRsmIbzj17GKKkrsw39kiQw7FhWfJFeTjddzoZiWwc59KA/Bx
22
+ fBbmDnsMLAtAtauMOxORrbx3EOY7sHku/kSrMg3FXFay7jc6BkbbUij+MjJ/k82l
23
+ 4o8o0YO4BAnya90xgEmgOG0LCCxRhuXQFnMDuDjK2XnUe0h4/6NCn94C+z9GsQID
24
+ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUBfKiwO2e
25
+ M4NEiRrVG793qEPLYyMwHwYDVR0RBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20w
26
+ HwYDVR0SBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20wDQYJKoZIhvcNAQELBQAD
27
+ ggEBAILNXrrFaLruwlBoTx3F7iL5wiRUT+cOMfdon25gzX8Tf87hi6rITnRgFfak
28
+ w+C/rbrYOuEfUJMeZSU5ASxzrB4ohgJ5AFxuxGNkWEQJC4nICGn3ML8PmHzEV12z
29
+ +nMm9AtBM16dJTdTKA2B6du0ZtTtbm4M3ULB7rhkUO2L2RbDyyiGQw85IBdaVdzr
30
+ GmrxZPAOhBABOREsvJU1+3GIyJncqXmtrYUGUoLiIf/WO0mxPzYALZC/6ZYfu2UP
31
+ +MqVFjDxsJA7cDfACke51RypSH1gZoPjzoW6w0sMRAzZT8hU1eGyqtNuBiSZ1UKv
32
+ B/ztNLEP0OWhpj/NZ1fnGRvo/T0=
34
33
  -----END CERTIFICATE-----
35
- date: 2018-12-28 00:00:00.000000000 Z
34
+ date: 2019-03-11 00:00:00.000000000 Z
36
35
  dependencies:
37
36
  - !ruby/object:Gem::Dependency
38
37
  name: bcrypt_pbkdf
metadata.gz.sig CHANGED
Binary file