1# 2# This file is part of pyasn1-modules software. 3# 4# Copyright (c) 2019, Vigil Security, LLC 5# License: http://snmplabs.com/pyasn1/license.html 6# 7import sys 8 9from pyasn1.codec.der.decoder import decode as der_decode 10from pyasn1.codec.der.encoder import encode as der_encode 11 12from pyasn1_modules import pem 13from pyasn1_modules import rfc5652 14from pyasn1_modules import rfc6482 15 16try: 17 import unittest2 as unittest 18except ImportError: 19 import unittest 20 21 22class RPKIROATestCase(unittest.TestCase): 23 roa_pem_text = """\ 24MIIGvwYJKoZIhvcNAQcCoIIGsDCCBqwCAQMxDTALBglghkgBZQMEAgEwKgYLKoZIhvcNAQkQ 25ARigGwQZMBcCAwDj+zAQMA4EAgABMAgwBgMEAJMcLaCCBLwwggS4MIIDoKADAgECAgIGGDAN 26BgkqhkiG9w0BAQsFADAzMTEwLwYDVQQDEyg2ZDZmYmZhOTc1M2RiOGQ4NDY0MzNkYjUzNTFk 27OWE5ZWMwN2M5NmJkMB4XDTE5MDgyMDAwNDkyOVoXDTIwMDcwMTAwMDAwMFowMzExMC8GA1UE 28AxMoNUI4M0REODdERTlBQzdDNkUzNEI4NzdERjUwMUEyQjEyMzBBODFCNDCCASIwDQYJKoZI 29hvcNAQEBBQADggEPADCCAQoCggEBAJcnDgSUtiQeelGQsTx2Ou5cgmfq6KPSEgMz/XyZrRzj 30wcqUQ/DyMYHyRJK8umKZjfMu+rItoPSkE26Wi9PcSnfuY+SyS9chTAtNOGMES6MbtHjNTmBF 31Xar5CFGM8teLIRHlCcScesgSR7q2eKgQ+cLiLTZnol0Mpmuf2NIs+V63Y4Hn/T7QOoudg9nU 32tmsh31hUN4jIENEXFvNDovkray25rl9aqFfW+dtkoNtdJjp367nNXCdp3GdE/3z0SIqT8wnh 33F67tgR22mwzex3umteQBwmM+iR28vuHL4E5jwRKBoiEgGPYqq7gbfkcoFtR3AV6QGKSK2aJU 34mUi+9VheS78CAwEAAaOCAdQwggHQMB0GA1UdDgQWBBRbg92H3prHxuNLh331AaKxIwqBtDAf 35BgNVHSMEGDAWgBRtb7+pdT242EZDPbU1HZqewHyWvTAYBgNVHSABAf8EDjAMMAoGCCsGAQUF 36Bw4CMFAGA1UdHwRJMEcwRaBDoEGGP3JzeW5jOi8vY2EucmcubmV0L3Jwa2kvUkduZXQtT1Uv 37YlctX3FYVTl1TmhHUXoyMU5SMmFuc0I4bHIwLmNybDBkBggrBgEFBQcBAQRYMFYwVAYIKwYB 38BQUHMAKGSHJzeW5jOi8vcnBraS5yaXBlLm5ldC9yZXBvc2l0b3J5L0RFRkFVTFQvYlctX3FY 39VTl1TmhHUXoyMU5SMmFuc0I4bHIwLmNlcjAOBgNVHQ8BAf8EBAMCB4AwgYoGCCsGAQUFBwEL 40BH4wfDBLBggrBgEFBQcwC4Y/cnN5bmM6Ly9jYS5yZy5uZXQvcnBraS9SR25ldC1PVS9XNFBk 41aDk2YXg4YmpTNGQ5OVFHaXNTTUtnYlEucm9hMC0GCCsGAQUFBzANhiFodHRwczovL2NhLnJn 42Lm5ldC9ycmRwL25vdGlmeS54bWwwHwYIKwYBBQUHAQcBAf8EEDAOMAwEAgABMAYDBACTHC0w 43DQYJKoZIhvcNAQELBQADggEBAKhhoJ3XtHejvG6XkFaCTxJci10gOgNvvPFWqz+CfOX2LmB0 44N3QhYjLiAZbfYSOxNReyL4bWDK/tpZgVA2VHuS8GB8fI8+nauQUiP38orVXKAbcUUxo7UkEM 45HxQ5T61FtXrEZx8hgKTlsfof0G2Q+baSJzNV2MIUgHmSszL4Mx/fHUXv8b7l/5mZQbdv3cZ9 46SbODHD0iOVAzK3fmHeuA4roSOk4mBQDWNRY1Ok+xH/HMDQdoOVtbfy57TZI2W7O2uxfElKvx 47fBeEc9TOaWqDz0xvmJ6bdZnmWRuvqW1475mhxi0s/I4eE2ZdaCinvrgrglBp/jpZi1jitY14 48dx+A1PMxggGqMIIBpgIBA4AUW4Pdh96ax8bjS4d99QGisSMKgbQwCwYJYIZIAWUDBAIBoGsw 49GgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEYMBwGCSqGSIb3DQEJBTEPFw0xOTA4MjAwMDQ5 50MjlaMC8GCSqGSIb3DQEJBDEiBCCfuHnOmhF2iBF3JXMOnoZCJzmE+Tcf8b+zObvDUpUddzAN 51BgkqhkiG9w0BAQEFAASCAQBDlJIMKCqWsFV/tQj/XvpSJUxJybG+zwjrUKm4yTKv8QEGOzOD 52aIL6irSOhhXeax6Lw0P2J7x+L3jGW1we1qWslumEDTr9kTE+kN/6rZuptUhwdrXcu3p9G6gJ 53mAUQtzqe2jRN1T3eSBfz1CNU3C7+jSHXOc+4Tea5mKiVddsjotYHXX0PbSCS/ZZ1yzdeES0o 54KWhXhW9ogS0bwtXWVTrciSekaRpp2n/pqcVEDxWg/5NpPiDlPNrRL/9eTEHFp940RAUfhbBh 55pbC2J02N0KgxUJxIJnGnpZ7rXKpG4jMiTVry7XB9bnFxCvZGBdjQW1Hagrfpl2TiVxQFvJWl 56IzU1 57""" 58 59 def testDerCodec(self): 60 substrate = pem.readBase64fromText(self.roa_pem_text) 61 62 layers = { } 63 layers.update(rfc5652.cmsContentTypesMap) 64 65 getNextLayer = { 66 rfc5652.id_ct_contentInfo: lambda x: x['contentType'], 67 rfc5652.id_signedData: lambda x: x['encapContentInfo']['eContentType'], 68 rfc6482.id_ct_routeOriginAuthz: lambda x: None 69 } 70 71 getNextSubstrate = { 72 rfc5652.id_ct_contentInfo: lambda x: x['content'], 73 rfc5652.id_signedData: lambda x: x['encapContentInfo']['eContent'], 74 rfc6482.id_ct_routeOriginAuthz: lambda x: None 75 } 76 77 next_layer = rfc5652.id_ct_contentInfo 78 while next_layer: 79 asn1Object, rest = der_decode(substrate, asn1Spec=layers[next_layer]) 80 assert not rest 81 assert asn1Object.prettyPrint() 82 assert der_encode(asn1Object) == substrate 83 84 substrate = getNextSubstrate[next_layer](asn1Object) 85 next_layer = getNextLayer[next_layer](asn1Object) 86 87 assert asn1Object['version'] == 0 88 assert asn1Object['asID'] == 58363 89 90 def testOpenTypes(self): 91 substrate = pem.readBase64fromText(self.roa_pem_text) 92 asn1Object, rest = der_decode(substrate, 93 asn1Spec=rfc5652.ContentInfo(), 94 decodeOpenTypes=True) 95 assert not rest 96 assert asn1Object.prettyPrint() 97 assert der_encode(asn1Object) == substrate 98 99 oid = asn1Object['content']['encapContentInfo']['eContentType'] 100 substrate = asn1Object['content']['encapContentInfo']['eContent'] 101 assert oid in rfc5652.cmsContentTypesMap.keys() 102 asn1Object, rest = der_decode(substrate, 103 asn1Spec=rfc5652.cmsContentTypesMap[oid], 104 decodeOpenTypes=True) 105 assert not rest 106 assert asn1Object.prettyPrint() 107 assert der_encode(asn1Object) == substrate 108 109 assert asn1Object['version'] == 0 110 assert asn1Object['asID'] == 58363 111 112 113suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__]) 114 115if __name__ == '__main__': 116 import sys 117 118 result = unittest.TextTestRunner(verbosity=2).run(suite) 119 sys.exit(not result.wasSuccessful()) 120