50: def load_data_private_key(data, passphrase=nil, ask_passphrase=true, filename="")
51: if data.match(/-----BEGIN DSA PRIVATE KEY-----/)
52: key_type = OpenSSL::PKey::DSA
53: elsif data.match(/-----BEGIN RSA PRIVATE KEY-----/)
54: key_type = OpenSSL::PKey::RSA
55: elsif data.match(/-----BEGIN EC PRIVATE KEY-----/) && defined?(OpenSSL::PKey::EC)
56: key_type = OpenSSL::PKey::EC
57: elsif data.match(/-----BEGIN (.*) PRIVATE KEY-----/)
58: raise OpenSSL::PKey::PKeyError, "not a supported key type '#{$1}'"
59: else
60: raise OpenSSL::PKey::PKeyError, "not a private key (#{filename})"
61: end
62:
63: encrypted_key = data.match(/ENCRYPTED/)
64: tries = 0
65:
66: begin
67: return key_type.new(data, passphrase || 'invalid')
68: rescue OpenSSL::PKey::RSAError, OpenSSL::PKey::DSAError, OpenSSL::PKey::ECError => e
69: if encrypted_key && ask_passphrase
70: tries += 1
71: if tries <= 3
72: passphrase = prompt("Enter passphrase for #{filename}:", false)
73: retry
74: else
75: raise
76: end
77: else
78: raise
79: end
80: end
81: end