~certify-web-dev/twisted/certify-trunk

« back to all changes in this revision

Viewing changes to twisted/conch/test/test_keys.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2007-01-17 14:52:35 UTC
  • mfrom: (1.1.5 upstream) (2.1.2 etch)
  • Revision ID: james.westby@ubuntu.com-20070117145235-btmig6qfmqfen0om
Tags: 2.5.0-0ubuntu1
New upstream version, compatible with python2.5.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- test-case-name: twisted.conch.test.test_keys -*-
 
2
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
 
3
# See LICENSE for details.
 
4
 
 
5
try:
 
6
    import Crypto
 
7
except ImportError:
 
8
    Crypto = None
 
9
 
 
10
from twisted.conch.ssh import keys
 
11
from twisted.trial import unittest
 
12
 
 
13
publicRSA_openssh = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEArzJx8OYOnJmzf4tfBEvLi8DVPrJ3/c9k2I/Az64fxjHf9imyRJbixtQhlH9lfNjUIx+4LmrJH5QNRsFporcHDKOTwTTYLh5KmRpslkYHRivcJSkbh/C+BR3utDS555mV comment"
 
14
 
 
15
privateRSA_openssh = """-----BEGIN RSA PRIVATE KEY-----
 
16
MIIByAIBAAJhAK8ycfDmDpyZs3+LXwRLy4vA1T6yd/3PZNiPwM+uH8Yx3/YpskSW
 
17
4sbUIZR/ZXzY1CMfuC5qyR+UDUbBaaK3Bwyjk8E02C4eSpkabJZGB0Yr3CUpG4fw
 
18
vgUd7rQ0ueeZlQIBIwJgbh+1VZfr7WftK5lu7MHtqE1S1vPWZQYE3+VUn8yJADyb
 
19
Z4fsZaCrzW9lkIqXkE3GIY+ojdhZhkO1gbG0118sIgphwSWKRxK0mvh6ERxKqIt1
 
20
xJEJO74EykXZV4oNJ8sjAjEA3J9r2ZghVhGN6V8DnQrTk24Td0E8hU8AcP0FVP+8
 
21
PQm/g/aXf2QQkQT+omdHVEJrAjEAy0pL0EBH6EVS98evDCBtQw22OZT52qXlAwZ2
 
22
gyTriKFVoqjeEjt3SZKKqXHSApP/AjBLpF99zcJJZRq2abgYlf9lv1chkrWqDHUu
 
23
DZttmYJeEfiFBBavVYIF1dOlZT0G8jMCMBc7sOSZodFnAiryP+Qg9otSBjJ3bQML
 
24
pSTqy7c3a2AScC/YyOwkDaICHnnD3XyjMwIxALRzl0tQEKMXs6hH8ToUdlLROCrP
 
25
EhQ0wahUTCk1gKA4uPD6TMTChavbh4K63OvbKg==
 
26
-----END RSA PRIVATE KEY-----"""
 
27
 
 
28
publicDSA_openssh = "ssh-dss AAAAB3NzaC1kc3MAAABBAIbwTOSsZ7Bl7U1KyMNqV13Tu7yRAtTr70PVI3QnfrPumf2UzCgpL1ljbKxSfAi05XvrE/1vfCFAsFYXRZLhQy0AAAAVAM965Akmo6eAi7K+k9qDR4TotFAXAAAAQADZlpTW964haQWS4vC063NGdldT6xpUGDcDRqbm90CoPEa2RmNOuOqi8lnbhYraEzypYH3K4Gzv/bxCBnKtHRUAAABAK+1osyWBS0+P90u/rAuko6chZ98thUSY2kLSHp6hLKyy2bjnT29h7haELE+XHfq2bM9fckDx2FLOSIJzy83VmQ== comment"
 
29
 
 
30
privateDSA_openssh = """-----BEGIN DSA PRIVATE KEY-----
 
31
MIH4AgEAAkEAhvBM5KxnsGXtTUrIw2pXXdO7vJEC1OvvQ9UjdCd+s+6Z/ZTMKCkv
 
32
WWNsrFJ8CLTle+sT/W98IUCwVhdFkuFDLQIVAM965Akmo6eAi7K+k9qDR4TotFAX
 
33
AkAA2ZaU1veuIWkFkuLwtOtzRnZXU+saVBg3A0am5vdAqDxGtkZjTrjqovJZ24WK
 
34
2hM8qWB9yuBs7/28QgZyrR0VAkAr7WizJYFLT4/3S7+sC6SjpyFn3y2FRJjaQtIe
 
35
nqEsrLLZuOdPb2HuFoQsT5cd+rZsz19yQPHYUs5IgnPLzdWZAhUAl1TqdmlAG/b4
 
36
nnVchGiO9sML8MM=
 
37
-----END DSA PRIVATE KEY-----"""
 
38
 
 
39
publicRSA_lsh = """{KDEwOnB1YmxpYy1rZXkoMTQ6cnNhLXBrY3MxLXNoYTEoMTpuNjU6AJidzg8akh9enh1JrIQyL8mrqfnJT3sBxhDkIFXqjlyN2OK2al2s5mRVNMrhzL7rX8hptPX597nHmfAS65yA85cpKDE6ZTQ6PTiAYykpKQ==}"""
 
40
 
 
41
privateRSA_lsh = """(11:private-key(9:rsa-pkcs1(1:n65:\x00\x98\x9d\xce\x0f\x1a\x92\x1f^\x9e\x1dI\xac\x842/\xc9\xab\xa9\xf9\xc9O{\x01\xc6\x10\xe4 U\xea\x8e\\\x8d\xd8\xe2\xb6j]\xac\xe6dU4\xca\xe1\xcc\xbe\xeb_\xc8i\xb4\xf5\xf9\xf7\xb9\xc7\x99\xf0\x12\xeb\x9c\x80\xf3\x97)(1:e4:=8\x80c)(1:d64:h>)i\xb7\xc3z_\x94\xd30\xbd\xdf\xf5\x9d\x8d\xd7\xb4\xb2*\xcb\xef\xae~yq\xb8\x8a\xda\xae\xdf\xa3h\x9a=6{c\xb9\xf4\xa5\xe9\xe0\xf9a\xf5\xe7$*\x83\r\x1e\xcb[\xc8\xda\n\xa1\x94+\x00\x96d\xfb)(1:p33:\x00\xfd\x92\xdf\xdb\xd6\xebU\x82\xc6\x86eq9Dv\x98B\xd6\xfd\xa7\xa8,\x99\x1e\xa3\x88>\xa4A\xb7;i)(1:q33:\x00\x9a\x13\xa3\t\xd1@u\x86\xe9\xdeZym\xa8\x9c\xba\xcb\x18\x8c\xfcwJ*\x08\x0c\xac\xee\x0bU[\xd6\xff)(1:a33:\x00\xc4\xe3w\xe4\xbc\xf1q\x16\x84%D*]\xd0\x8d\xa2\xaf\x99\xff\x11\xf5\x8f\x06\xd5\x8c\xa6FH\xfe\x8e\xea\x8b)(1:b32:qx\xbd\xa6\x88\x13p\x94W\xfd\xbff\x941\xc3\xac\xa8\xaf\xe6\xaavO+\x95\xa7\x06|\x91~\xc5\xc7\xb1)(1:c32:9z\xf1\x80\xbdLE\x8c?\x8f\xd3\xe8\x05\x12\xc2@\xedZ\xec/\xb9\x8c\xdd\x07\xccM\x88g\x05jG2)))"""
 
42
 
 
43
publicDSA_lsh = """{KDEwOnB1YmxpYy1rZXkoMzpkc2EoMTpwNjU6AOiMNL79iqUfSqaIHIySHKt4Jlc272yYTzAXmEg77NCgtyfDjuAcHHgwTphBA1l53i/4AAiaUBcU8qPY/Ug/MPcpKDE6cTIxOgDYKP8uLv/m6aUDAA7l5hjMq6Iy7ykoMTpnNjU6ANLKfX/CG7L9o7TQzwLa/X/hb1ZZ+++bySGQep5Ka2lCLm+gff3erqKdxwn5kjqEWq/tXtnSx3rl3TgiwO5R1GEpKDE6eTY1OgDZKD/rhxonz8sugmAcf/wIIhq4M4A+XFOzkEHj0XWHGpjycC8moBWwsIXRuRYCjbl5dA6wVv+xDrf9c6a6GMhhKSkp}"""
 
44
 
 
45
privateDSA_lsh = """(11:private-key(3:dsa(1:p65:\x00\xe8\x8c4\xbe\xfd\x8a\xa5\x1fJ\xa6\x88\x1c\x8c\x92\x1c\xabx&W6\xefl\x98O0\x17\x98H;\xec\xd0\xa0\xb7\'\xc3\x8e\xe0\x1c\x1cx0N\x98A\x03Yy\xde/\xf8\x00\x08\x9aP\x17\x14\xf2\xa3\xd8\xfdH?0\xf7)(1:q21:\x00\xd8(\xff..\xff\xe6\xe9\xa5\x03\x00\x0e\xe5\xe6\x18\xcc\xab\xa22\xef)(1:g65:\x00\xd2\xca}\x7f\xc2\x1b\xb2\xfd\xa3\xb4\xd0\xcf\x02\xda\xfd\x7f\xe1oVY\xfb\xef\x9b\xc9!\x90z\x9eJkiB.o\xa0}\xfd\xde\xae\xa2\x9d\xc7\t\xf9\x92:\x84Z\xaf\xed^\xd9\xd2\xc7z\xe5\xdd8"\xc0\xeeQ\xd4a)(1:y65:\x00\xd9(?\xeb\x87\x1a\'\xcf\xcb.\x82`\x1c\x7f\xfc\x08"\x1a\xb83\x80>\\S\xb3\x90A\xe3\xd1u\x87\x1a\x98\xf2p/&\xa0\x15\xb0\xb0\x85\xd1\xb9\x16\x02\x8d\xb9yt\x0e\xb0V\xff\xb1\x0e\xb7\xfds\xa6\xba\x18\xc8a)(1:x20:>\xbb\xe4D\xb9\xb8\xb5\xf8\xf2-}\xf7\x0f\x90`\x968\xd3\x98Q)))"""
 
46
 
 
47
class SSHKeysHandlingTestCase(unittest.TestCase):
 
48
    """
 
49
    test the handling of reading/signing/verifying with RSA and DSA keys
 
50
    assumed test keys are in test/
 
51
    """
 
52
 
 
53
    if not Crypto:
 
54
        skip = "cannot run w/o PyCrypto"
 
55
 
 
56
    def testDSA(self):
 
57
        """test DSA keys
 
58
        """
 
59
        self._testKey(publicDSA_openssh, privateDSA_openssh, 'openssh')
 
60
        self._testKey(publicDSA_lsh, privateDSA_lsh, 'lsh')
 
61
 
 
62
    def testRSA(self):
 
63
        """test RSA keys
 
64
        """
 
65
        self._testKey(publicRSA_openssh, privateRSA_openssh, 'openssh')
 
66
        self._testKey(publicRSA_lsh, privateRSA_lsh, 'lsh')
 
67
 
 
68
    def _testKey(self, pubData, privData, keyType):
 
69
        privKey = keys.getPrivateKeyObject(data = privData)
 
70
        pubStr = keys.getPublicKeyString(data = pubData)
 
71
        pubKey = keys.getPublicKeyObject(pubStr)
 
72
        self._testKeySignVerify(privKey, pubKey)
 
73
        self._testKeyFromString(privKey, pubKey, privData, pubData)
 
74
        self._testGenerateKey(privKey, pubKey, privData, pubData, keyType)
 
75
 
 
76
    def _testKeySignVerify(self, priv, pub):
 
77
        testData = 'this is the test data'
 
78
        sig = keys.signData(priv, testData)
 
79
        self.assert_(keys.verifySignature(priv, sig, testData),
 
80
                     'verifying with private %s failed' %
 
81
                         keys.objectType(priv))
 
82
        self.assert_(keys.verifySignature(pub, sig, testData),
 
83
                     'verifying with public %s failed' %
 
84
                         keys.objectType(pub))
 
85
        self.failIf(keys.verifySignature(priv, sig, 'other data'),
 
86
                    'verified bad data with %s' %
 
87
                        keys.objectType(priv))
 
88
        self.failIf(keys.verifySignature(priv, 'bad sig', testData),
 
89
                    'verified badsign with %s' %
 
90
                        keys.objectType(priv))
 
91
 
 
92
    def _testKeyFromString(self, privKey, pubKey, privData, pubData):
 
93
        keyType = keys.objectType(privKey)
 
94
        privFS = keys.getPrivateKeyObject(data = privData)
 
95
        pubFS = keys.getPublicKeyObject(keys.getPublicKeyString(data=pubData))
 
96
        for k in privFS.keydata:
 
97
            if getattr(privFS, k) != getattr(privKey, k):
 
98
                self.fail('getting %s private key from string failed' % keyType)
 
99
        for k in pubFS.keydata:
 
100
            if hasattr(pubFS, k):
 
101
                if getattr(pubFS, k) != getattr(pubKey, k):
 
102
                    self.fail('getting %s public key from string failed' % keyType)
 
103
 
 
104
    def _testGenerateKey(self, privKey, pubKey, privData, pubData, keyType):
 
105
        self.assertEquals(keys.makePublicKeyString(pubKey, 'comment', keyType), pubData)
 
106
        self.assertEquals(keys.makePublicKeyString(privKey, 'comment', keyType), pubData)
 
107
        self.assertEquals(keys.makePrivateKeyString(privKey, kind=keyType), privData)
 
108
        if keyType != 'lsh':
 
109
            encData = keys.makePrivateKeyString(privKey, passphrase='test', kind=keyType)
 
110
            self.assertEquals(
 
111
                keys.getPrivateKeyObject(data = encData,
 
112
                                     passphrase = 'test').__getstate__(),
 
113
                privKey.__getstate__())