def from_line(cls, line): """ Parses the given line of text to find the names for the host, the type of key, and the key data. The line is expected to be in the format used by the openssh known_hosts file. Lines are expected to not have leading or trailing whitespace. We don't bother to check for comments or empty lines. All of that should be taken care of before sending the line to us. @param line: a line from an OpenSSH known_hosts file @type line: str """ fields = line.split(' ') if len(fields) < 3: # Bad number of fields return None fields = fields[:3] names, keytype, key = fields names = names.split(',') # Decide what kind of key we're looking at and create an object # to hold it accordingly. try: if keytype == 'ssh-rsa': key = RSAKey(data=base64.decodestring(key)) elif keytype == 'ssh-dss': key = DSSKey(data=base64.decodestring(key)) else: return None except binascii.Error, e: raise InvalidHostKey(line, e)
def load_host_keys(filename): """ Read a file of known SSH host keys, in the format used by openssh, and return a compound dict of C{hostname -> keytype ->} L{PKey <paramiko.pkey.PKey>}. The hostname may be an IP address or DNS name. The keytype will be either C{"ssh-rsa"} or C{"ssh-dss"}. This type of file unfortunately doesn't exist on Windows, but on posix, it will usually be stored in C{os.path.expanduser("~/.ssh/known_hosts")}. @param filename: name of the file to read host keys from @type filename: str @return: dict of host keys, indexed by hostname and then keytype @rtype: dict(hostname, dict(keytype, L{PKey <paramiko.pkey.PKey>})) """ import base64 from rsakey import RSAKey from dsskey import DSSKey keys = {} f = file(filename, 'r') for line in f: line = line.strip() if (len(line) == 0) or (line[0] == '#'): continue keylist = line.split(' ') if len(keylist) != 3: continue hostlist, keytype, key = keylist hosts = hostlist.split(',') for host in hosts: if not keys.has_key(host): keys[host] = {} if keytype == 'ssh-rsa': keys[host][keytype] = RSAKey(data=base64.decodestring(key)) elif keytype == 'ssh-dss': keys[host][keytype] = DSSKey(data=base64.decodestring(key)) f.close() return keys
def CryptImportKey(data): ret = RSAKey(data) if not ret.valid: return None return ret