Пример #1
0
    def testDerCodec(self):

        substrate = pem.readBase64fromText(self.pem_text_unordered)

        asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)

        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encoder.encode(asn1Object) == substrate

        contentType = asn1Object['contentType']
        substrate = asn1Object['content']

        contentInfoMap = {
            (1, 2, 840, 113549, 1, 7, 1): rfc2315.Data(),
            (1, 2, 840, 113549, 1, 7, 2): rfc2315.SignedData(),
            (1, 2, 840, 113549, 1, 7, 3): rfc2315.EnvelopedData(),
            (1, 2, 840, 113549, 1, 7, 4): rfc2315.SignedAndEnvelopedData(),
            (1, 2, 840, 113549, 1, 7, 5): rfc2315.DigestedData(),
            (1, 2, 840, 113549, 1, 7, 6): rfc2315.EncryptedData()
        }

        innerAsn1Object, rest = der_decoder.decode(
            substrate, asn1Spec=contentInfoMap[contentType]
        )

        asn1Object['content'] = der_encoder.encode(innerAsn1Object)

        substrate = pem.readBase64fromText(self.pem_text_reordered)

        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encoder.encode(asn1Object) == substrate
Пример #2
0
    def testDerCodec(self):

        substrate = pem.readBase64fromText(self.pem_text)

        asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)

        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encoder.encode(asn1Object) == substrate

        for extn in asn1Object['tbsCertificate']['extensions']:

            if extn['extnID'] == rfc3779.id_pe_ipAddrBlocks:
                s = extn['extnValue']
                addr_blocks, rest = der_decoder.decode(s, rfc3779.IPAddrBlocks())
                assert not rest
                assert addr_blocks.prettyPrint()
                assert der_encoder.encode(addr_blocks) == s

            if extn['extnID'] == rfc3779.id_pe_autonomousSysIds:
                s = extn['extnValue']
                as_ids, rest = der_decoder.decode(s, rfc3779.ASIdentifiers())
                assert not rest
                assert as_ids.prettyPrint()
                assert der_encoder.encode(as_ids) == s
Пример #3
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.kw_pad_alg_id_pem_text)
     asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc5649.id_aes256_wrap_pad
     assert der_encoder.encode(asn1Object) == substrate
Пример #4
0
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.pem_text)

        asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)

        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encoder.encode(asn1Object) == substrate
Пример #5
0
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.pss_sha512_pem_text)
        asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertTrue(rfc4055.id_RSASSA_PSS, asn1Object[0])
        self.assertEqual(substrate, der_encoder(asn1Object))
Пример #6
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.pss_sha512_pem_text)
     asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc4055.id_RSASSA_PSS
     assert der_encoder.encode(asn1Object) == substrate
     assert substrate == der_encoder.encode(asn1Object)
Пример #7
0
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.pem_text)

        asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)

        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encoder.encode(asn1Object) == substrate
Пример #8
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.rfc3211_ex1_pem_text)
     asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert der_encode(asn1Object) == substrate
     alg_oid = asn1Object['pwri']['keyDerivationAlgorithm']['algorithm']
     assert alg_oid == rfc8018.id_PBKDF2
Пример #9
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.kw_pad_alg_id_pem_text)
     asn1Object, rest = der_decoder.decode(substrate,
                                           asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc5649.id_aes256_wrap_pad
     assert der_encoder.encode(asn1Object) == substrate
Пример #10
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.aes_alg_id_pem_text)
     asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc3565.id_aes256_CBC
     assert asn1Object[1].isValue
     assert der_encoder.encode(asn1Object) == substrate
Пример #11
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.alg_id_3_pem_text)
     asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object['algorithm'] == rfc8419.id_sha512
     assert not asn1Object['parameters'].isValue
     assert der_encode(asn1Object) == substrate
Пример #12
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.key_agree_alg_id_pem_text)
     asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object['algorithm'] == rfc8418.dhSinglePass_stdDH_hkdf_sha384_scheme
     assert asn1Object['parameters'].isValue
     assert der_encoder.encode(asn1Object) == substrate
Пример #13
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.oaep_full_pem_text)
     asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc3560.id_RSAES_OAEP
     assert der_encoder.encode(asn1Object) == substrate
     assert substrate == der_encoder.encode(asn1Object)
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.pem_text)

        asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(substrate, der_encoder(asn1Object))
Пример #15
0
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.private_key_pem_text)
        asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec)
        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encode(asn1Object) == substrate

        assert asn1Object['parameters']['namedCurve'] == rfc5480.secp384r1
Пример #16
0
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.pem_text)
        asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(substrate, der_encoder(asn1Object))
        self.assertEqual(1, asn1Object['acinfo']['version'])

        found_ac_policy_qualifier1 = False
        found_ac_policy_qualifier2 = False
        for extn in asn1Object['acinfo']['extensions']:
            self.assertIn(extn['extnID'], rfc5280.certificateExtensionsMap)
            if extn['extnID'] == rfc4476.id_pe_acPolicies:
                ev, rest = der_decoder(
                    extn['extnValue'],
                    asn1Spec=rfc5280.certificateExtensionsMap[extn['extnID']])

                self.assertFalse(rest)
                self.assertTrue(ev.prettyPrint())
                self.assertEqual(extn['extnValue'], der_encoder(ev))

                oid = univ.ObjectIdentifier((
                    1,
                    3,
                    6,
                    1,
                    4,
                    1,
                    22112,
                    48,
                    10,
                ))
                self.assertEqual(oid, ev[0]['policyIdentifier'])

                for pq in ev[0]['policyQualifiers']:
                    self.assertIn(pq['policyQualifierId'],
                                  rfc5280.policyQualifierInfoMap)

                    pqv, rest = der_decoder(
                        pq['qualifier'],
                        asn1Spec=rfc5280.policyQualifierInfoMap[
                            pq['policyQualifierId']])

                    self.assertFalse(rest)
                    self.assertTrue(pqv.prettyPrint())
                    self.assertEqual(pq['qualifier'], der_encoder(pqv))

                    if pq['policyQualifierId'] == rfc4476.id_qt_acps:
                        self.assertIn('example.com', pqv)
                        found_ac_policy_qualifier1 = True

                    if pq['policyQualifierId'] == rfc4476.id_qt_acunotice:
                        self.assertIn(20, pqv[0]['noticeNumbers'])
                        found_ac_policy_qualifier2 = True

        assert found_ac_policy_qualifier1
        assert found_ac_policy_qualifier2
Пример #17
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.oaep_full_pem_text)
     asn1Object, rest = der_decoder.decode(substrate,
                                           asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc3560.id_RSAES_OAEP
     assert der_encoder.encode(asn1Object) == substrate
     assert substrate == der_encoder.encode(asn1Object)
Пример #18
0
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.private_key_pem_text)
        asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(substrate, der_encoder(asn1Object))
        self.assertEqual(rfc5480.secp384r1,
                         asn1Object['parameters']['namedCurve'])
Пример #19
0
    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

        hex1 = univ.OctetString(hexValue='00000001')
        assert asn1Object['keyInfo']['counter'] == hex1
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.alg_id_4_pem_text)
        asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(rfc8419.id_shake256, asn1Object['algorithm'])
        self.assertFalse(asn1Object['parameters'].isValue)
        self.assertEqual(substrate, der_encoder(asn1Object))
Пример #21
0
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.kw_pad_alg_id_pem_text)
        asn1Object, rest = der_decoder.decode(substrate,
                                              asn1Spec=self.asn1Spec)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(rfc5649.id_aes256_wrap_pad, asn1Object[0])
        self.assertEqual(substrate, der_encoder.encode(asn1Object))
Пример #22
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.no_pub_key_pem_text)
     asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object['privateKeyAlgorithm']['algorithm'] == rfc8410.id_Ed25519
     assert asn1Object['privateKey'].isValue
     assert asn1Object['privateKey'].prettyPrint()[0:10] == "0x0420d4ee"
     assert der_encoder.encode(asn1Object) == substrate
Пример #23
0
 def testOpenTypes(self):
     substrate = pem.readBase64fromText(self.oaep_default_pem_text)
     asn1Object, rest = der_decoder.decode(substrate,
                                           asn1Spec=self.asn1Spec,
                                           decodeOpenTypes=True)
     assert not rest
     assert asn1Object.prettyPrint()
     assert der_encoder.encode(asn1Object) == substrate
     assert not asn1Object['parameters'].hasValue()
 def testOpenTypes(self):
     substrate = pem.readBase64fromText(self.pss_default_pem_text)
     asn1Object, rest = der_decoder.decode(substrate,
                                           asn1Spec=self.asn1Spec,
                                           decodeOpenTypes=True)
     self.assertFalse(rest)
     self.assertTrue(asn1Object.prettyPrint())
     self.assertEqual(substrate, der_encoder.encode(asn1Object))
     self.assertFalse(asn1Object['parameters'].hasValue())
Пример #25
0
    def testOpenTypes(self):
        substrate = pem.readBase64fromText(self.message1_pem_text)
        asn1Object, rest = der_decode (substrate,
                                       asn1Spec=self.asn1Spec,
                                       decodeOpenTypes=True)
        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encode(asn1Object) == substrate

        assert asn1Object['contentType'] == rfc5652.id_signedData
        v3 = rfc5652.CMSVersion().subtype(value='v3')
        assert asn1Object['content']['version'] == v3

        for sa in asn1Object['content']['signerInfos'][0]['signedAttrs']:
            if sa['attrType'] == rfc7191.id_aa_KP_keyPkgIdAndReceiptReq:
                package_id_pem_text = "J7icVjsWIlGdF4cceb+siG3f+D0="
                package_id = pem.readBase64fromText(package_id_pem_text)
                assert sa['attrValues'][0]['pkgID'] == package_id
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.public_key_pem_text)
        asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec)
        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(substrate, der_encoder(asn1Object))

        self.assertEqual(asn1Object['algorithm']['algorithm'],
                         rfc8708.id_alg_hss_lms_hashsig)
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.oaep_sha256_pem_text)
        asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertTrue(rfc4055.id_RSAES_OAEP, asn1Object[0])
        self.assertEqual(substrate, der_encoder.encode(asn1Object))
        self.assertEqual(substrate, der_encoder.encode(asn1Object))
Пример #28
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.aes_alg_id_pem_text)
     asn1Object, rest = der_decoder.decode(substrate,
                                           asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc3565.id_aes256_CBC
     assert asn1Object[1].isValue
     assert der_encoder.encode(asn1Object) == substrate
Пример #29
0
    def testDerCodecDecodeOpenTypes(self):

        substrate = pem.readBase64fromText(self.pem_text_reordered)

        asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec, decodeOpenTypes=True)

        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encoder.encode(asn1Object) == substrate
Пример #30
0
    def testOpenTypes(self):
        substrate = pem.readBase64fromText(self.pem_text)
        asn1Object, rest = der_decoder(
            substrate, asn1Spec=self.asn1Spec, decodeOpenTypes=True)

        eci = asn1Object['content']['encryptedContentInfo']
        ai = eci['contentEncryptionAlgorithm']
        self.assertEqual(rfc2040.rc5_CBC, ai['algorithm'])
        self.assertEqual(16, ai['parameters']['rounds'])
Пример #31
0
 def testOpenTypes(self):
     substrate = pem.readBase64fromText(self.alg_id_5_pem_text)
     asn1Object, rest = der_decode(substrate,
         asn1Spec=self.asn1Spec,
         decodeOpenTypes=True)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object['algorithm'] == rfc8419.id_shake256_len
     assert asn1Object['parameters'] == 512
     assert der_encode(asn1Object) == substrate
    def testOpenTypes(self):
        substrate = pem.readBase64fromText(self.alg_id_5_pem_text)
        asn1Object, rest = der_decoder(
            substrate, asn1Spec=self.asn1Spec, decodeOpenTypes=True)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(rfc8419.id_shake256_len, asn1Object['algorithm'])
        self.assertEqual(512, asn1Object['parameters'])
        self.assertEqual(substrate, der_encoder(asn1Object))
    def testDerCodec(self):
        substrate = pem.readBase64fromText(self.pem_text)
        asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec)

        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(substrate, der_encoder(asn1Object))

        hex1 = univ.OctetString(hexValue='00000001')
        self.assertEqual(hex1, asn1Object['keyInfo']['counter'])
Пример #34
0
    def testOpenTypes(self):
        substrate = pem.readBase64fromText(self.cvrequest_pem_text)
        asn1Object, rest = der_decoder(
            substrate, asn1Spec=self.asn1Spec, decodeOpenTypes=True)
        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(substrate, der_encoder(asn1Object))

        wantback = asn1Object['content']['query']['wantBack']
        self.assertIn(rfc5276.id_swb_ers_all, wantback)
Пример #35
0
    def testOpenTypes(self):
        substrate = pem.readBase64fromText(self.pem_text)
        asn1Object, rest = der_decoder(substrate,
                                       asn1Spec=self.asn1Spec,
                                       decodeOpenTypes=True)
        self.assertFalse(rest)
        self.assertTrue(asn1Object.prettyPrint())
        self.assertEqual(substrate, der_encoder(asn1Object))

        self.assertIn(b'come here', asn1Object['content']['content'])
Пример #36
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.key_agree_alg_id_pem_text)
     asn1Object, rest = der_decoder.decode(substrate,
                                           asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[
         'algorithm'] == rfc8418.dhSinglePass_stdDH_hkdf_sha384_scheme
     assert asn1Object['parameters'].isValue
     assert der_encoder.encode(asn1Object) == substrate
Пример #37
0
    def testDerCodecDecodeOpenTypes(self):

        substrate = pem.readBase64fromText(self.pem_text_reordered)
        asn1Object, rest = der_decoder.decode(substrate,
                                              asn1Spec=self.asn1Spec,
                                              decodeOpenTypes=True)

        assert not rest
        assert asn1Object.prettyPrint()
        assert der_encoder.encode(asn1Object,
                                  omitEmptyOptionals=False) == substrate
Пример #38
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.alg_id_pem_text)
     asn1Object, rest = der_decoder.decode(substrate, asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc8103.id_alg_AEADChaCha20Poly1305
     param, rest = der_decoder.decode(asn1Object[1], rfc8103.AEADChaCha20Poly1305Nonce())
     assert not rest
     assert param.prettyPrint()
     assert param == rfc8103.AEADChaCha20Poly1305Nonce(value='\xca\xfe\xba\xbe\xfa\xce\xdb\xad\xde\xca\xf8\x88')
     assert der_encoder.encode(asn1Object) == substrate
Пример #39
0
 def testOpenTypes(self):
     substrate = pem.readBase64fromText(self.digicert_ec_cert_pem_text)
     asn1Object, rest = der_decode(substrate,
         asn1Spec=self.asn1Spec, decodeOpenTypes=True)
     assert not rest
     assert asn1Object.prettyPrint()
     assert der_encode(asn1Object) == substrate
 
     spki_alg = asn1Object['tbsCertificate']['subjectPublicKeyInfo']['algorithm']
     assert spki_alg['algorithm'] == rfc5480.id_ecPublicKey
     assert spki_alg['parameters']['namedCurve'] == rfc5480.secp384r1
Пример #40
0
 def testDerCodec(self):
     substrate = pem.readBase64fromText(self.no_pub_key_pem_text)
     asn1Object, rest = der_decoder.decode(substrate,
                                           asn1Spec=self.asn1Spec)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object['privateKeyAlgorithm'][
         'algorithm'] == rfc8410.id_Ed25519
     assert asn1Object['privateKey'].isValue
     assert asn1Object['privateKey'].prettyPrint()[0:10] == "0x0420d4ee"
     assert der_encoder.encode(asn1Object) == substrate
Пример #41
0
 def testOpenTypes(self):
     substrate = pem.readBase64fromText(self.aes_alg_id_pem_text)
     asn1Object, rest = der_decoder.decode(substrate,
                                           asn1Spec=self.asn1Spec,
                                           decodeOpenTypes=True)
     assert not rest
     assert asn1Object.prettyPrint()
     assert asn1Object[0] == rfc3565.id_aes256_CBC
     aes_iv = univ.OctetString(hexValue='108996ba850e3f0339993bb5878a0e37')
     assert asn1Object[1] == aes_iv
     assert der_encoder.encode(asn1Object) == substrate
Пример #42
0
    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

        assert asn1Object['attrType'] == rfc6019.id_aa_binarySigningTime
        bintime, rest = der_decode(asn1Object['attrValues'][0], asn1Spec=rfc6019.BinaryTime())
        assert bintime == 0x5cbf8654
Пример #43
0
    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

        assert asn1Object['contentType'] == rfc5652.id_signedData
        inner, rest = der_decode(asn1Object['content'], asn1Spec=rfc5652.SignedData())

        assert inner['encapContentInfo']['eContentType'] == rfc4108.id_ct_firmwarePackage
        assert inner['encapContentInfo']['eContent']

        found_target_hardware_identifier_attribute = False
        for attr in inner['signerInfos'][0]['signedAttrs']:
            if attr['attrType'] == rfc4108.id_aa_targetHardwareIDs:
                found_target_hardware_identifier_attribute = True
        assert found_target_hardware_identifier_attribute
Пример #44
0
    def testDerCodec(self):

        substrate = pem.readBase64fromText(self.pem_text)

        layers = {
            rfc5652.id_ct_contentInfo: rfc5652.ContentInfo(),
            rfc5652.id_signedData: rfc5652.SignedData(),
            rfc6402.id_cct_PKIData: rfc6402.PKIData()
        }

        getNextLayer = {
            rfc5652.id_ct_contentInfo: lambda x: x['contentType'],
            rfc5652.id_signedData: lambda x: x['encapContentInfo']['eContentType'],
            rfc6402.id_cct_PKIData: lambda x: None
        }

        getNextSubstrate = {
            rfc5652.id_ct_contentInfo: lambda x: x['content'],
            rfc5652.id_signedData: lambda x: x['encapContentInfo']['eContent'],
            rfc6402.id_cct_PKIData: lambda x: None
        }


        next_layer = rfc5652.id_ct_contentInfo

        while next_layer:

            asn1Object, rest = der_decoder.decode(
                substrate, asn1Spec=layers[next_layer]
            )

            assert not rest
            assert asn1Object.prettyPrint()
            assert der_encoder.encode(asn1Object) == substrate

            substrate = getNextSubstrate[next_layer](asn1Object)
            next_layer = getNextLayer[next_layer](asn1Object)