Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rubygem-net-ssh for openSUSE:Factory checked in at 2023-11-05 12:18:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-net-ssh (Old) and /work/SRC/openSUSE:Factory/.rubygem-net-ssh.new.17445 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-net-ssh" Sun Nov 5 12:18:43 2023 rev:36 rq:1123183 version:7.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-net-ssh/rubygem-net-ssh.changes 2022-09-27 20:13:08.845723369 +0200 +++ /work/SRC/openSUSE:Factory/.rubygem-net-ssh.new.17445/rubygem-net-ssh.changes 2023-11-05 12:18:57.117484946 +0100 @@ -1,0 +2,39 @@ +Fri Nov 3 07:47:49 UTC 2023 - Dan Äermák <dan.cer...@posteo.net> + +- === 7.2.0 + + * Add debugging information for algorithm of pubkey in use [#918] + +=== 7.2.0 rc1 + + * Allow IdentityAgent as option to Net::SSH.start [#912] + +=== 7.2.0 beta1 + + * Support `chacha20-poly1...@opnessh.com` cypher if `RbNaCl` gem is installed [#908] + +=== 7.1.0 + + * Accept pubkey_algorithms option when starting a new connection [#891] + +=== 7.1.0 beta1 + + * Don't use the deprecated set_XXX methods on RSA keys. [#875] + * Raise error when BCryptPbkdf fails [#876] + +=== 7.0.1 + + * Drop leftover debug statement [#866] + +=== 7.0.0 + + * BREAKING: Drop support for Ruby 2.5 + * Fix decoding of ecdsa-sha2-nistp256 private keys [#657, #854] + * Fix missing require [#855] + * Support `~` in the path to the SSH agent's unix socket [#850] + * Add support for RSA client authentication with SHA-2 [a45f54] + * openssl: DSA: don't hardcode expected signature size, see ruby/openssl#483 [23a15c] + * Internal housekeeping (rubocop, codecov, remove travis, adding/improving tests) + + +------------------------------------------------------------------- Old: ---- net-ssh-7.0.1.gem New: ---- net-ssh-7.2.0.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-net-ssh.spec ++++++ --- /var/tmp/diff_new_pack.lViEYw/_old 2023-11-05 12:18:57.917514294 +0100 +++ /var/tmp/diff_new_pack.lViEYw/_new 2023-11-05 12:18:57.917514294 +0100 @@ -1,7 +1,7 @@ # # spec file for package rubygem-net-ssh # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,7 @@ # Name: rubygem-net-ssh -Version: 7.0.1 +Version: 7.2.0 Release: 0 %define mod_name net-ssh %define mod_full_name %{mod_name}-%{version} @@ -34,16 +34,14 @@ %define rb_build_ruby_abis ruby:3.1.0 ruby:2.7.0 %endif # /MANUAL -BuildRoot: %{_tmppath}/%{name}-%{version}-build +BuildRequires: ruby-macros >= 5 BuildRequires: %{ruby >= 2.6} BuildRequires: %{rubygem gem2rpm} -BuildRequires: ruby-macros >= 5 URL: https://github.com/net-ssh/net-ssh Source: https://rubygems.org/gems/%{mod_full_name}.gem Source1: gem2rpm.yml Summary: Net::SSH: a pure-Ruby implementation of the SSH2 client protocol License: MIT -Group: Development/Languages/Ruby %description Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It allows @@ -56,7 +54,7 @@ %install %gem_install \ - --no-document \ + --no-rdoc --no-ri \ --doc-files="CHANGES.txt LICENSE.txt README.md" \ -f ++++++ net-ssh-7.0.1.gem -> net-ssh-7.2.0.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.github/FUNDING.yml new/.github/FUNDING.yml --- old/.github/FUNDING.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/.github/FUNDING.yml 2023-07-30 12:54:48.000000000 +0200 @@ -0,0 +1 @@ +github: [mfazekas] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.github/workflows/ci-with-docker.yml new/.github/workflows/ci-with-docker.yml --- old/.github/workflows/ci-with-docker.yml 2022-06-26 07:02:04.000000000 +0200 +++ new/.github/workflows/ci-with-docker.yml 2023-07-30 12:54:48.000000000 +0200 @@ -12,7 +12,7 @@ steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build docker images run: docker-compose build @@ -35,7 +35,7 @@ steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build docker images run: docker build -t netssh_openssl3 -f Dockerfile.openssl3 . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.github/workflows/ci.yml new/.github/workflows/ci.yml --- old/.github/workflows/ci.yml 2022-06-26 07:02:04.000000000 +0200 +++ new/.github/workflows/ci.yml 2023-07-30 12:54:48.000000000 +0200 @@ -4,12 +4,12 @@ push: { branches: master } jobs: test: - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04 strategy: matrix: - ruby-version: [2.6.6, 2.7.2, 3.0.1, 3.1.1] + ruby-version: [2.6.10, 2.7.7, 3.0.6, 3.1.3, 3.2.1] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Set up Ruby ${{ matrix.ruby-version }} uses: ruby/setup-ruby@v1 @@ -77,6 +77,12 @@ env: NET_SSH_RUN_INTEGRATION_TESTS: 1 CI: 1 + - name: Run tests (without rbnacl) + run: bundle exec rake test + env: + BUNDLE_GEMFILE: ./Gemfile.norbnacl + NET_SSH_RUN_INTEGRATION_TESTS: 1 + CI: 1 - name: Run Tests (without ed25519) run: bundle exec rake test env: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.github/workflows/rubocop.yml new/.github/workflows/rubocop.yml --- old/.github/workflows/rubocop.yml 2022-06-26 07:02:04.000000000 +0200 +++ new/.github/workflows/rubocop.yml 2023-07-30 12:54:48.000000000 +0200 @@ -6,8 +6,11 @@ build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Rubocop Linter Action - uses: andrewmcodes/rubocop-linter-action@v3.0.0.rc2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/checkout@v3 + - name: Set up Ruby 3.1 + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.1 + bundler-cache: true + - name: Run RuboCop + run: bundle exec rubocop diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.rubocop_todo.yml new/.rubocop_todo.yml --- old/.rubocop_todo.yml 2022-06-26 07:02:04.000000000 +0200 +++ new/.rubocop_todo.yml 2023-07-30 12:54:48.000000000 +0200 @@ -251,7 +251,7 @@ # Offense count: 33 # Configuration parameters: CountComments, CountAsOne. Metrics/ClassLength: - Max: 488 + Max: 350 # Offense count: 38 # Configuration parameters: IgnoredMethods. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CHANGES.txt new/CHANGES.txt --- old/CHANGES.txt 2022-06-26 07:02:04.000000000 +0200 +++ new/CHANGES.txt 2023-07-30 12:54:48.000000000 +0200 @@ -1,3 +1,38 @@ +=== 7.2.0 + + * Add debugging information for algorithm of pubkey in use [#918] + +=== 7.2.0 rc1 + + * Allow IdentityAgent as option to Net::SSH.start [#912] + +=== 7.2.0 beta1 + + * Support `chacha20-poly1...@opnessh.com` cypher if `RbNaCl` gem is installed [#908] + +=== 7.1.0 + + * Accept pubkey_algorithms option when starting a new connection [#891] + +=== 7.1.0 beta1 + + * Don't use the deprecated set_XXX methods on RSA keys. [#875] + * Raise error when BCryptPbkdf fails [#876] + +=== 7.0.1 + + * Drop leftover debug statement [#866] + +=== 7.0.0 + + * BREAKING: Drop support for Ruby 2.5 + * Fix decoding of ecdsa-sha2-nistp256 private keys [#657, #854] + * Fix missing require [#855] + * Support `~` in the path to the SSH agent's unix socket [#850] + * Add support for RSA client authentication with SHA-2 [a45f54] + * openssl: DSA: don't hardcode expected signature size, see ruby/openssl#483 [23a15c] + * Internal housekeeping (rubocop, codecov, remove travis, adding/improving tests) + === 6.3.0 beta1 * Support cert based host key auth, fix asterisk in known_hosts [#833] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/DEVELOPMENT.md new/DEVELOPMENT.md --- old/DEVELOPMENT.md 1970-01-01 01:00:00.000000000 +0100 +++ new/DEVELOPMENT.md 2023-07-30 12:54:48.000000000 +0200 @@ -0,0 +1,23 @@ +### Development notes + +## Building/running ssh server in debug mode + +clone the openssh server from `https://github.com/openssh/openssh-portable` + +```sh +brew install openssl +/usr/local/Cellar/openssl@3/3.1.0/bin/openssl + +autoreconf +./configure --with-ssl-dir=/usr/local/Cellar/openssl@3/3.1.0/ --with-audit=debug --enable-debug CPPFLAGS="-DDEBUG -DPACKET_DEBUG" CFLAGS="-g -O0" +make +``` + +To run server in debug mode: +```sh +echo '#' > /tmp/sshd_config +ssh-keygen -t rsa -f /tmp/ssh_host_rsa_key +# /Users/boga/Work/OSS/NetSSH/openssh-portable/sshd -p 2222 -D -d -d -d -e -f /tmp/sshd_config +/Users/boga/Work/OSS/NetSSH/openssh-portable/sshd -p 2222 -D -d -d -d -e -f /tmp/sshd_config -h /tmp/ssh_host_rsa_key + +``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Dockerfile new/Dockerfile --- old/Dockerfile 2022-06-26 07:02:04.000000000 +0200 +++ new/Dockerfile 2023-07-30 12:54:48.000000000 +0200 @@ -1,7 +1,7 @@ ARG RUBY_VERSION=3.1 FROM ruby:${RUBY_VERSION} -RUN apt update && apt install -y openssh-server sudo netcat \ +RUN apt update && apt install -y openssh-server sudo netcat-openbsd \ && useradd --create-home --shell '/bin/bash' --comment 'NetSSH' 'net_ssh_1' \ && useradd --create-home --shell '/bin/bash' --comment 'NetSSH' 'net_ssh_2' \ && echo net_ssh_1:foopwd | chpasswd \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Gemfile.norbnacl new/Gemfile.norbnacl --- old/Gemfile.norbnacl 1970-01-01 01:00:00.000000000 +0100 +++ new/Gemfile.norbnacl 2023-07-30 12:54:48.000000000 +0200 @@ -0,0 +1,12 @@ +source 'https://rubygems.org' + +ENV['NET_SSH_NO_RBNACL'] = 'true' +# Specify your gem's dependencies in mygem.gemspec +gemspec + +if ENV["CI"] && !Gem.win_platform? + gem 'simplecov', require: false, group: :test + gem 'codecov', require: false, group: :test +end + +gem 'webrick', group: %i[development test] if RUBY_VERSION.split(".")[0].to_i >= 3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2022-06-26 07:02:04.000000000 +0200 +++ new/README.md 2023-07-30 12:54:48.000000000 +0200 @@ -5,7 +5,7 @@ [](#backers]) [](#sponsors) -# Net::SSH 6.x +# Net::SSH 7.x * Docs: http://net-ssh.github.io/net-ssh * Issues: https://github.com/net-ssh/net-ssh/issues @@ -33,7 +33,7 @@ It is possible to return to the previous behavior by adding the option : `append_all_supported_algorithms: true` -Unsecure algoritms will definitely be removed in Net::SSH 7.*. +Unsecure algoritms will definitely be removed in Net::SSH 8.*. ### Host Keys @@ -44,7 +44,7 @@ | ecdsa-sha2-nistp521 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) | | ecdsa-sha2-nistp384 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) | | ecdsa-sha2-nistp256 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) | -| ssh-dss | Deprecated in 6.0 | unsecure, will be removed in 7.0 | +| ssh-dss | Deprecated in 6.0 | unsecure, will be removed in 8.0 | ### Key Exchange @@ -54,9 +54,9 @@ | ecdh-sha2-nistp521 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) | | ecdh-sha2-nistp384 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) | | ecdh-sha2-nistp256 | OK | [using weak elliptic curves](https://safecurves.cr.yp.to/) | -| diffie-hellman-group1-sha1 | Deprecated in 6.0 | unsecure, will be removed in 7.0 | +| diffie-hellman-group1-sha1 | Deprecated in 6.0 | unsecure, will be removed in 8.0 | | diffie-hellman-group14-sha1 | OK | | -| diffie-hellman-group-exchange-sha1 | Deprecated in 6.0 | unsecure, will be removed in 7.0 | +| diffie-hellman-group-exchange-sha1 | Deprecated in 6.0 | unsecure, will be removed in 8.0 | | diffie-hellman-group-exchange-sha256 | OK | | ### Encryption algorithms (ciphers) @@ -64,13 +64,14 @@ | Name | Support | Details | |--------------------------------------|-----------------------|----------| | aes256-ctr / aes192-ctr / aes128-ctr | OK | | -| aes256-cbc / aes192-cbc / aes128-cbc | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| rijndael-...@lysator.liu.se | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| blowfish-ctr blowfish-cbc | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| cast128-ctr cast128-cbc | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| 3des-ctr 3des-cbc | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| idea-cbc | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| none | Deprecated in 6.0 | unsecure, will be removed in 7.0 | +| chacha20-poly1...@openssh.com | OK. | Requires the gem `rbnacl` | +| aes256-cbc / aes192-cbc / aes128-cbc | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| rijndael-...@lysator.liu.se | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| blowfish-ctr blowfish-cbc | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| cast128-ctr cast128-cbc | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| 3des-ctr 3des-cbc | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| idea-cbc | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| none | Deprecated in 6.0 | unsecure, will be removed in 8.0 | ### Message Authentication Code algorithms @@ -80,14 +81,14 @@ | hmac-sha2-256-etm | OK | | | hmac-sha2-512 | OK | | | hmac-sha2-256 | OK | | -| hmac-sha2-512-96 | Deprecated in 6.0 | removed from the specification, will be removed in 7.0 | -| hmac-sha2-256-96 | Deprecated in 6.0 | removed from the specification, will be removed in 7.0 | +| hmac-sha2-512-96 | Deprecated in 6.0 | removed from the specification, will be removed in 8.0 | +| hmac-sha2-256-96 | Deprecated in 6.0 | removed from the specification, will be removed in 8.0 | | hmac-sha1 | OK | for backward compatibility | -| hmac-sha1-96 | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| hmac-ripemd160 | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| hmac-md5 | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| hmac-md5-96 | Deprecated in 6.0 | unsecure, will be removed in 7.0 | -| none | Deprecated in 6.0 | unsecure, will be removed in 7.0 | +| hmac-sha1-96 | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| hmac-ripemd160 | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| hmac-md5 | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| hmac-md5-96 | Deprecated in 6.0 | unsecure, will be removed in 8.0 | +| none | Deprecated in 6.0 | unsecure, will be removed in 8.0 | ## SYNOPSIS: @@ -247,6 +248,10 @@ gem cert --add net-ssh-public_cert.pem ``` +## Security contact information + +See [SECURITY.md](SECURITY.md) + ## CREDITS ### Contributors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Rakefile new/Rakefile --- old/Rakefile 2022-06-26 07:02:04.000000000 +0200 +++ new/Rakefile 2023-07-30 12:54:48.000000000 +0200 @@ -55,6 +55,60 @@ end end +def change_version(&block) + version_file = 'lib/net/ssh/version.rb' + require_relative version_file + pre = Net::SSH::Version::PRE + result = block[pre: pre] + raise "Version change logic should always return a pre", ArgumentError unless result.key?(:pre) + + new_pre = result[:pre] + found = false + File.open("#{version_file}.new", "w") do |f| + File.readlines(version_file).each do |line| + match = /^(\s+PRE\s+=\s+")#{pre}("\s*)$/.match(line) + if match + prefix = match[1] + postfix = match[2] + if new_pre.nil? + prefix.delete_suffix!('"') + postfix.delete_prefix!('"') + end + new_line = "#{prefix}#{new_pre.inspect}#{postfix}" + puts "Changing:\n - #{line} + #{new_line}" + line = new_line + found = true + end + f.write(line) + end + raise ArugmentError, "Cound not find line: PRE = \"#{pre}\" in #{version_file}" unless found + end + + FileUtils.mv version_file, "#{version_file}.old" + FileUtils.mv "#{version_file}.new", version_file +end + +namespace :vbump do + desc "Final release" + task :final do + change_version do |pre:| + raise ArgumentError, "Unexpected pre: #{pre}" if pre.nil? + + { pre: nil } + end + end + + desc "Increment prerelease" + task :pre do + change_version do |pre:| + match = /^([a-z]+)(\d+)/.match(pre) + raise ArgumentError, "Unexpected pre: #{pre}" if match.nil? + + { pre: "#{match[1]}#{match[2].to_i + 1}" } + end + end +end + namespace :rdoc do desc "Update gh-pages branch" task :publish do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/SECURITY.md new/SECURITY.md --- old/SECURITY.md 1970-01-01 01:00:00.000000000 +0100 +++ new/SECURITY.md 2023-07-30 12:54:48.000000000 +0200 @@ -0,0 +1,4 @@ +## Security contact information + +To report a security vulnerability, please use the +[GitHub private vulnerability reporting feature](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability). Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ Binary files old/checksums.yaml.gz.sig and new/checksums.yaml.gz.sig differ Binary files old/data.tar.gz.sig and new/data.tar.gz.sig differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/authentication/certificate.rb new/lib/net/ssh/authentication/certificate.rb --- old/lib/net/ssh/authentication/certificate.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/authentication/certificate.rb 2023-07-30 12:54:48.000000000 +0200 @@ -102,8 +102,8 @@ # Checks whether the certificate's signature was signed by signature key. def signature_valid? buffer = Buffer.new(signature) - buffer.read_string # skip signature format - signature_key.ssh_do_verify(buffer.read_string, to_blob_without_signature) + sig_format = buffer.read_string + signature_key.ssh_do_verify(buffer.read_string, to_blob_without_signature, host_key: sig_format) end def self.read_options(buffer) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/authentication/ed25519.rb new/lib/net/ssh/authentication/ed25519.rb --- old/lib/net/ssh/authentication/ed25519.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/authentication/ed25519.rb 2023-07-30 12:54:48.000000000 +0200 @@ -77,6 +77,7 @@ raise "BCryptPbkdf is not implemented for jruby" if RUBY_PLATFORM == "java" key = BCryptPbkdf::key(password, salt, keylen + ivlen, rounds) + raise DecryptError.new("BCyryptPbkdf failed", encrypted_key: true) unless key else key = '\x00' * (keylen + ivlen) end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/authentication/methods/publickey.rb new/lib/net/ssh/authentication/methods/publickey.rb --- old/lib/net/ssh/authentication/methods/publickey.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/authentication/methods/publickey.rb 2023-07-30 12:54:48.000000000 +0200 @@ -44,7 +44,7 @@ end def authenticate_with_alg(identity, next_service, username, alg, sig_alg = nil) - debug { "trying publickey (#{identity.fingerprint})" } + debug { "trying publickey (#{identity.fingerprint}) alg #{alg}" } send_request(identity, username, next_service, alg) message = session.next_message diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/buffer.rb new/lib/net/ssh/buffer.rb --- old/lib/net/ssh/buffer.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/buffer.rb 2023-07-30 12:54:48.000000000 +0200 @@ -251,7 +251,6 @@ def read_private_keyblob(type) case type when /^ssh-rsa$/ - key = OpenSSL::PKey::RSA.new n = read_bignum e = read_bignum d = read_bignum @@ -262,27 +261,28 @@ _unkown2 = read_bignum dmp1 = d % (p - 1) dmq1 = d % (q - 1) - if key.respond_to?(:set_key) - key.set_key(n, e, d) - else - key.e = e - key.n = n - key.d = d + # Public key + data_sequence = OpenSSL::ASN1::Sequence([ + OpenSSL::ASN1::Integer(n), + OpenSSL::ASN1::Integer(e) + ]) + + if d && p && q && dmp1 && dmq1 && iqmp + data_sequence = OpenSSL::ASN1::Sequence([ + OpenSSL::ASN1::Integer(0), + OpenSSL::ASN1::Integer(n), + OpenSSL::ASN1::Integer(e), + OpenSSL::ASN1::Integer(d), + OpenSSL::ASN1::Integer(p), + OpenSSL::ASN1::Integer(q), + OpenSSL::ASN1::Integer(dmp1), + OpenSSL::ASN1::Integer(dmq1), + OpenSSL::ASN1::Integer(iqmp) + ]) end - if key.respond_to?(:set_factors) - key.set_factors(p, q) - else - key.p = p - key.q = q - end - if key.respond_to?(:set_crt_params) - key.set_crt_params(dmp1, dmq1, iqmp) - else - key.dmp1 = dmp1 - key.dmq1 = dmq1 - key.iqmp = iqmp - end - key + + asn1 = OpenSSL::ASN1::Sequence(data_sequence) + OpenSSL::PKey::RSA.new(asn1.to_der) when /^ecdsa\-sha2\-(\w*)$/ OpenSSL::PKey::EC.read_keyblob($1, self) else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/connection/session.rb new/lib/net/ssh/connection/session.rb --- old/lib/net/ssh/connection/session.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/connection/session.rb 2023-07-30 12:54:48.000000000 +0200 @@ -416,7 +416,7 @@ # # matches = ssh.exec!("grep something /some/files") # - # the returned string has an exitstatus method to query it's exit satus + # the returned string has an exitstatus method to query its exit status def exec!(command, status: nil, &block) block_or_concat = block || Proc.new do |ch, type, data| ch[:result] ||= String.new diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/transport/algorithms.rb new/lib/net/ssh/transport/algorithms.rb --- old/lib/net/ssh/transport/algorithms.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/transport/algorithms.rb 2023-07-30 12:54:48.000000000 +0200 @@ -51,6 +51,11 @@ hmac-sha1] }.freeze + if Net::SSH::Transport::ChaCha20Poly1305CipherLoader::LOADED + DEFAULT_ALGORITHMS[:encryption].unshift( + 'chacha20-poly1...@openssh.com' + ) + end if Net::SSH::Authentication::ED25519Loader::LOADED DEFAULT_ALGORITHMS[:host_key].unshift( 'ssh-ed25519-cert-...@openssh.com', @@ -437,12 +442,13 @@ def exchange_keys debug { "exchanging keys" } + need_bytes = kex_byte_requirement algorithm = Kex::MAP[kex].new(self, session, client_version_string: Net::SSH::Transport::ServerVersion::PROTO_VERSION, server_version_string: session.server_version.version, server_algorithm_packet: @server_packet, client_algorithm_packet: @client_packet, - need_bytes: kex_byte_requirement, + need_bytes: need_bytes, minimum_dh_bits: options[:minimum_dh_bits], logger: logger) result = algorithm.exchange_keys @@ -464,11 +470,27 @@ parameters = { shared: secret, hash: hash, digester: digester } - cipher_client = CipherFactory.get(encryption_client, parameters.merge(iv: iv_client, key: key_client, encrypt: true)) - cipher_server = CipherFactory.get(encryption_server, parameters.merge(iv: iv_server, key: key_server, decrypt: true)) + cipher_client = CipherFactory.get( + encryption_client, + parameters.merge(iv: iv_client, key: key_client, encrypt: true) + ) + cipher_server = CipherFactory.get( + encryption_server, + parameters.merge(iv: iv_server, key: key_server, decrypt: true) + ) - mac_client = HMAC.get(hmac_client, mac_key_client, parameters) - mac_server = HMAC.get(hmac_server, mac_key_server, parameters) + mac_client = + if cipher_client.implicit_mac? + cipher_client.implicit_mac + else + HMAC.get(hmac_client, mac_key_client, parameters) + end + mac_server = + if cipher_server.implicit_mac? + cipher_server.implicit_mac + else + HMAC.get(hmac_server, mac_key_server, parameters) + end session.configure_client cipher: cipher_client, hmac: mac_client, compression: normalize_compression_name(compression_client), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/transport/chacha20_poly1305_cipher.rb new/lib/net/ssh/transport/chacha20_poly1305_cipher.rb --- old/lib/net/ssh/transport/chacha20_poly1305_cipher.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/net/ssh/transport/chacha20_poly1305_cipher.rb 2023-07-30 12:54:48.000000000 +0200 @@ -0,0 +1,117 @@ +require 'rbnacl' +require 'net/ssh/loggable' + +module Net + module SSH + module Transport + ## Implements the chacha20-poly1305@openssh cipher + class ChaCha20Poly1305Cipher + include Net::SSH::Loggable + + # Implicit HMAC, no need to do anything + class ImplicitHMac + def etm + # TODO: ideally this shouln't be called + true + end + + def key_length + 64 + end + end + + def initialize(encrypt:, key:) + @chacha_hdr = OpenSSL::Cipher.new("chacha20") + key_len = @chacha_hdr.key_len + @chacha_main = OpenSSL::Cipher.new("chacha20") + @poly = RbNaCl::OneTimeAuths::Poly1305 + if key.size < key_len * 2 + error { "chacha20_poly1305: keylength doesn't match" } + raise "chacha20_poly1305: keylength doesn't match" + end + if encrypt + @chacha_hdr.encrypt + @chacha_main.encrypt + else + @chacha_hdr.decrypt + @chacha_main.decrypt + end + main_key = key[0...key_len] + @chacha_main.key = main_key + hdr_key = key[key_len...(2 * key_len)] + @chacha_hdr.key = hdr_key + end + + def update_cipher_mac(payload, sequence_number) + iv_data = [0, 0, 0, sequence_number].pack("NNNN") + @chacha_main.iv = iv_data + poly_key = @chacha_main.update(([0] * 32).pack('C32')) + + packet_length = payload.size + length_data = [packet_length].pack("N") + @chacha_hdr.iv = iv_data + packet = @chacha_hdr.update(length_data) + + iv_data[0] = 1.chr + @chacha_main.iv = iv_data + unencrypted_data = payload + packet += @chacha_main.update(unencrypted_data) + + packet += @poly.auth(poly_key, packet) + return packet + end + + def read_length(data, sequence_number) + iv_data = [0, 0, 0, sequence_number].pack("NNNN") + @chacha_hdr.iv = iv_data + @chacha_hdr.update(data).unpack1("N") + end + + def read_and_mac(data, mac, sequence_number) + iv_data = [0, 0, 0, sequence_number].pack("NNNN") + @chacha_main.iv = iv_data + poly_key = @chacha_main.update(([0] * 32).pack('C32')) + + iv_data[0] = 1.chr + @chacha_main.iv = iv_data + unencrypted_data = @chacha_main.update(data[4..]) + begin + ok = @poly.verify(poly_key, mac, data[0..]) + raise Net::SSH::Exception, "corrupted hmac detected #{name}" unless ok + rescue RbNaCl::BadAuthenticatorError + raise Net::SSH::Exception, "corrupted hmac detected #{name}" + end + return unencrypted_data + end + + def mac_length + 16 + end + + def block_size + 8 + end + + def name + "chacha20-poly1...@openssh.com" + end + + def implicit_mac? + true + end + + def implicit_mac + return ImplicitHMac.new + end + + def self.block_size + 8 + end + + def self.key_length + 64 + end + end + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb new/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb --- old/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb 2023-07-30 12:54:48.000000000 +0200 @@ -0,0 +1,17 @@ +module Net + module SSH + module Transport + # Loads chacha20 poly1305 support which requires optinal dependency rbnacl + module ChaCha20Poly1305CipherLoader + begin + require 'net/ssh/transport/chacha20_poly1305_cipher' + LOADED = true + ERROR = nil + rescue LoadError => e + ERROR = e + LOADED = false + end + end + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/transport/cipher_factory.rb new/lib/net/ssh/transport/cipher_factory.rb --- old/lib/net/ssh/transport/cipher_factory.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/transport/cipher_factory.rb 2023-07-30 12:54:48.000000000 +0200 @@ -2,6 +2,8 @@ require 'net/ssh/transport/ctr.rb' require 'net/ssh/transport/key_expander' require 'net/ssh/transport/identity_cipher' +require 'net/ssh/transport/chacha20_poly1305_cipher_loader' +require 'net/ssh/transport/openssl_cipher_extensions' module Net module SSH @@ -29,13 +31,25 @@ 'none' => 'none' } + SSH_TO_CLASS = + if Net::SSH::Transport::ChaCha20Poly1305CipherLoader::LOADED + { + 'chacha20-poly1...@openssh.com' => Net::SSH::Transport::ChaCha20Poly1305Cipher + } + else + { + } + end + # Returns true if the underlying OpenSSL library supports the given cipher, # and false otherwise. def self.supported?(name) + return true if SSH_TO_CLASS.key?(name) + ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'" return true if ossl_name == "none" - return OpenSSL::Cipher.ciphers.include?(ossl_name) + return SSH_TO_CLASS.key?(name) || OpenSSL::Cipher.ciphers.include?(ossl_name) end # Retrieves a new instance of the named algorithm. The new instance @@ -44,6 +58,13 @@ # cipher will be put into encryption or decryption mode, based on the # value of the +encrypt+ parameter. def self.get(name, options = {}) + klass = SSH_TO_CLASS[name] + unless klass.nil? + key_len = klass.key_length + key = Net::SSH::Transport::KeyExpander.expand_key(key_len, options[:key], options) + return klass.new(encrypt: options[:encrypt], key: key) + end + ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'" return IdentityCipher if ossl_name == "none" @@ -53,6 +74,7 @@ cipher.padding = 0 + cipher.extend(Net::SSH::Transport::OpenSSLCipherExtensions) if name =~ /-ctr(@openssh.org)?$/ if ossl_name !~ /-ctr/ cipher.extend(Net::SSH::Transport::CTR) @@ -75,6 +97,9 @@ # of the tuple. # if :iv_len option is supplied the third return value will be ivlen def self.get_lengths(name, options = {}) + klass = SSH_TO_CLASS[name] + return [klass.key_length, klass.block_size] unless klass.nil? + ossl_name = SSH_TO_OSSL[name] if ossl_name.nil? || ossl_name == "none" result = [0, 0] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/transport/identity_cipher.rb new/lib/net/ssh/transport/identity_cipher.rb --- old/lib/net/ssh/transport/identity_cipher.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/transport/identity_cipher.rb 2023-07-30 12:54:48.000000000 +0200 @@ -11,6 +11,10 @@ 8 end + def key_length + 0 + end + # Returns an arbitrary integer. def iv_len 4 @@ -50,6 +54,10 @@ def reset self end + + def implicit_mac? + false + end end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/transport/openssl_cipher_extensions.rb new/lib/net/ssh/transport/openssl_cipher_extensions.rb --- old/lib/net/ssh/transport/openssl_cipher_extensions.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/net/ssh/transport/openssl_cipher_extensions.rb 2023-07-30 12:54:48.000000000 +0200 @@ -0,0 +1,8 @@ +module Net::SSH::Transport + # we add those mehtods to OpenSSL::Chipher instances + module OpenSSLCipherExtensions + def implicit_mac? + false + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/transport/packet_stream.rb new/lib/net/ssh/transport/packet_stream.rb --- old/lib/net/ssh/transport/packet_stream.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/transport/packet_stream.rb 2023-07-30 12:54:48.000000000 +0200 @@ -12,7 +12,7 @@ # module. It adds SSH encryption, compression, and packet validation, as # per the SSH2 protocol. It also adds an abstraction for polling packets, # to allow for both blocking and non-blocking reads. - module PacketStream + module PacketStream # rubocop:disable Metrics/ModuleLength PROXY_COMMAND_HOST_IP = '<no hostip for proxy command>'.freeze include BufferedIo @@ -123,7 +123,7 @@ # Enqueues a packet to be sent, but does not immediately send the packet. # The given payload is pre-processed according to the algorithms specified # in the client state (compression, cipher, and hmac). - def enqueue_packet(payload) + def enqueue_packet(payload) # rubocop:disable Metrics/AbcSize # try to compress the packet payload = client.compress(payload) @@ -144,7 +144,10 @@ padding = Array.new(padding_length) { rand(256) }.pack("C*") - if client.hmac.etm + if client.cipher.implicit_mac? + unencrypted_data = [padding_length, payload, padding].pack("CA*A*") + message = client.cipher.update_cipher_mac(unencrypted_data, client.sequence_number) + elsif client.hmac.etm debug { "using encrypt-then-mac" } # Encrypt padding_length, payload, and padding. Take MAC @@ -225,7 +228,11 @@ data = read_available(minimum + aad_length) # decipher it - if server.hmac.etm + if server.cipher.implicit_mac? + @packet_length = server.cipher.read_length(data[0...4], server.sequence_number) + @packet = Net::SSH::Buffer.new + @mac_data = data + elsif server.hmac.etm @packet_length = data.unpack("N").first @mac_data = data @packet = Net::SSH::Buffer.new(server.update_cipher(data[aad_length..-1])) @@ -238,31 +245,45 @@ need = @packet_length + 4 - aad_length - server.block_size raise Net::SSH::Exception, "padding error, need #{need} block #{server.block_size}" if need % server.block_size != 0 - return nil if available < need + server.hmac.mac_length + if server.cipher.implicit_mac? + return nil if available < need + server.cipher.mac_length + else + return nil if available < need + server.hmac.mac_length # rubocop:disable Style/IfInsideElse + end if need > 0 # read the remainder of the packet and decrypt it. data = read_available(need) - @mac_data += data if server.hmac.etm - @packet.append(server.update_cipher(data)) + @mac_data += data if server.hmac.etm || server.cipher.implicit_mac? + unless server.cipher.implicit_mac? + @packet.append( + server.update_cipher(data) + ) + end end - # get the hmac from the tail of the packet (if one exists), and - # then validate it. - real_hmac = read_available(server.hmac.mac_length) || "" - - @packet.append(server.final_cipher) - padding_length = @packet.read_byte - - payload = @packet.read(@packet_length - padding_length - 1) - - my_computed_hmac = if server.hmac.etm - server.hmac.digest([server.sequence_number, @mac_data].pack("NA*")) - else - server.hmac.digest([server.sequence_number, @packet.content].pack("NA*")) - end - raise Net::SSH::Exception, "corrupted hmac detected #{server.hmac.class}" if real_hmac != my_computed_hmac - + if server.cipher.implicit_mac? + real_hmac = read_available(server.cipher.mac_length) || "" + @packet = Net::SSH::Buffer.new(server.cipher.read_and_mac(@mac_data, real_hmac, server.sequence_number)) + padding_length = @packet.read_byte + payload = @packet.read(@packet_length - padding_length - 1) + else + # get the hmac from the tail of the packet (if one exists), and + # then validate it. + real_hmac = read_available(server.hmac.mac_length) || "" + + @packet.append(server.final_cipher) + padding_length = @packet.read_byte + + payload = @packet.read(@packet_length - padding_length - 1) + + my_computed_hmac = if server.hmac.etm + server.hmac.digest([server.sequence_number, @mac_data].pack("NA*")) + else + server.hmac.digest([server.sequence_number, @packet.content].pack("NA*")) + end + raise Net::SSH::Exception, "corrupted hmac detected #{server.hmac.class}" if real_hmac != my_computed_hmac + end # try to decompress the payload, in case compression is active payload = server.decompress(payload) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/version.rb new/lib/net/ssh/version.rb --- old/lib/net/ssh/version.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh/version.rb 2023-07-30 12:54:48.000000000 +0200 @@ -49,10 +49,10 @@ MAJOR = 7 # The minor component of this version of the Net::SSH library - MINOR = 0 + MINOR = 2 # The tiny component of this version of the Net::SSH library - TINY = 1 + TINY = 0 # The prerelease component of this version of the Net::SSH library # nil allowed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh/version.rb.old new/lib/net/ssh/version.rb.old --- old/lib/net/ssh/version.rb.old 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/net/ssh/version.rb.old 2023-07-30 12:54:48.000000000 +0200 @@ -0,0 +1,68 @@ +module Net + module SSH + # A class for describing the current version of a library. The version + # consists of three parts: the +major+ number, the +minor+ number, and the + # +tiny+ (or +patch+) number. + # + # Two Version instances may be compared, so that you can test that a version + # of a library is what you require: + # + # require 'net/ssh/version' + # + # if Net::SSH::Version::CURRENT < Net::SSH::Version[2,1,0] + # abort "your software is too old!" + # end + class Version + include Comparable + + # A convenience method for instantiating a new Version instance with the + # given +major+, +minor+, and +tiny+ components. + def self.[](major, minor, tiny, pre = nil) + new(major, minor, tiny, pre) + end + + attr_reader :major, :minor, :tiny + + # Create a new Version object with the given components. + def initialize(major, minor, tiny, pre = nil) + @major, @minor, @tiny, @pre = major, minor, tiny, pre + end + + # Compare this version to the given +version+ object. + def <=>(version) + to_i <=> version.to_i + end + + # Converts this version object to a string, where each of the three + # version components are joined by the '.' character. E.g., 2.0.0. + def to_s + @to_s ||= [@major, @minor, @tiny, @pre].compact.join(".") + end + + # Converts this version to a canonical integer that may be compared + # against other version objects. + def to_i + @to_i ||= @major * 1_000_000 + @minor * 1_000 + @tiny + end + + # The major component of this version of the Net::SSH library + MAJOR = 7 + + # The minor component of this version of the Net::SSH library + MINOR = 2 + + # The tiny component of this version of the Net::SSH library + TINY = 0 + + # The prerelease component of this version of the Net::SSH library + # nil allowed + PRE = "rc1" + + # The current version of the Net::SSH library as a Version instance + CURRENT = new(*[MAJOR, MINOR, TINY, PRE].compact) + + # The current version of the Net::SSH library as a String + STRING = CURRENT.to_s + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/ssh.rb new/lib/net/ssh.rb --- old/lib/net/ssh.rb 2022-06-26 07:02:04.000000000 +0200 +++ new/lib/net/ssh.rb 2023-07-30 12:54:48.000000000 +0200 @@ -64,7 +64,7 @@ # Net::SSH.start for a description of each option. VALID_OPTIONS = %i[ auth_methods bind_address compression compression_level config - encryption forward_agent hmac host_key remote_user + encryption forward_agent hmac host_key identity_agent remote_user keepalive keepalive_interval keepalive_maxcount kex keys key_data keycerts languages logger paranoid password port proxy rekey_blocks_limit rekey_limit rekey_packet_limit timeout verbose @@ -73,7 +73,7 @@ max_win_size send_env set_env use_agent number_of_password_prompts append_all_supported_algorithms non_interactive password_prompt agent_socket_factory minimum_dh_bits verify_host_key - fingerprint_hash check_host_ip + fingerprint_hash check_host_ip pubkey_algorithms ] # The standard means of starting a new SSH connection. When used with a @@ -170,6 +170,11 @@ # * :properties => a hash of key/value pairs to add to the new connection's # properties (see Net::SSH::Connection::Session#properties) # * :proxy => a proxy instance (see Proxy) to use when connecting + # * :pubkey_algorithms => the public key authentication algorithms to use for + # this connection. Valid values are 'rsa-sha2-256-cert-...@openssh.com', + # 'ssh-rsa-cert-...@openssh.com', 'rsa-sha2-256', 'ssh-rsa'. Currently, this + # option is only used for RSA public key authentication and ignored for other + # types. # * :rekey_blocks_limit => the max number of blocks to process before rekeying # * :rekey_limit => the max number of bytes to process before rekeying # * :rekey_packet_limit => the max number of packets to process before rekeying @@ -187,6 +192,7 @@ # Defaults to %w(~/.ssh/known_hosts ~/.ssh/known_hosts2). # * :use_agent => Set false to disable the use of ssh-agent. Defaults to # true + # * :identity_agent => the path to the ssh-agent's UNIX socket # * :verbose => how verbose to be (Logger verbosity constants, Logger::DEBUG # is very verbose, Logger::FATAL is all but silent). Logger::FATAL is the # default. The symbols :debug, :info, :warn, :error, and :fatal are also diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2022-06-26 07:02:04.000000000 +0200 +++ new/metadata 2023-07-30 12:54:48.000000000 +0200 @@ -1,7 +1,7 @@ --- !ruby/object:Gem::Specification name: net-ssh version: !ruby/object:Gem::Version - version: 7.0.1 + version: 7.2.0 platform: ruby authors: - Jamis Buck @@ -13,8 +13,8 @@ - | -----BEGIN CERTIFICATE----- MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpuZXRz - c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0yMTA4MTAwODMyMzBaFw0yMjA4MTAw - ODMyMzBaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB + c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0yMzAxMjQwMzE3NTVaFw0yNDAxMjQw + MzE3NTVaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxieE22fR/qmdPKUHyYTyUx2g wskLwrCkxay+Tvc97ZZUOwf85LDDDPqhQaTWLvRwnIOMgQE2nBPzwalVclK6a+pW x/18KDeZY15vm3Qn5p42b0wi9hUxOqPm3J2hdCLCcgtENgdX21nVzejn39WVqFJO @@ -24,14 +24,14 @@ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUBfKiwO2e M4NEiRrVG793qEPLYyMwHwYDVR0RBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20w HwYDVR0SBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20wDQYJKoZIhvcNAQELBQAD - ggEBABRChgo0Jo+iXSnTpODNongzZoU0sWqwx3/FQVo8nyAyr1qFuiqpSPb4bDbU - DsVnUn3t0X/gGA8qJhutlmfTpEQCjUeyj2x9rWpD3lvttlGWV6btQ0qN4Dfc2gsw - rCp9Jpful0HGWhiwfjWfsarqAdtLzIG0UC47IN7LGeCMRJIijOsXQhiZ915eNBEw - g9+WSSGHkMFt/7vi2pFkvXSC0+RF8ovvRWf4Zw2aYXtJ1GElgi4ZS/s6ZU0gmv20 - i4SfC5m5UXIVZvOBYiMuZ/1B2m6R9xU41027zfOVwRFNtlVDiNfQRq6sDmz44At/ - dv8pkxXDgySe41vzlRXFsgIgz5A= + ggEBAHyOSaOUji+EJFWZ46g+2EZ/kG7EFloFtIQUz8jDJIWGE+3NV5po1M0Z6EqH + XmG3BtMLfgOV9NwMQRqIdKnZDfKsqM/FOu+9IqrP+OieAde5OrXR2pzQls60Xft7 + 3qNVaQS99woQRqiUiDQQ7WagOYrZjuVANqTDNt4myzGSjS5sHcKlz3PRn0LJRMe5 + ouuLwQ7BCXityv5RRXex2ibCOyY7pB5ris6xDnPe1WdlyCfUf1Fb+Yqxpy6a8QmH + v84waVXQ2i5M7pJaHVBF7DxxeW/q8W3VCnsq8vmmvULSThD18QqYGaFDJeN8sTR4 + 6tfjgZ6OvGSScvbCMHkCE9XjonE= -----END CERTIFICATE----- -date: 2022-06-26 00:00:00.000000000 Z +date: 2023-07-30 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: bcrypt_pbkdf @@ -76,6 +76,20 @@ - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency + name: rbnacl + requirement: !ruby/object:Gem::Requirement + requirements: + - - "~>" + - !ruby/object:Gem::Version + version: '7.1' + type: :development + prerelease: false + version_requirements: !ruby/object:Gem::Requirement + requirements: + - - "~>" + - !ruby/object:Gem::Version + version: '7.1' +- !ruby/object:Gem::Dependency name: bundler requirement: !ruby/object:Gem::Requirement requirements: @@ -95,28 +109,28 @@ requirements: - - "~>" - !ruby/object:Gem::Version - version: '5.10' + version: '5.19' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version - version: '5.10' + version: '5.19' - !ruby/object:Gem::Dependency name: mocha requirement: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version - version: 1.11.2 + version: 2.1.0 type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version - version: 1.11.2 + version: 2.1.0 - !ruby/object:Gem::Dependency name: rake requirement: !ruby/object:Gem::Requirement @@ -157,6 +171,7 @@ - README.md files: - ".dockerignore" +- ".github/FUNDING.yml" - ".github/config/rubocop_linter_action.yml" - ".github/workflows/ci-with-docker.yml" - ".github/workflows/ci.yml" @@ -165,15 +180,18 @@ - ".rubocop.yml" - ".rubocop_todo.yml" - CHANGES.txt +- DEVELOPMENT.md - Dockerfile - Dockerfile.openssl3 - Gemfile - Gemfile.noed25519 +- Gemfile.norbnacl - ISSUE_TEMPLATE.md - LICENSE.txt - Manifest - README.md - Rakefile +- SECURITY.md - THANKS.txt - appveyor.yml - docker-compose.yml @@ -226,6 +244,8 @@ - lib/net/ssh/test/script.rb - lib/net/ssh/test/socket.rb - lib/net/ssh/transport/algorithms.rb +- lib/net/ssh/transport/chacha20_poly1305_cipher.rb +- lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb - lib/net/ssh/transport/cipher_factory.rb - lib/net/ssh/transport/constants.rb - lib/net/ssh/transport/ctr.rb @@ -259,6 +279,7 @@ - lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb - lib/net/ssh/transport/key_expander.rb - lib/net/ssh/transport/openssl.rb +- lib/net/ssh/transport/openssl_cipher_extensions.rb - lib/net/ssh/transport/packet_stream.rb - lib/net/ssh/transport/server_version.rb - lib/net/ssh/transport/session.rb @@ -268,6 +289,7 @@ - lib/net/ssh/verifiers/always.rb - lib/net/ssh/verifiers/never.rb - lib/net/ssh/version.rb +- lib/net/ssh/version.rb.old - net-ssh-public_cert.pem - net-ssh.gemspec - support/ssh_tunnel_bug.rb @@ -291,7 +313,7 @@ - !ruby/object:Gem::Version version: '0' requirements: [] -rubygems_version: 3.1.6 +rubygems_version: 3.3.3 signing_key: specification_version: 4 summary: 'Net::SSH: a pure-Ruby implementation of the SSH2 client protocol.' Binary files old/metadata.gz.sig and new/metadata.gz.sig differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/net-ssh-public_cert.pem new/net-ssh-public_cert.pem --- old/net-ssh-public_cert.pem 2022-06-26 07:02:04.000000000 +0200 +++ new/net-ssh-public_cert.pem 2023-07-30 12:54:48.000000000 +0200 @@ -1,7 +1,7 @@ -----BEGIN CERTIFICATE----- MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpuZXRz -c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0yMTA4MTAwODMyMzBaFw0yMjA4MTAw -ODMyMzBaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB +c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0yMzAxMjQwMzE3NTVaFw0yNDAxMjQw +MzE3NTVaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxieE22fR/qmdPKUHyYTyUx2g wskLwrCkxay+Tvc97ZZUOwf85LDDDPqhQaTWLvRwnIOMgQE2nBPzwalVclK6a+pW x/18KDeZY15vm3Qn5p42b0wi9hUxOqPm3J2hdCLCcgtENgdX21nVzejn39WVqFJO @@ -11,10 +11,10 @@ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUBfKiwO2e M4NEiRrVG793qEPLYyMwHwYDVR0RBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20w HwYDVR0SBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20wDQYJKoZIhvcNAQELBQAD -ggEBABRChgo0Jo+iXSnTpODNongzZoU0sWqwx3/FQVo8nyAyr1qFuiqpSPb4bDbU -DsVnUn3t0X/gGA8qJhutlmfTpEQCjUeyj2x9rWpD3lvttlGWV6btQ0qN4Dfc2gsw -rCp9Jpful0HGWhiwfjWfsarqAdtLzIG0UC47IN7LGeCMRJIijOsXQhiZ915eNBEw -g9+WSSGHkMFt/7vi2pFkvXSC0+RF8ovvRWf4Zw2aYXtJ1GElgi4ZS/s6ZU0gmv20 -i4SfC5m5UXIVZvOBYiMuZ/1B2m6R9xU41027zfOVwRFNtlVDiNfQRq6sDmz44At/ -dv8pkxXDgySe41vzlRXFsgIgz5A= +ggEBAHyOSaOUji+EJFWZ46g+2EZ/kG7EFloFtIQUz8jDJIWGE+3NV5po1M0Z6EqH +XmG3BtMLfgOV9NwMQRqIdKnZDfKsqM/FOu+9IqrP+OieAde5OrXR2pzQls60Xft7 +3qNVaQS99woQRqiUiDQQ7WagOYrZjuVANqTDNt4myzGSjS5sHcKlz3PRn0LJRMe5 +ouuLwQ7BCXityv5RRXex2ibCOyY7pB5ris6xDnPe1WdlyCfUf1Fb+Yqxpy6a8QmH +v84waVXQ2i5M7pJaHVBF7DxxeW/q8W3VCnsq8vmmvULSThD18QqYGaFDJeN8sTR4 +6tfjgZ6OvGSScvbCMHkCE9XjonE= -----END CERTIFICATE----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/net-ssh.gemspec new/net-ssh.gemspec --- old/net-ssh.gemspec 2022-06-26 07:02:04.000000000 +0200 +++ new/net-ssh.gemspec 2023-07-30 12:54:48.000000000 +0200 @@ -36,9 +36,11 @@ spec.add_development_dependency('x25519') unless RUBY_PLATFORM == 'java' end + spec.add_development_dependency('rbnacl', '~> 7.1') unless ENV['NET_SSH_NO_RBNACL'] + spec.add_development_dependency "bundler", ">= 1.17" - spec.add_development_dependency "minitest", "~> 5.10" - spec.add_development_dependency "mocha", "~> 1.11.2" + spec.add_development_dependency "minitest", "~> 5.19" + spec.add_development_dependency "mocha", "~> 2.1.0" spec.add_development_dependency "rake", "~> 12.0" spec.add_development_dependency "rubocop", "~> 1.28.0" end