net-ssh 5.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
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