A factory class for returning new Key algorithm factories (actually classes).
| [W] | buffers | The setter for the buffer factory to use. |
| [W] | prompter | The setter for describing which prompter service to use when prompting the user for a key passphrase. |
Create a new instance of the KeyFactory that uses the given Hash-like to map SSH2 key algorithm names to names of factories (classes) that can instantiate those algorithms.
[ show source ]
# File lib/net/ssh/transport/ossl/key-factory.rb, line 41
41: def initialize( algorithms )
42: @factories = algorithms
43: end
Return a new instance of the key factory for the given name. If no such algorithm exists, a KeyTypeNotFound error will be raised.
[ show source ]
# File lib/net/ssh/transport/ossl/key-factory.rb, line 47
47: def get( name )
48: klass_name = @factories.fetch( name ) do
49: raise KeyTypeNotFound, name
50: end
51:
52: return klass_name.new
53: end
Loads a private key from a file. It will correctly determine whether the file describes an RSA or DSA key, and will load it appropriately. The new key is returned. If the key itself is encrypted (requiring a passphrase to use), the user will be prompted to enter their password.
[ show source ]
# File lib/net/ssh/transport/ossl/key-factory.rb, line 60
60: def load_private_key( filename )
61: file = File.read( filename )
62:
63: if file.match( /-----BEGIN DSA PRIVATE KEY-----/ )
64: key_type = OpenSSL::PKey::DSA
65: elsif file.match( /-----BEGIN RSA PRIVATE KEY-----/ )
66: key_type = OpenSSL::PKey::RSA
67: elsif file.match( /-----BEGIN (.*) PRIVATE KEY-----/ )
68: raise OpenSSL::PKey::PKeyError, "not a supported key type '#{$1}'"
69: else
70: raise OpenSSL::PKey::PKeyError, "not a private key (#{filename})"
71: end
72:
73: encrypted_key = file.match( /ENCRYPTED/ )
74: password = encrypted_key ? 'nil' : nil
75: tries = 0
76:
77: begin
78: return key_type.new( file, password )
79: rescue OpenSSL::PKey::RSAError, OpenSSL::PKey::DSAError => e
80: if encrypted_key && @prompter
81: tries += 1
82: if tries <= 3
83: password = @prompter.password(
84: "Enter password for #{filename}: " )
85: retry
86: else
87: raise
88: end
89: else
90: raise
91: end
92: end
93: end
Loads a public key from a file. It will correctly determine whether the file describes an RSA or DSA key, and will load it appropriately. The new public key is returned.
[ show source ]
# File lib/net/ssh/transport/ossl/key-factory.rb, line 98
98: def load_public_key( filename )
99: data = File.open( filename ) { |file| file.read }
100: type, blob = data.split( / / )
101:
102: blob = Base64.decode64( blob )
103: reader = @buffers.reader( blob )
104: key = reader.read_key or
105: raise OpenSSL::PKey::PKeyError,
106: "not a public key #{filename.inspect}"
107: return key
108: end