48 lines
1.1 KiB
Ruby
48 lines
1.1 KiB
Ruby
require 'net/ssh'
|
|
require 'rex'
|
|
|
|
module Net
|
|
module SSH
|
|
|
|
# A place to define convenience utils for Net:SSH
|
|
module Utils
|
|
class Key
|
|
class << self
|
|
|
|
# Returns the fingerprint of a key file or key data. Usage:
|
|
# Net::SSH::Utils::Key.fingerprint(:file => "id_rsa")
|
|
# => "af:76:e4:f8:37:7b:52:8c:77:61:5b:d3:b0:d3:05:e4"
|
|
#
|
|
# If both :file and :data are provided, :data will be read.
|
|
# :format may be one of :binary, :compact, or nil (in which case colon-delimited will be returned)
|
|
# If the key is a public key, it must be declared as such by :public => true. Default is private.
|
|
def fingerprint(args={})
|
|
file = args[:file] || args[:f]
|
|
data = args[:data] || args[:d]
|
|
method = ((args[:public] || args[:pub]) ? :load_public_key : :load_private_key)
|
|
format = args[:format]
|
|
if data
|
|
fd = Tempfile.new("msf3-sshkey-temp-")
|
|
fd.binmode
|
|
fd.write data
|
|
fd.flush
|
|
file = fd.path
|
|
end
|
|
key = KeyFactory.send method,file
|
|
fp = key.fingerprint
|
|
case args[:format]
|
|
when :binary,:bin,:b
|
|
return fp.split(":").map {|x| x.to_i(16)}.pack("C16")
|
|
when :compact,:com,:c
|
|
return fp.split(":").join
|
|
else
|
|
return fp
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|