| # | |
| # This file is part of pyasn1-modules software. | |
| # | |
| # Copyright (c) 2005-2019, Ilya Etingof <[email protected]> | |
| # License: http://snmplabs.com/pyasn1/license.html | |
| # | |
| import sys | |
| from pyasn1.codec.der.decoder import decode as der_decode | |
| from pyasn1.codec.der.encoder import encode as der_encode | |
| from pyasn1.type import univ | |
| from pyasn1_modules import pem | |
| from pyasn1_modules import rfc5280 | |
| try: | |
| import unittest2 as unittest | |
| except ImportError: | |
| import unittest | |
| class CertificateTestCase(unittest.TestCase): | |
| pem_text = """\ | |
| MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 | |
| IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz | |
| BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y | |
| aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG | |
| 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy | |
| NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y | |
| azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs | |
| YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw | |
| Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl | |
| cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD | |
| cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs | |
| 2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY | |
| JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE | |
| Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ | |
| n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A | |
| PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu | |
| """ | |
| def setUp(self): | |
| self.asn1Spec = rfc5280.Certificate() | |
| def testDerCodec(self): | |
| substrate = pem.readBase64fromText(self.pem_text) | |
| asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec) | |
| assert not rest | |
| assert asn1Object.prettyPrint() | |
| assert der_encode(asn1Object) == substrate | |
| class CertificateListTestCase(unittest.TestCase): | |
| pem_text = """\ | |
| MIIBVjCBwAIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJBVTETMBEGA1UE | |
| CBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk | |
| MRUwEwYDVQQDEwxzbm1wbGFicy5jb20xIDAeBgkqhkiG9w0BCQEWEWluZm9Ac25t | |
| cGxhYnMuY29tFw0xMjA0MTExMzQwNTlaFw0xMjA1MTExMzQwNTlaoA4wDDAKBgNV | |
| HRQEAwIBATANBgkqhkiG9w0BAQUFAAOBgQC1D/wwnrcY/uFBHGc6SyoYss2kn+nY | |
| RTwzXmmldbNTCQ03x5vkWGGIaRJdN8QeCzbEi7gpgxgpxAx6Y5WkxkMQ1UPjNM5n | |
| DGVDOtR0dskFrrbHuNpWqWrDaBN0/ryZiWKjr9JRbrpkHgVY29I1gLooQ6IHuKHY | |
| vjnIhxTFoCb5vA== | |
| """ | |
| def setUp(self): | |
| self.asn1Spec = rfc5280.CertificateList() | |
| def testDerCodec(self): | |
| substrate = pem.readBase64fromText(self.pem_text) | |
| asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec) | |
| assert not rest | |
| assert asn1Object.prettyPrint() | |
| assert der_encode(asn1Object) == substrate | |
| class CertificateOpenTypeTestCase(unittest.TestCase): | |
| pem_text = """\ | |
| MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 | |
| IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz | |
| BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y | |
| aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG | |
| 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy | |
| NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y | |
| azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs | |
| YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw | |
| Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl | |
| cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD | |
| cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs | |
| 2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY | |
| JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE | |
| Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ | |
| n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A | |
| PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu | |
| """ | |
| def setUp(self): | |
| self.asn1Spec = rfc5280.Certificate() | |
| def testDerCodec(self): | |
| substrate = pem.readBase64fromText(self.pem_text) | |
| openTypesMap = { | |
| univ.ObjectIdentifier('1.2.840.113549.1.1.1'): univ.Null(""), | |
| univ.ObjectIdentifier('1.2.840.113549.1.1.5'): univ.Null(""), | |
| univ.ObjectIdentifier('1.2.840.113549.1.1.11'): univ.Null(""), | |
| } | |
| asn1Object, rest = der_decode(substrate, | |
| asn1Spec=self.asn1Spec, | |
| openTypes=openTypesMap, | |
| decodeOpenTypes=True) | |
| assert not rest | |
| assert asn1Object.prettyPrint() | |
| assert der_encode(asn1Object) == substrate | |
| sig_alg = asn1Object['tbsCertificate']['signature'] | |
| assert sig_alg['parameters'] == univ.Null("") | |
| spki_alg = asn1Object['tbsCertificate']['subjectPublicKeyInfo']['algorithm'] | |
| assert spki_alg['parameters'] == univ.Null("") | |
| for rdn in asn1Object['tbsCertificate']['subject']['rdnSequence']: | |
| for atv in rdn: | |
| if atv['type'] == rfc5280.id_emailAddress: | |
| assert "valicert.com" in atv['value'] | |
| else: | |
| atv_ps = str(atv['value']['printableString']) | |
| assert "valicert" in atv_ps.lower() | |
| class CertificateListOpenTypeTestCase(unittest.TestCase): | |
| pem_text = """\ | |
| MIIBVjCBwAIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJBVTETMBEGA1UE | |
| CBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk | |
| MRUwEwYDVQQDEwxzbm1wbGFicy5jb20xIDAeBgkqhkiG9w0BCQEWEWluZm9Ac25t | |
| cGxhYnMuY29tFw0xMjA0MTExMzQwNTlaFw0xMjA1MTExMzQwNTlaoA4wDDAKBgNV | |
| HRQEAwIBATANBgkqhkiG9w0BAQUFAAOBgQC1D/wwnrcY/uFBHGc6SyoYss2kn+nY | |
| RTwzXmmldbNTCQ03x5vkWGGIaRJdN8QeCzbEi7gpgxgpxAx6Y5WkxkMQ1UPjNM5n | |
| DGVDOtR0dskFrrbHuNpWqWrDaBN0/ryZiWKjr9JRbrpkHgVY29I1gLooQ6IHuKHY | |
| vjnIhxTFoCb5vA== | |
| """ | |
| def setUp(self): | |
| self.asn1Spec = rfc5280.CertificateList() | |
| def testDerCodec(self): | |
| substrate = pem.readBase64fromText(self.pem_text) | |
| openTypesMap = { | |
| univ.ObjectIdentifier('1.2.840.113549.1.1.1'): univ.Null(""), | |
| univ.ObjectIdentifier('1.2.840.113549.1.1.5'): univ.Null(""), | |
| univ.ObjectIdentifier('1.2.840.113549.1.1.11'): univ.Null(""), | |
| } | |
| asn1Object, rest = der_decode(substrate, | |
| asn1Spec=self.asn1Spec, | |
| openTypes=openTypesMap, | |
| decodeOpenTypes=True) | |
| assert not rest | |
| assert asn1Object.prettyPrint() | |
| assert der_encode(asn1Object) == substrate | |
| sig_alg = asn1Object['tbsCertList']['signature'] | |
| assert sig_alg['parameters'] == univ.Null("") | |
| for rdn in asn1Object['tbsCertList']['issuer']['rdnSequence']: | |
| for atv in rdn: | |
| if atv['type'] == rfc5280.id_emailAddress: | |
| assert "snmplabs.com" in atv['value'] | |
| elif atv['type'] == rfc5280.id_at_countryName: | |
| assert atv['value'] == 'AU' | |
| else: | |
| assert len(atv['value']['printableString']) > 9 | |
| crl_extn_count = 0 | |
| for extn in asn1Object['tbsCertList']['crlExtensions']: | |
| if extn['extnID'] in rfc5280.certificateExtensionsMap.keys(): | |
| ev, rest = der_decode(extn['extnValue'], | |
| asn1Spec=rfc5280.certificateExtensionsMap[extn['extnID']]) | |
| assert not rest | |
| assert ev.prettyPrint() | |
| assert der_encode(ev) == extn['extnValue'] | |
| crl_extn_count += 1 | |
| assert crl_extn_count == 1 | |
| def testExtensionsMap(self): | |
| substrate = pem.readBase64fromText(self.pem_text) | |
| asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec) | |
| assert not rest | |
| assert asn1Object.prettyPrint() | |
| assert der_encode(asn1Object) == substrate | |
| cert_extn_count = 0 | |
| for extn in asn1Object['tbsCertList']['crlExtensions']: | |
| if extn['extnID'] in rfc5280.certificateExtensionsMap.keys(): | |
| extnValue, rest = der_decode(extn['extnValue'], | |
| asn1Spec=rfc5280.certificateExtensionsMap[extn['extnID']]) | |
| assert der_encode(extnValue) == extn['extnValue'] | |
| cert_extn_count += 1 | |
| assert cert_extn_count == 1 | |
| class ORAddressOpenTypeTestCase(unittest.TestCase): | |
| oraddress_pem_text = """\ | |
| MEMwK2EEEwJHQmIKEwhHT0xEIDQwMKIHEwVVSy5BQ4MHU2FsZm9yZKYFEwNSLUQx | |
| FDASgAEBoQ0TC1N0ZXZlIEtpbGxl | |
| """ | |
| def setUp(self): | |
| self.asn1Spec = rfc5280.ORAddress() | |
| def testDecodeOpenTypes(self): | |
| substrate = pem.readBase64fromText(self.oraddress_pem_text) | |
| asn1Object, rest = der_decode(substrate, | |
| asn1Spec=self.asn1Spec, | |
| decodeOpenTypes=True) | |
| assert not rest | |
| assert asn1Object.prettyPrint() | |
| assert der_encode(asn1Object) == substrate | |
| ea0 = asn1Object['extension-attributes'][0] | |
| assert ea0['extension-attribute-type'] == rfc5280.common_name | |
| assert ea0['extension-attribute-value'] == "Steve Kille" | |
| suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__]) | |
| if __name__ == '__main__': | |
| import sys | |
| result = unittest.TextTestRunner(verbosity=2).run(suite) | |
| sys.exit(not result.wasSuccessful()) |