import repository from arizona
[raven.git] / lib / ravenlib / files / sshkey.py
1 # SSH to SSL Key Converter
2 # Description: Convert SSH public keys to OpenSSL public keys
3 # Author: Scott Baker
4 # Project: Raven, http://raven.cs.arizona.edu
5
6 import base64
7 import os
8 import socket
9 import sys
10
11 import asn1
12
13 def get_str(src):
14     len = (ord(src[3]) << 24) + (ord(src[2]) <<16) + (ord(src[1]) << 8) + ord(src[0])
15     len = socket.ntohl(len)
16
17     src = src[4:]
18     dest = src[:len]
19     src = src[len:]
20
21     return (src, dest)
22
23 # convert a string in DER format to PEM format
24
25 def pem_format(x):
26        x = base64.b64encode(x)
27        result = "-----BEGIN PUBLIC KEY-----\n"
28        while (x != ""):
29           result = result + x[:64] + "\n"
30           x = x[64:]
31        result = result + "-----END PUBLIC KEY-----\n"
32        return result
33
34 # an all-python solution, using ASN.1 python routines
35 #   key_str is the base64-encoded SSH key string
36 #   returns a PEM-formatted SSL key string, with newlines embedded
37
38 def ssh_key_to_ssl(key_str):
39    tmp = base64.b64decode(key_str)
40    (tmp, kind) = get_str(tmp)
41
42    if (kind == "ssh-rsa"):
43        (tmp, e) = get_str(tmp)
44        (tmp, n) = get_str(tmp)
45
46        der = asn1.rsa_pubkey(n,e).encode()
47        ssl_key_str = pem_format(der)
48
49        #f = open("foo.der","w")
50        #f.write(der)
51        #f.close()
52    else:
53        (tmp, p) = get_str(tmp)
54        (tmp, q) = get_str(tmp)
55        (tmp, g) = get_str(tmp)
56        (tmp, pk) = get_str(tmp)
57
58        der = asn1.dsa_pubkey(p,q,g,pk).encode()
59        ssl_key_str = pem_format(der)
60
61        #f = open("foo.der","w")
62        #f.write(der)
63        #f.close()
64
65    return ssl_key_str
66
67 def ssh_filestr_to_ssl(sshstr):
68    # format of an ssh keyfile is:
69    #    ssh-rsa|ssh-dsa base64keystring username
70
71    parts = sshstr.split(" ")
72    ssh_key_str = parts[1]
73
74    ssl_key_str = ssh_key_to_ssl(ssh_key_str)
75
76    return ssl_key_str
77
78 def ssh_file_to_ssl(sshfn):
79    f = open(sshfn)
80    ssh_key_str = f.read()
81    f.close()
82
83    return ssh_filestr_to_ssl(ssh_key_str)
84
85 def ssh_file_to_ssl_file(sshfn, sslfn):
86    ssl_key_str = ssh_file_to_ssl(sshfn)
87
88    f = open(sslfn, "w")
89    f.write(ssl_key_str)
90    f.close()
91
92