Class: Net::SSH::Transport::Kex::Curve25519Sha256

Inherits:
Abstract5656 show all
Defined in:
lib/net/ssh/transport/kex/curve25519_sha256.rb

Overview

A key-exchange service implementing the "curve25519-sha256@libssh.org" key-exchange algorithm. (defined in https://tools.ietf.org/html/draft-ietf-curdle-ssh-curves-06)

Defined Under Namespace

Classes: UnsupportedError

Constant Summary collapse

ALGORITHM =
"X25519"
KEY_BYTES =
32

Constants included from Constants

Constants::DEBUG, Constants::DISCONNECT, Constants::IGNORE, Constants::KEXDH_GEX_GROUP, Constants::KEXDH_GEX_INIT, Constants::KEXDH_GEX_REPLY, Constants::KEXDH_GEX_REQUEST, Constants::KEXDH_INIT, Constants::KEXDH_REPLY, Constants::KEXECDH_INIT, Constants::KEXECDH_REPLY, Constants::KEXINIT, Constants::NEWKEYS, Constants::SERVICE_ACCEPT, Constants::SERVICE_REQUEST, Constants::UNIMPLEMENTED

Instance Attribute Summary

Attributes inherited from Abstract

#algorithms, #connection, #data, #dh

Attributes included from Loggable

#logger

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Abstract5656

#curve_name

Methods inherited from Abstract

#exchange_keys, #initialize

Methods included from Loggable

#debug, #error, #fatal, #info, #lwarn

Constructor Details

This class inherits a constructor from Net::SSH::Transport::Kex::Abstract

Class Method Details

.ensure_supported!Object



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/net/ssh/transport/kex/curve25519_sha256.rb', line 17

def self.ensure_supported!
  unless OpenSSL::PKey.respond_to?(:generate_key) && OpenSSL::PKey.respond_to?(:new_raw_public_key)
    raise UnsupportedError, "OpenSSL::PKey raw public key APIs are unavailable"
  end

  key = generate_x25519_key
  public_key = new_raw_public_key(key.raw_public_key)
  validate_key_bytes!(key.derive(public_key), "shared secret", KEY_BYTES)
rescue OpenSSL::PKey::PKeyError => e
  raise UnsupportedError, e.message
end

.generate_x25519_keyObject



29
30
31
# File 'lib/net/ssh/transport/kex/curve25519_sha256.rb', line 29

def self.generate_x25519_key
  OpenSSL::PKey.generate_key(ALGORITHM)
end

.new_raw_public_key(key) ⇒ Object



33
34
35
36
# File 'lib/net/ssh/transport/kex/curve25519_sha256.rb', line 33

def self.new_raw_public_key(key)
  validate_key_bytes!(key, "public key", KEY_BYTES)
  OpenSSL::PKey.new_raw_public_key(ALGORITHM, binary_string(key))
end

.validate_key_bytes!(key, label, expected_bytes) ⇒ Object

Raises:

  • (ArgumentError)


38
39
40
# File 'lib/net/ssh/transport/kex/curve25519_sha256.rb', line 38

def self.validate_key_bytes!(key, label, expected_bytes)
  raise ArgumentError, "invalid X25519 #{label}" unless key.respond_to?(:bytesize) && key.bytesize == expected_bytes
end

Instance Method Details

#digesterObject



47
48
49
# File 'lib/net/ssh/transport/kex/curve25519_sha256.rb', line 47

def digester
  OpenSSL::Digest::SHA256
end