# # This file is part of pyasn1-modules software. # # Created by Russ Housley # Copyright (c) 2019, Vigil Security, LLC # 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 rfc3852 from pyasn1_modules import rfc6402 try: import unittest2 as unittest except ImportError: import unittest class ContentInfoTestCase(unittest.TestCase): pem_text = """\ MIIEJQYJKoZIhvcNAQcCoIIEFjCCBBICAQMxCzAJBgUrDgMCGgUAMIIDAgYIKwYBBQUHDAKgggL0 BIIC8DCCAuwweDB2AgECBgorBgEEAYI3CgoBMWUwYwIBADADAgEBMVkwVwYJKwYBBAGCNxUUMUow SAIBBQwZcGl0dWNoYTEuZW1lYS5ocHFjb3JwLm5ldAwMRU1FQVxwaXR1Y2hhDBpDTUNSZXFHZW5l cmF0b3IudnNob3N0LmV4ZTCCAmqgggJmAgEBMIICXzCCAcgCAQAwADCBnzANBgkqhkiG9w0BAQEF AAOBjQAwgYkCgYEA0jm7SSSm2wyEAzuNKtFZFJKo91SrJq9wQwEhEKHDavZwMQOm1rZ2PF8NWCEb PqrhToQ7rtiGLSZa4dF4bzgmBqQ9aoSfEX4jISt31Vy+skHidXjHHpbsjT24NPhrZgANivL7CxD6 Ft+s7qS1gL4HRm2twQkqSwOLrE/q2QeXl2UCAwEAAaCCAR0wGgYKKwYBBAGCNw0CAzEMFgo2LjIu OTIwMC4yMD4GCSqGSIb3DQEJDjExMC8wHQYDVR0OBBYEFMW2skn88gxhONWZQA4sWGBDb68yMA4G A1UdDwEB/wQEAwIHgDBXBgkrBgEEAYI3FRQxSjBIAgEFDBlwaXR1Y2hhMS5lbWVhLmhwcWNvcnAu bmV0DAxFTUVBXHBpdHVjaGEMGkNNQ1JlcUdlbmVyYXRvci52c2hvc3QuZXhlMGYGCisGAQQBgjcN AgIxWDBWAgECHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAHQAcgBvAG4AZwAgAEMAcgB5AHAAdABv AGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIDAQAwDQYJKoZIhvcNAQEFBQADgYEAJZlu mxjtCxSOQi27jsVdd3y8NSIlzNv0b3LqmzvAly6L+CstXcnuG2MPQqPH9R7tbJonGUniBQO9sQ7C KhYWj2gfhiEkSID82lV5chINVUFKoUlSiEhWr0tPGgvOaqdsKQcrHfzrsBbFkhDqrFSVy7Yivbnh qYszKrOjJKiiCPMwADAAMYH5MIH2AgEDgBTFtrJJ/PIMYTjVmUAOLFhgQ2+vMjAJBgUrDgMCGgUA oD4wFwYJKoZIhvcNAQkDMQoGCCsGAQUFBwwCMCMGCSqGSIb3DQEJBDEWBBTFTkK/OifaFjwqHiJu xM7qXcg/VzANBgkqhkiG9w0BAQEFAASBgKfC6jOi1Wgy4xxDCQVK9+e5tktL8wE/j2cb9JSqq+aU 5UxEgXEw7q7BoYZCAzcxMRriGzakXr8aXHcgkRJ7XcFvLPUjpmGg9SOZ2sGW4zQdWAwImN/i8loc xicQmJP+VoMHo/ZpjFY9fYCjNZUArgKsEwK/s+p9yrVVeB1Nf8Mn """ def setUp(self): self.asn1Spec = rfc3852.ContentInfo() def testDerCodec(self): substrate = pem.readBase64fromText(self.pem_text) layers = { rfc3852.id_ct_contentInfo: rfc3852.ContentInfo(), rfc3852.id_signedData: rfc3852.SignedData(), rfc6402.id_cct_PKIData: rfc6402.PKIData() } getNextLayer = { rfc3852.id_ct_contentInfo: lambda x: x['contentType'], rfc3852.id_signedData: lambda x: x['encapContentInfo']['eContentType'], rfc6402.id_cct_PKIData: lambda x: None } getNextSubstrate = { rfc3852.id_ct_contentInfo: lambda x: x['content'], rfc3852.id_signedData: lambda x: x['encapContentInfo']['eContent'], rfc6402.id_cct_PKIData: lambda x: None } alg_oids = ( univ.ObjectIdentifier('1.3.14.3.2.26'), univ.ObjectIdentifier('1.2.840.113549.1.1.1'), univ.ObjectIdentifier('1.2.840.113549.1.1.5'), univ.ObjectIdentifier('1.2.840.113549.1.1.11'), ) encoded_null = der_encode(univ.Null("")) next_layer = rfc3852.id_ct_contentInfo count = 0 while next_layer: asn1Object, rest = der_decode(substrate, asn1Spec=layers[next_layer]) assert not rest assert asn1Object.prettyPrint() assert der_encode(asn1Object) == substrate if next_layer == rfc3852.id_signedData: for d in asn1Object['digestAlgorithms']: assert d['algorithm'] in alg_oids assert d['parameters'] == encoded_null count += 1 for si in asn1Object['signerInfos']: assert si['digestAlgorithm']['algorithm'] in alg_oids assert si['digestAlgorithm']['parameters'] == encoded_null count += 1 assert si['signatureAlgorithm']['algorithm'] in alg_oids assert si['signatureAlgorithm']['parameters'] == encoded_null count += 1 if next_layer == rfc6402.id_cct_PKIData: for req in asn1Object['reqSequence']: cr = req['tcr']['certificationRequest'] assert cr['signatureAlgorithm']['algorithm'] in alg_oids assert cr['signatureAlgorithm']['parameters'] == encoded_null count += 1 cri_spki = cr['certificationRequestInfo']['subjectPublicKeyInfo'] assert cri_spki['algorithm']['algorithm'] in alg_oids assert cri_spki['algorithm']['parameters'] == encoded_null count += 1 substrate = getNextSubstrate[next_layer](asn1Object) next_layer = getNextLayer[next_layer](asn1Object) assert count == 5 suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__]) if __name__ == '__main__': import sys result = unittest.TextTestRunner(verbosity=2).run(suite) sys.exit(not result.wasSuccessful())