Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / userdata / util.py @ 19b2c29d

History | View | Annotate | Download (2.8 kB)

1 91884d63 Giorgos Korfiatis
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 91884d63 Giorgos Korfiatis
#
3 91884d63 Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or without
4 91884d63 Giorgos Korfiatis
# modification, are permitted provided that the following conditions
5 91884d63 Giorgos Korfiatis
# are met:
6 91884d63 Giorgos Korfiatis
#
7 91884d63 Giorgos Korfiatis
#   1. Redistributions of source code must retain the above copyright
8 91884d63 Giorgos Korfiatis
#      notice, this list of conditions and the following disclaimer.
9 91884d63 Giorgos Korfiatis
#
10 91884d63 Giorgos Korfiatis
#  2. Redistributions in binary form must reproduce the above copyright
11 91884d63 Giorgos Korfiatis
#     notice, this list of conditions and the following disclaimer in the
12 91884d63 Giorgos Korfiatis
#     documentation and/or other materials provided with the distribution.
13 91884d63 Giorgos Korfiatis
#
14 91884d63 Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 91884d63 Giorgos Korfiatis
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 91884d63 Giorgos Korfiatis
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 91884d63 Giorgos Korfiatis
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 91884d63 Giorgos Korfiatis
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 91884d63 Giorgos Korfiatis
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 91884d63 Giorgos Korfiatis
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 91884d63 Giorgos Korfiatis
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 91884d63 Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 91884d63 Giorgos Korfiatis
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 91884d63 Giorgos Korfiatis
# SUCH DAMAGE.
25 91884d63 Giorgos Korfiatis
#
26 91884d63 Giorgos Korfiatis
# The views and conclusions contained in the software and documentation are
27 91884d63 Giorgos Korfiatis
# those of the authors and should not be interpreted as representing official
28 91884d63 Giorgos Korfiatis
# policies, either expressed or implied, of GRNET S.A.
29 91884d63 Giorgos Korfiatis
30 8bf3a249 Kostas Papadimitriou
import binascii
31 8bf3a249 Kostas Papadimitriou
32 b47b110d Kostas Papadimitriou
from synnefo.userdata.asn1 import DerObject, DerSequence
33 8bf3a249 Kostas Papadimitriou
34 8bf3a249 Kostas Papadimitriou
def exportKey(keyobj, format='PEM'):
35 8bf3a249 Kostas Papadimitriou
    """Export the RSA key. A string is returned
36 8bf3a249 Kostas Papadimitriou
    with the encoded public or the private half
37 8bf3a249 Kostas Papadimitriou
    under the selected format.
38 8bf3a249 Kostas Papadimitriou

39 8bf3a249 Kostas Papadimitriou
    format: 'DER' (PKCS#1) or 'PEM' (RFC1421)
40 8bf3a249 Kostas Papadimitriou
    """
41 8bf3a249 Kostas Papadimitriou
    der = DerSequence()
42 8bf3a249 Kostas Papadimitriou
    if keyobj.has_private():
43 8bf3a249 Kostas Papadimitriou
        keyType = "RSA PRIVATE"
44 8bf3a249 Kostas Papadimitriou
        der[:] = [ 0, keyobj.n, keyobj.e, keyobj.d, keyobj.p, keyobj.q,
45 8bf3a249 Kostas Papadimitriou
        keyobj.d % (keyobj.p-1), keyobj.d % (keyobj.q-1),
46 8bf3a249 Kostas Papadimitriou
        keyobj.u ]
47 8bf3a249 Kostas Papadimitriou
    else:
48 8bf3a249 Kostas Papadimitriou
        keyType = "PUBLIC"
49 8bf3a249 Kostas Papadimitriou
        der.append('\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00')
50 8bf3a249 Kostas Papadimitriou
        bitmap = DerObject('BIT STRING')
51 8bf3a249 Kostas Papadimitriou
        derPK = DerSequence()
52 8bf3a249 Kostas Papadimitriou
        derPK[:] = [ keyobj.n, keyobj.e ]
53 8bf3a249 Kostas Papadimitriou
        bitmap.payload = '\x00' + derPK.encode()
54 8bf3a249 Kostas Papadimitriou
        der.append(bitmap.encode())
55 8bf3a249 Kostas Papadimitriou
    if format=='DER':
56 8bf3a249 Kostas Papadimitriou
        return der.encode()
57 8bf3a249 Kostas Papadimitriou
    if format=='PEM':
58 8bf3a249 Kostas Papadimitriou
        pem = "-----BEGIN %s KEY-----\n" % keyType
59 8bf3a249 Kostas Papadimitriou
        binaryKey = der.encode()
60 8bf3a249 Kostas Papadimitriou
        # Each BASE64 line can take up to 64 characters (=48 bytes of data)
61 8bf3a249 Kostas Papadimitriou
        chunks = [ binascii.b2a_base64(binaryKey[i:i+48]) for i in range(0, len(binaryKey), 48) ]
62 8bf3a249 Kostas Papadimitriou
        pem += ''.join(chunks)
63 8bf3a249 Kostas Papadimitriou
        pem += "-----END %s KEY-----" % keyType
64 8bf3a249 Kostas Papadimitriou
        return pem
65 8bf3a249 Kostas Papadimitriou
    return ValueError("")