def write_private_key_file(self, filename, password=None): keylist = [ 0, self.n, self.e, self.d, self.p, self.q, self.d % (self.p - 1), self.d % (self.q - 1), util.mod_inverse(self.q, self.p) ] try: b = BER() b.encode(keylist) except BERException: raise SSHException('Unable to create ber encoding of key') self._write_private_key_file('RSA', filename, str(b), password)
def _encode_key(self): if (self.p is None) or (self.q is None): raise SSHException('Not enough key info to write private key file') keylist = [ 0, self.n, self.e, self.d, self.p, self.q, self.d % (self.p - 1), self.d % (self.q - 1), util.mod_inverse(self.q, self.p) ] try: b = BER() b.encode(keylist) except BERException: raise SSHException('Unable to create ber encoding of key') return b.asbytes()
def _encode_key(self): if (self.p is None) or (self.q is None): raise SSHException('Not enough key info to write private key file') keylist = [0, self.n, self.e, self.d, self.p, self.q, self.d % (self.p - 1), self.d % (self.q - 1), util.mod_inverse(self.q, self.p)] try: b = BER() b.encode(keylist) except BERException: raise SSHException('Unable to create ber encoding of key') return b.asbytes()
def get_private_rsa_fingerprint(key_location): """ Returns the fingerprint of a private RSA key as a 59-character string (40 characters separated every 2 characters by a ':'). The fingerprint is computed using a SHA1 digest of the DER encoded RSA private key. """ try: k = RSAKey.from_private_key_file(key_location) except paramiko.SSHException: raise exception.SSHError("Invalid RSA private key file: %s" % key_location) params = dict(invq=util.mod_inverse(k.q, k.p), dp=k.d % (k.p - 1), dq=k.d % (k.q - 1), d=k.d, n=k.n, p=k.p, q=k.q, e=k.e) assert len(params) == 8 # must convert from pkcs1 to pkcs8 and then DER encode pkcs8der = export_rsa_to_pkcs8(params) sha1digest = hashlib.sha1(pkcs8der).hexdigest() return insert_char_every_n_chars(sha1digest, ':', 2)