| # |
| # 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()) |