1#
2# This file is part of pyasn1-modules software.
3#
4# Created by Russ Housley
5# Copyright (c) 2019, Vigil Security, LLC
6# License: http://snmplabs.com/pyasn1/license.html
7#
8
9import sys
10
11from pyasn1.codec.der.decoder import decode as der_decode
12from pyasn1.codec.der.encoder import encode as der_encode
13
14from pyasn1.compat.octets import str2octs
15
16from pyasn1_modules import pem
17from pyasn1_modules import rfc5280
18from pyasn1_modules import rfc4334
19
20try:
21    import unittest2 as unittest
22except ImportError:
23    import unittest
24
25class CertificateTestCase(unittest.TestCase):
26    cert_pem_text = """\
27MIICqzCCAjCgAwIBAgIJAKWzVCgbsG4/MAoGCCqGSM49BAMDMD8xCzAJBgNVBAYT
28AlVTMQswCQYDVQQIDAJWQTEQMA4GA1UEBwwHSGVybmRvbjERMA8GA1UECgwIQm9n
29dXMgQ0EwHhcNMTkwNzE5MTk0MjQ3WhcNMjAwNzE4MTk0MjQ3WjBjMQswCQYDVQQG
30EwJVUzELMAkGA1UECBMCVkExEDAOBgNVBAcTB0hlcm5kb24xGzAZBgNVBAoTElZp
31Z2lsIFNlY3VyaXR5IExMQzEYMBYGA1UEAxMPZWFwLmV4YW1wbGUuY29tMHYwEAYH
32KoZIzj0CAQYFK4EEACIDYgAEMMbnIp2BUbuyMgH9HhNHrh7VBy7ql2lBjGRSsefR
33Wa7+vCWs4uviW6On4eem5YoP9/UdO7DaIL+/J9/3DJHERI17oFxn+YWiE4JwXofy
34QwfSu3cncVNMqpiDjEkUGGvBo4HTMIHQMAsGA1UdDwQEAwIHgDBCBglghkgBhvhC
35AQ0ENRYzVGhpcyBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgdHJ1c3RlZCBmb3IgYW55
36IHB1cnBvc2UuMB0GA1UdDgQWBBSDjPGr7M742rsE4oQGwBvGvllZ+zAfBgNVHSME
37GDAWgBTyNds0BNqlVfK9aQOZsGLs4hUIwTAeBggrBgEFBQcBDQQSMBAEB0V4YW1w
38bGUEBUJvZ3VzMB0GA1UdJQQWMBQGCCsGAQUFBwMOBggrBgEFBQcDDTAKBggqhkjO
39PQQDAwNpADBmAjEAmCPZnnlUQOKlcOIIOgFrRCkOqO0ESs+dobYwAc2rFCBtQyP7
40C3N00xkX8WZZpiAZAjEAi1Z5+nGbJg5eJTc8fwudutN/HNwJEIS6mHds9kfcy26x
41DAlVlhox680Jxy5J8Pkx
42"""
43
44    def setUp(self):
45        self.asn1Spec = rfc5280.Certificate()
46
47    def testDerCodec(self):
48        substrate = pem.readBase64fromText(self.cert_pem_text)
49        asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec)
50        assert not rest
51        assert asn1Object.prettyPrint()
52        assert der_encode(asn1Object) == substrate
53
54    def testOpenTypes(self):
55        substrate = pem.readBase64fromText(self.cert_pem_text)
56        asn1Object, rest = der_decode(substrate,
57            asn1Spec=self.asn1Spec,
58            decodeOpenTypes=True)
59        assert not rest
60        assert asn1Object.prettyPrint()
61        assert der_encode(asn1Object) == substrate
62
63        extn_list = [ ]
64        for extn in asn1Object['tbsCertificate']['extensions']:
65            extn_list.append(extn['extnID'])
66            if extn['extnID'] in rfc5280.certificateExtensionsMap.keys():
67                extnValue, rest = der_decode(extn['extnValue'],
68                    asn1Spec=rfc5280.certificateExtensionsMap[extn['extnID']])
69                assert der_encode(extnValue) == extn['extnValue']
70
71                if extn['extnID'] == rfc4334.id_pe_wlanSSID:
72                    assert str2octs('Example') in extnValue
73
74                if extn['extnID'] == rfc5280.id_ce_extKeyUsage:
75                     assert rfc4334.id_kp_eapOverLAN in extnValue
76                     assert rfc4334.id_kp_eapOverPPP in extnValue
77
78        assert rfc4334.id_pe_wlanSSID in extn_list
79        assert rfc5280.id_ce_extKeyUsage in extn_list
80
81
82suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
83
84if __name__ == '__main__':
85    unittest.TextTestRunner(verbosity=2).run(suite)
86