vagrant-unbundled 2.2.14.0 → 2.2.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +52 -0
  3. data/bin/vagrant +27 -1
  4. data/contrib/README.md +1 -1
  5. data/lib/vagrant.rb +3 -1
  6. data/lib/vagrant/action/builtin/box_add.rb +13 -3
  7. data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
  8. data/lib/vagrant/bundler.rb +15 -5
  9. data/lib/vagrant/environment.rb +1 -0
  10. data/lib/vagrant/errors.rb +12 -0
  11. data/lib/vagrant/machine_index.rb +1 -1
  12. data/lib/vagrant/patches/net-ssh.rb +186 -0
  13. data/lib/vagrant/plugin/manager.rb +20 -2
  14. data/lib/vagrant/util.rb +1 -0
  15. data/lib/vagrant/util/curl_helper.rb +7 -6
  16. data/lib/vagrant/util/guest_hosts.rb +1 -1
  17. data/lib/vagrant/util/numeric.rb +20 -0
  18. data/lib/vagrant/util/powershell.rb +30 -14
  19. data/lib/vagrant/vagrantfile.rb +1 -1
  20. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
  21. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +34 -27
  22. data/plugins/commands/cloud/client/client.rb +10 -3
  23. data/plugins/commands/cloud/locales/en.yml +5 -1
  24. data/plugins/commands/cloud/provider/upload.rb +10 -0
  25. data/plugins/commands/cloud/publish.rb +10 -0
  26. data/plugins/commands/cloud/util.rb +10 -2
  27. data/plugins/commands/destroy/command.rb +1 -5
  28. data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
  29. data/plugins/guests/fedora/guest.rb +4 -4
  30. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +1 -1
  31. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +1 -2
  32. data/plugins/guests/linux/cap/reboot.rb +21 -3
  33. data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
  34. data/plugins/guests/openwrt/cap/halt.rb +16 -0
  35. data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
  36. data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
  37. data/plugins/guests/openwrt/cap/rsync.rb +35 -0
  38. data/plugins/guests/openwrt/guest.rb +23 -0
  39. data/plugins/guests/openwrt/plugin.rb +61 -0
  40. data/plugins/providers/docker/driver.rb +2 -2
  41. data/plugins/providers/virtualbox/action/network.rb +12 -5
  42. data/plugins/providers/virtualbox/cap/mount_options.rb +5 -0
  43. data/plugins/providers/virtualbox/plugin.rb +5 -0
  44. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
  45. data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
  46. data/plugins/synced_folders/smb/cap/mount_options.rb +2 -2
  47. data/templates/commands/init/Vagrantfile.min.erb +3 -0
  48. data/templates/guests/nixos/network.erb +5 -6
  49. data/templates/locales/en.yml +21 -4
  50. data/vagrant.gemspec +5 -11
  51. data/version.txt +1 -1
  52. metadata +2921 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 66676a3a6dbd082059b30ec7f0e605c435d33bc9854a2db0184457ba735939b0
4
- data.tar.gz: 742ad824c94d7329205e98578cb6fcd4c6c756919e09966c9a83ea23a13fd32f
3
+ metadata.gz: 84c5c51fc0678552529c308c36ba4c93114e71aee93c062b7993ad7bc4bab6d8
4
+ data.tar.gz: 7ad1f71440d48b09436fde379347a1008fc32ad7e9378187750bb3421b94e202
5
5
  SHA512:
6
- metadata.gz: 88acd31085bcda4390bc37d58078a2be3b6b16f09cd4605c34d9874cbd92ac2b73d36f5e8f9761b5d4396338555aae682baeeaf7603c46f9f6643277a5bfd330
7
- data.tar.gz: d31c929eb5c9f55ee68e1d11b96704bb75193b2f8314edd1515e793a20338d2b650f05da038d4efa27802d0e5b5f193d9083b6b5a761dc4af02bb33830a9ee0a
6
+ metadata.gz: c643c0795943406343de52a7db6e85e9114336133cdc89105abcaee498c9547efc9530788bfc797df2b893240dbdeff3f57c6a65622cf335b255e1bbe09d2b26
7
+ data.tar.gz: 2ef84ae4bd47a7e4a0026be3f60d86369c95103659bfdc32ecee8f340191643b8518e0a948e5d446b982af6bfa3230ecbd388166ba4334c3d8e310f56cb003d3
data/CHANGELOG.md CHANGED
@@ -1,8 +1,56 @@
1
+ ## 2.2.16 (April 29, 2021)
2
+
3
+ IMPROVEMENTS:
4
+
5
+ - guest/linux: Detect in process shutdown in reboot capability [GH-12302]
6
+ - util/powershell: Support `pwsh` executable in new versions of powershell [GH-12335]
7
+
8
+ BUG FIXES:
9
+
10
+ - core: Add box directly with authed urls [GH-12278]
11
+ - communicator/ssh: Properly handle authentication with RSA keys [GH-12298]
12
+ - guest/fedora: Import guest detection module [GH-12275]
13
+ - guest/linux: Fix SMB folder mount name capability call [GH-12281]
14
+ - provider/docker: Properly handle updated buildkit build output [GH-12300]
15
+
16
+ ## 2.2.15 (March 30, 2021)
17
+
18
+ IMPROVEMENTS:
19
+
20
+ - command/cloud: Remove access token URL parameter by default [GH-12234]
21
+ - command/cloud: Add VAGRANT_SERVER_ACCESS_TOKEN_BY_URL to revert access token behavior [GH-12252]
22
+ - core: Bump vagrant_cloud dependency to 3.0.3 [GH-12200]
23
+ - core: Bump listen gem version and remove ruby_dep [GH-12148]
24
+ - core: Bump vagrant_cloud dependency to 3.0.4 [GH-12242]
25
+ - core/bundler: Update resolution handling when outside of installer and bundler [GH-12225]
26
+ - core/plugin: Provide friendlier error messages on install fail when possible [GH-12225]
27
+ - guest/openwrt: Add support for OpenWrt guests [GH-11791]
28
+ - guest/freebsd: FreeBSD updated ansible to py37-ansible [GH-12201]
29
+ - provider/virtualbox: Get default dhcp ip from a matching host ip [GH-12211]
30
+ - util/downloader: Prevent redirect notification for default store [GH-12235]
31
+
32
+ BUG FIXES:
33
+
34
+ - command/cloud: Automatically disable direct uploads when file is too large [GH-12250]
35
+ - core: Make shell script for loop shell agnostic [GH-12205]
36
+ - core: Raise error if downloading box metadata fails [GH-12189]
37
+ - core: Apply download options to metadata requests [GH-12177]
38
+ - core: Don't try to find "" by prefix in the machine index [GH-12188]
39
+ - core: Don't count not created machines as declined when destroying [GH-12186]
40
+ - core: Bump bcrypt_pbkdf version [GH-12216]
41
+ - core: Remove all space from checksums [GH-12168]
42
+ - core/bundler: Do not include default gems as pinned constraints [GH-12253]
43
+ - core/synced_folders: Extract os friendly mount name for vbox shared folders [GH-12184]
44
+ - guest/alpine: Check if interface exists before shutting it down [GH-12181]
45
+ - guest/nixos: Fix network config for recent NixOS releases [GH-12152]
46
+ - guest/fedora: Detect fedora using os-releases id [GH-12230]
47
+
1
48
  ## 2.2.14 (November 20, 2020)
2
49
 
3
50
  IMPROVEMENTS:
4
51
 
5
52
  - host/windows: Update filesystem type matching on WSL2 [GH-12056]
53
+ - provisioner/salt: Modernize Salt bootstrap script [GH-12135]
6
54
 
7
55
  BUG FIXES:
8
56
 
@@ -3363,6 +3411,10 @@ BACKWARDS INCOMPATIBILITIES:
3363
3411
  format, but this is _opt-in_. Old Vagrantfile format continues to be supported,
3364
3412
  as promised. To use the new features that will be introduced throughout
3365
3413
  the 1.x series, you'll have to upgrade at some point.
3414
+ - The .vagrant file is no longer supported and has been replaced by
3415
+ a .vagrant directory. Running vagrant will automatically upgrade
3416
+ to the new style directory format, after which old versions of
3417
+ Vagrant will not be able to see or control your VM.
3366
3418
 
3367
3419
  FEATURES:
3368
3420
 
data/bin/vagrant CHANGED
@@ -23,9 +23,9 @@ if idx = argv.index("--")
23
23
  argv = argv.slice(0, idx)
24
24
  end
25
25
 
26
+ require_relative "../lib/vagrant/version"
26
27
  # Fast path the version of Vagrant
27
28
  if argv.include?("-v") || argv.include?("--version")
28
- require_relative "../lib/vagrant/version"
29
29
  puts "Vagrant #{Vagrant::VERSION}"
30
30
  exit 0
31
31
  end
@@ -82,6 +82,29 @@ end
82
82
  $stdout.sync = true
83
83
  $stderr.sync = true
84
84
 
85
+ # Before we start activate all our dependencies
86
+ # so we can provide correct resolutions later
87
+ builtin_specs = []
88
+
89
+ vagrant_spec = Gem::Specification.find_all_by_name("vagrant").detect do |spec|
90
+ spec.version == Gem::Version.new(Vagrant::VERSION)
91
+ end
92
+
93
+ dep_activator = proc do |spec|
94
+ spec.runtime_dependencies.each do |dep|
95
+ gem(dep.name, *dep.requirement.as_list)
96
+ dep_spec = Gem::Specification.find_all_by_name(dep.name).detect(&:activated?)
97
+ if dep_spec
98
+ builtin_specs << dep_spec
99
+ dep_activator.call(dep_spec)
100
+ end
101
+ end
102
+ end
103
+
104
+ if vagrant_spec
105
+ dep_activator.call(vagrant_spec)
106
+ end
107
+
85
108
  env = nil
86
109
  begin
87
110
  require 'log4r'
@@ -91,6 +114,9 @@ begin
91
114
  require 'vagrant/util/platform'
92
115
  require 'vagrant/util/experimental'
93
116
 
117
+ # Set our list of builtin specs
118
+ Vagrant::Bundler.instance.builtin_specs = builtin_specs
119
+
94
120
  # Schedule the cleanup of things
95
121
  at_exit(&Vagrant::Bundler.instance.method(:deinit))
96
122
 
data/contrib/README.md CHANGED
@@ -14,4 +14,4 @@ for each item will be kept below.
14
14
  starting machines.
15
15
  * `vim` - Contains a `.vim` file for enabling Ruby syntax highlighting
16
16
  for `Vagrantfile`s in `vim`.
17
- * `zsh` - Contains a zsh script for improving autocompletion with zsh.
17
+ * `zsh` - Contains a zsh script for improving autocompletion with zsh.
data/lib/vagrant.rb CHANGED
@@ -9,6 +9,8 @@ class Log4r::BasicFormatter
9
9
  end
10
10
  end
11
11
 
12
+ # Add our patches to net-ssh
13
+ require "vagrant/patches/net-ssh"
12
14
 
13
15
  require "optparse"
14
16
 
@@ -79,7 +81,7 @@ if ENV["VAGRANT_LOG"] && ENV["VAGRANT_LOG"] != ""
79
81
  # See https://github.com/rest-client/rest-client/issues/34#issuecomment-290858
80
82
  # for more information
81
83
  class VagrantLogger < Log4r::Logger
82
- def << (msg)
84
+ def << msg
83
85
  debug(msg.strip)
84
86
  end
85
87
  end
@@ -108,6 +108,14 @@ module Vagrant
108
108
  end
109
109
  end
110
110
 
111
+ is_error = is_metadata_results.find do |b|
112
+ b.is_a?(Errors::DownloaderError)
113
+ end
114
+ if is_error
115
+ raise Errors::BoxMetadataDownloadError,
116
+ message: is_error.extra_data[:message]
117
+ end
118
+
111
119
  is_metadata = is_metadata_results.any? { |b| b === true }
112
120
  if is_metadata && url.length > 1
113
121
  raise Errors::BoxAddMetadataMultiURL,
@@ -118,7 +126,7 @@ module Vagrant
118
126
  url = [url.first, authed_urls.first]
119
127
  add_from_metadata(url, env, expanded)
120
128
  else
121
- add_direct(url, env)
129
+ add_direct(authed_urls, env)
122
130
  end
123
131
 
124
132
  @app.call(env)
@@ -538,11 +546,13 @@ module Vagrant
538
546
  !!(match.last.chomp =~ /application\/json/)
539
547
  end
540
548
 
541
- def validate_checksum(checksum_type, checksum, path)
549
+ def validate_checksum(checksum_type, _checksum, path)
550
+ checksum = _checksum.strip()
542
551
  @logger.info("Validating checksum with #{checksum_type}")
543
552
  @logger.info("Expected checksum: #{checksum}")
544
553
 
545
- actual = FileChecksum.new(path, checksum_type).checksum
554
+ _actual = FileChecksum.new(path, checksum_type).checksum
555
+ actual = _actual.strip()
546
556
  @logger.info("Actual checksum: #{actual}")
547
557
  if actual.casecmp(checksum) != 0
548
558
  raise Errors::BoxChecksumMismatch,
@@ -46,7 +46,8 @@ module Vagrant
46
46
  client_cert: env[:client_cert] ||
47
47
  machine.config.vm.box_download_client_cert,
48
48
  insecure: !env[:insecure].nil? ?
49
- env[:insecure] : machine.config.vm.box_download_insecure
49
+ env[:insecure] : machine.config.vm.box_download_insecure,
50
+ box_extra_download_options: env[:box_extra_download_options] || machine.config.vm.box_extra_download_options,
50
51
  }
51
52
 
52
53
  env[:ui].output(I18n.t(
@@ -189,8 +189,11 @@ module Vagrant
189
189
  attr_reader :env_plugin_gem_path
190
190
  # @return [Pathname] Vagrant environment data path
191
191
  attr_reader :environment_data_path
192
+ # @return [Array<Gem::Specification>, nil] List of builtin specs
193
+ attr_accessor :builtin_specs
192
194
 
193
195
  def initialize
196
+ @builtin_specs = []
194
197
  @plugin_gem_path = Vagrant.user_data_path.join("gems", RUBY_VERSION).freeze
195
198
  @logger = Log4r::Logger.new("vagrant::bundler")
196
199
  end
@@ -287,7 +290,6 @@ module Vagrant
287
290
  # Never allow dependencies to be remotely satisfied during init
288
291
  request_set.remote = false
289
292
 
290
- repair_result = nil
291
293
  begin
292
294
  @logger.debug("resolving solution from available specification set")
293
295
  # Resolve the request set to ensure proper activation order
@@ -514,6 +516,9 @@ module Vagrant
514
516
  @logger.debug("Enabling strict dependency enforcement")
515
517
  plugin_deps += vagrant_internal_specs.map do |spec|
516
518
  next if system_plugins.include?(spec.name)
519
+ # If this spec is for a default plugin included in
520
+ # the ruby stdlib, ignore it
521
+ next if spec.default_gem?
517
522
  # If we are not running within the installer and
518
523
  # we are not within a bundler environment then we
519
524
  # only want activated specs
@@ -647,7 +652,6 @@ module Vagrant
647
652
  self_spec.activate
648
653
  @logger.info("Activated vagrant specification version - #{self_spec.version}")
649
654
  end
650
- self_spec.runtime_dependencies.each { |d| gem d.name, *d.requirement.as_list }
651
655
  # discover all the gems we have available
652
656
  list = {}
653
657
  if Gem.respond_to?(:default_specifications_dir)
@@ -656,10 +660,16 @@ module Vagrant
656
660
  spec_dir = Gem::Specification.default_specifications_dir
657
661
  end
658
662
  directories = [spec_dir]
659
- Gem::Specification.find_all{true}.each do |spec|
660
- list[spec.full_name] = spec
663
+ if Vagrant.in_bundler?
664
+ Gem::Specification.find_all{true}.each do |spec|
665
+ list[spec.full_name] = spec
666
+ end
667
+ else
668
+ builtin_specs.each do |spec|
669
+ list[spec.full_name] = spec
670
+ end
661
671
  end
662
- if(!Object.const_defined?(:Bundler))
672
+ if Vagrant.in_installer?
663
673
  directories += Gem::Specification.dirs.find_all do |path|
664
674
  !path.start_with?(Gem.user_dir)
665
675
  end
@@ -517,6 +517,7 @@ module Vagrant
517
517
  # @param [Action::Runner] action_runner A custom action runner for running hooks.
518
518
  def hook(name, opts=nil)
519
519
  @logger.info("Running hook: #{name}")
520
+
520
521
  opts ||= {}
521
522
  opts[:callable] ||= Action::Builder.new
522
523
  opts[:runner] ||= action_runner
@@ -636,6 +636,18 @@ module Vagrant
636
636
  error_key(:provisioner_winrm_unsupported)
637
637
  end
638
638
 
639
+ class PluginNeedsDeveloperTools < VagrantError
640
+ error_key(:plugin_needs_developer_tools)
641
+ end
642
+
643
+ class PluginMissingLibrary < VagrantError
644
+ error_key(:plugin_missing_library)
645
+ end
646
+
647
+ class PluginMissingRubyDev < VagrantError
648
+ error_key(:plugin_missing_ruby_dev)
649
+ end
650
+
639
651
  class PluginGemNotFound < VagrantError
640
652
  error_key(:plugin_gem_not_found)
641
653
  end
@@ -263,7 +263,7 @@ module Vagrant
263
263
  #
264
264
  # @return [Hash]
265
265
  def find_by_prefix(prefix)
266
- return if !prefix
266
+ return if !prefix || prefix == ""
267
267
  @machines.each do |uuid, data|
268
268
  return data.merge("id" => uuid) if uuid.start_with?(prefix)
269
269
  end
@@ -0,0 +1,186 @@
1
+ require "net/ssh"
2
+
3
+ # Only patch if we have version 6.1.0 loaded as
4
+ # these patches pull 6.1.0 up to the as of now
5
+ # current 6.2.0 beta
6
+ if Net::SSH::Version::STRING == "6.1.0"
7
+ require "net/ssh/authentication/methods/publickey"
8
+ Net::SSH::Authentication::Methods::Publickey.class_eval do
9
+ def rsa_compat_build_request(pub_key, *args)
10
+ s_ver_str = session.transport.server_version.version.match(/OpenSSH_(?<version>\d+\.\d+)/)[:version]
11
+ begin
12
+ s_ver = Gem::Version.new(s_ver_str)
13
+ if s_ver >= Gem::Version.new("7.2") && pub_key.is_a?(OpenSSL::PKey::RSA)
14
+ pub_key.deprecated_ssh_rsa = true
15
+ debug { "public key has been marked for deprecated ssh-rsa SHA1 behavior" }
16
+ info = key_manager.known_identities[pub_key]
17
+ if info && info[:key]
18
+ info[:key].deprecated_ssh_rsa = true
19
+ debug { "private key has been marked for deprecated ssh-rsa SHA1 behavior" }
20
+ else
21
+ warn { "cannot deprecate ssh rsa on private key, not loaded (#{info[:file]})" }
22
+ end
23
+ end
24
+ rescue ArgumentError
25
+ warn { "failed to parse OpenSSH version (raw: #{session.transport.server_version.version} attempted: #{s_ver_str}" }
26
+ end
27
+ _raw_build_request(pub_key, *args)
28
+ end
29
+ alias_method :_raw_build_request, :build_request
30
+ alias_method :build_request, :rsa_compat_build_request
31
+ end
32
+
33
+ require "net/ssh/authentication/agent"
34
+ # net/ssh/authentication/agent
35
+ Net::SSH::Authentication::Agent.class_eval do
36
+ SSH2_AGENT_LOCK = 22
37
+ SSH2_AGENT_UNLOCK = 23
38
+
39
+ # lock the ssh agent with password
40
+ def lock(password)
41
+ type, = send_and_wait(SSH2_AGENT_LOCK, :string, password)
42
+ raise AgentError, "could not lock agent" if type != SSH_AGENT_SUCCESS
43
+ end
44
+
45
+ # unlock the ssh agent with password
46
+ def unlock(password)
47
+ type, = send_and_wait(SSH2_AGENT_UNLOCK, :string, password)
48
+ raise AgentError, "could not unlock agent" if type != SSH_AGENT_SUCCESS
49
+ end
50
+ end
51
+
52
+ require "net/ssh/authentication/certificate"
53
+ # net/ssh/authentication/certificate
54
+ Net::SSH::Authentication::Certificate.class_eval do
55
+ def ssh_do_verify(sig, data, options = {})
56
+ key.ssh_do_verify(sig, data, options)
57
+ end
58
+ end
59
+
60
+ require "net/ssh/authentication/ed25519"
61
+ # net/ssh/authentication/ed25519
62
+ Net::SSH::Authentication::ED25519::PubKey.class_eval do
63
+ def ssh_do_verify(sig, data, options = {})
64
+ @verify_key.verify(sig,data)
65
+ end
66
+ end
67
+
68
+ require "net/ssh/transport/algorithms"
69
+ # net/ssh/transport/algorithms
70
+ Net::SSH::Transport::Algorithms::DEFAULT_ALGORITHMS[:host_key].push("rsa-sha2-256").push("rsa-sha2-512")
71
+
72
+ require "net/ssh/transport/cipher_factory"
73
+ # net/ssh/transport/cipher_factory
74
+ Net::SSH::Transport::CipherFactory::SSH_TO_OSSL["aes256-ctr"] = ::OpenSSL::Cipher.ciphers.include?("aes-256-ctr") ? "aes-256-ctr" : "aes-256-ecb"
75
+ Net::SSH::Transport::CipherFactory::SSH_TO_OSSL["aes192-ctr"] = ::OpenSSL::Cipher.ciphers.include?("aes-192-ctr") ? "aes-192-ctr" : "aes-192-ecb"
76
+ Net::SSH::Transport::CipherFactory::SSH_TO_OSSL["aes128-ctr"] = ::OpenSSL::Cipher.ciphers.include?("aes-128-ctr") ? "aes-128-ctr" : "aes-128-ecb"
77
+
78
+ require "net/ssh/transport/kex/abstract"
79
+ # net/ssh/transport/kex/abstract
80
+ Net::SSH::Transport::Kex::Abstract.class_eval do
81
+ def matching?(key_ssh_type, host_key_alg)
82
+ return true if key_ssh_type == host_key_alg
83
+ return true if key_ssh_type == 'ssh-rsa' && ['rsa-sha2-512', 'rsa-sha2-256'].include?(host_key_alg)
84
+ end
85
+
86
+ def verify_server_key(key) #:nodoc:
87
+ unless matching?(key.ssh_type, algorithms.host_key)
88
+ raise Net::SSH::Exception, "host key algorithm mismatch '#{key.ssh_type}' != '#{algorithms.host_key}'"
89
+ end
90
+
91
+ blob, fingerprint = generate_key_fingerprint(key)
92
+
93
+ unless connection.host_key_verifier.verify(key: key, key_blob: blob, fingerprint: fingerprint, session: connection)
94
+ raise Net::SSH::Exception, 'host key verification failed'
95
+ end
96
+ end
97
+
98
+ def verify_signature(result) #:nodoc:
99
+ response = build_signature_buffer(result)
100
+
101
+ hash = digester.digest(response.to_s)
102
+
103
+ server_key = result[:server_key]
104
+ server_sig = result[:server_sig]
105
+ unless connection.host_key_verifier.verify_signature { server_key.ssh_do_verify(server_sig, hash, host_key: algorithms.host_key) }
106
+ raise Net::SSH::Exception, 'could not verify server signature'
107
+ end
108
+
109
+ hash
110
+ end
111
+ end
112
+
113
+ require "net/ssh/transport/openssl"
114
+ # net/ssh/transport/openssl
115
+ OpenSSL::PKey::RSA.class_eval do
116
+ attr_accessor :deprecated_ssh_rsa
117
+
118
+ def ssh_do_verify(sig, data, options = {})
119
+ digester =
120
+ if options[:host_key] == "rsa-sha2-512"
121
+ OpenSSL::Digest::SHA512.new
122
+ elsif options[:host_key] == "rsa-sha2-256"
123
+ OpenSSL::Digest::SHA256.new
124
+ else
125
+ OpenSSL::Digest::SHA1.new
126
+ end
127
+
128
+ verify(digester, sig, data)
129
+ end
130
+
131
+ def ssh_type
132
+ deprecated_ssh_rsa ? signature_algorithm : "ssh-rsa"
133
+ end
134
+
135
+ def signature_algorithm
136
+ "rsa-sha2-256"
137
+ end
138
+
139
+ def ssh_do_sign(data)
140
+ if deprecated_ssh_rsa
141
+ sign(OpenSSL::Digest::SHA256.new, data)
142
+ else
143
+ sign(OpenSSL::Digest::SHA1.new, data)
144
+ end
145
+ end
146
+ end
147
+
148
+ OpenSSL::PKey::DSA.class_eval do
149
+ def ssh_do_verify(sig, data, options = {})
150
+ sig_r = sig[0,20].unpack("H*")[0].to_i(16)
151
+ sig_s = sig[20,20].unpack("H*")[0].to_i(16)
152
+ a1sig = OpenSSL::ASN1::Sequence([
153
+ OpenSSL::ASN1::Integer(sig_r),
154
+ OpenSSL::ASN1::Integer(sig_s)
155
+ ])
156
+ return verify(OpenSSL::Digest::SHA1.new, a1sig.to_der, data)
157
+ end
158
+ end
159
+
160
+ OpenSSL::PKey::EC.class_eval do
161
+ def ssh_do_verify(sig, data, options = {})
162
+ digest = digester.digest(data)
163
+ a1sig = nil
164
+
165
+ begin
166
+ sig_r_len = sig[0, 4].unpack('H*')[0].to_i(16)
167
+ sig_l_len = sig[4 + sig_r_len, 4].unpack('H*')[0].to_i(16)
168
+
169
+ sig_r = sig[4, sig_r_len].unpack('H*')[0]
170
+ sig_s = sig[4 + sig_r_len + 4, sig_l_len].unpack('H*')[0]
171
+
172
+ a1sig = OpenSSL::ASN1::Sequence([
173
+ OpenSSL::ASN1::Integer(sig_r.to_i(16)),
174
+ OpenSSL::ASN1::Integer(sig_s.to_i(16))
175
+ ])
176
+ rescue StandardError
177
+ end
178
+
179
+ if a1sig.nil?
180
+ return false
181
+ else
182
+ dsa_verify_asn1(digest, a1sig.to_der)
183
+ end
184
+ end
185
+ end
186
+ end