Class: OpenSSL::PKey::DSA

Inherits:
Object
  • Object
show all
Defined in:
lib/net/ssh/transport/openssl.rb

Overview

This class is originally defined in the OpenSSL module. As needed, methods have been added to it by the Net::SSH module for convenience in dealing with SSH functionality.

Instance Method Summary collapse

Instance Method Details

#ssh_do_sign(data, sig_alg = nil) ⇒ Object

Signs the given data.

Raises:

  • (OpenSSL::PKey::DSAError)


120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/net/ssh/transport/openssl.rb', line 120

def ssh_do_sign(data, sig_alg = nil)
  sig = sign(OpenSSL::Digest::SHA1.new, data)
  a1sig = OpenSSL::ASN1.decode(sig)

  sig_r = a1sig.value[0].value.to_s(2)
  sig_s = a1sig.value[1].value.to_s(2)

  sig_size = params["q"].num_bits / 8
  raise OpenSSL::PKey::DSAError, "bad sig size" if sig_r.length > sig_size || sig_s.length > sig_size

  sig_r = "\0" * (20 - sig_r.length) + sig_r if sig_r.length < 20
  sig_s = "\0" * (20 - sig_s.length) + sig_s if sig_s.length < 20

  return sig_r + sig_s
end

#ssh_do_verify(sig, data, options = {}) ⇒ Object

Verifies the given signature matches the given data.



109
110
111
112
113
114
115
116
117
# File 'lib/net/ssh/transport/openssl.rb', line 109

def ssh_do_verify(sig, data, options = {})
  sig_r = sig[0, 20].unpack("H*")[0].to_i(16)
  sig_s = sig[20, 20].unpack("H*")[0].to_i(16)
  a1sig = OpenSSL::ASN1::Sequence([
                                    OpenSSL::ASN1::Integer(sig_r),
                                    OpenSSL::ASN1::Integer(sig_s)
                                  ])
  return verify(OpenSSL::Digest::SHA1.new, a1sig.to_der, data)
end

#ssh_typeObject Also known as: ssh_signature_type

Returns “ssh-dss”, which is the description of this key type used by the SSH2 protocol.



96
97
98
# File 'lib/net/ssh/transport/openssl.rb', line 96

def ssh_type
  "ssh-dss"
end

#to_blobObject

Converts the key to a blob, according to the SSH2 protocol.



103
104
105
106
# File 'lib/net/ssh/transport/openssl.rb', line 103

def to_blob
  @blob ||= Net::SSH::Buffer.from(:string, ssh_type,
                                  :bignum, p, :bignum, q, :bignum, g, :bignum, pub_key).to_s
end