| # |
| # 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 |
| import unittest |
| |
| from pyasn1.codec.der.decoder import decode as der_decoder |
| from pyasn1.codec.der.encoder import encode as der_encoder |
| |
| from pyasn1.type import univ |
| |
| from pyasn1_modules import pem |
| from pyasn1_modules import rfc3370 |
| from pyasn1_modules import rfc5280 |
| from pyasn1_modules import rfc5652 |
| from pyasn1_modules import rfc5751 |
| |
| |
| class EnvelopedDataTestCase(unittest.TestCase): |
| env_data_pem_text = """\ |
| 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 |
| """ |
| |
| def setUp(self): |
| self.asn1Spec = rfc5652.ContentInfo() |
| |
| def testDerCodec(self): |
| substrate = pem.readBase64fromText(self.env_data_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(rfc5652.id_envelopedData, asn1Object['contentType']) |
| |
| ed, rest = der_decoder( |
| asn1Object['content'], asn1Spec=rfc5652.EnvelopedData()) |
| self.assertFalse(rest) |
| self.assertTrue(ed.prettyPrint()) |
| self.assertEqual(asn1Object['content'], der_encoder(ed)) |
| |
| kwa = ed['recipientInfos'][0]['kekri']['keyEncryptionAlgorithm'] |
| self.assertEqual(rfc3370.id_alg_CMSRC2wrap, kwa['algorithm']) |
| kwa_param, rest = der_decoder( |
| kwa['parameters'], rfc3370.RC2wrapParameter()) |
| self.assertFalse(rest) |
| self.assertTrue(kwa_param.prettyPrint()) |
| self.assertEqual(kwa['parameters'], der_encoder(kwa_param)) |
| self.assertEqual(58, kwa_param) |
| |
| cea = ed['encryptedContentInfo']['contentEncryptionAlgorithm'] |
| self.assertEqual(rfc3370.rc2CBC, cea['algorithm']) |
| param, rest = der_decoder( |
| cea['parameters'], rfc3370.RC2CBCParameter()) |
| self.assertFalse(rest) |
| self.assertTrue(param.prettyPrint()) |
| self.assertEqual(cea['parameters'], der_encoder(param)) |
| |
| iv = univ.OctetString(hexValue='424f4755535f4956') |
| self.assertEqual(iv, param['iv']) |
| self.assertEqual(58, param['rc2ParameterVersion']) |
| |
| def testOpenTypes(self): |
| substrate = pem.readBase64fromText(self.env_data_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.assertTrue(asn1Object['contentType'] in rfc5652.cmsContentTypesMap.keys()) |
| |
| ri0 = asn1Object['content']['recipientInfos'][0] |
| kwa = ri0['kekri']['keyEncryptionAlgorithm'] |
| self.assertEqual(rfc3370.id_alg_CMSRC2wrap, kwa['algorithm']) |
| self.assertEqual(58, kwa['parameters']) |
| |
| eci = asn1Object['content']['encryptedContentInfo'] |
| cea = eci['contentEncryptionAlgorithm'] |
| self.assertEqual(rfc3370.rc2CBC, cea['algorithm']) |
| |
| iv = univ.OctetString(hexValue='424f4755535f4956') |
| self.assertEqual(iv, cea['parameters']['iv']) |
| self.assertEqual(58, cea['parameters']['rc2ParameterVersion']) |
| |
| class DSAPublicKeyTestCase(unittest.TestCase): |
| dsa_cert_pem_text = """\ |
| MIIDpjCCA0ygAwIBAgIUY8xt3l0B9nIPWSpjs0hDJUJZmCkwCwYJYIZIAWUDBAMC |
| MD8xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJWQTEQMA4GA1UEBxMHSGVybmRvbjER |
| MA8GA1UEChMIQm9ndXMgQ0EwHhcNMTkxMDIwMjAxMjMwWhcNMjAxMDE5MjAxMjMw |
| WjBwMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVkExEDAOBgNVBAcTB0hlcm5kb24x |
| EDAOBgNVBAoTB0V4YW1wbGUxDjAMBgNVBAsTBUFsaWNlMSAwHgYJKoZIhvcNAQkB |
| FhFhbGljZUBleGFtcGxlLmNvbTCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCLpR53 |
| xHfe+SiknAK/L9lm/ZO1109c9iYkriPIW/5MMlM+qc/tdRkKpG6ELIpfXTPtKCJm |
| zqqVIyTmAJryyE8Xw0Ie2mzYPU5ULvKmllQkjTsWgPGgQBkciZ0AW9ggD9VwZilg |
| 4qh3iSO7T97hVQFnpCh6vm8pOH6UP/5kpr9ZJQIVANzdbztBJlJfqCB1t4h/NvSu |
| wCFvAoGAITP+jhYk9Rngd98l+5ccgauQ+cLEUBgNG2Wq56zBXQbLou6eKkQi7ecL |
| NiRmExq3IU3LOj426wSxL72Kw6FPyOEv3edIFkJJEHL4Z+ZJeVe//dzya0ddOJ7k |
| k6qNF2ic+viD/5Vm8yRyKiig2uHH/MgIesLdZnvbzvX+f/P0z50DgYQAAoGALAUl |
| jkOi1PxjjFVvhGfK95yIsrfbfcIEKUBaTs9NR2rbGWUeP+93paoXwP39X9wrJx2M |
| SWeHWhWKszNgoiyqYT0k4R9mem3WClotxOvB5fHfwIp2kQYvE7H0/TPdGhfUpHQG |
| YpyLQgT6L80meSKMFnu4VXGzOANhWDxu3JxiADCjgZQwgZEwCwYDVR0PBAQDAgeA |
| MEIGCWCGSAGG+EIBDQQ1FjNUaGlzIGNlcnRpZmljYXRlIGNhbm5vdCBiZSB0cnVz |
| dGVkIGZvciBhbnkgcHVycG9zZS4wHQYDVR0OBBYEFO37wHcauyc03rDc6cDRRsHz |
| gcK+MB8GA1UdIwQYMBaAFM1IZQGDsqYHWwb+I4EMxHPk0bU4MAsGCWCGSAFlAwQD |
| AgNHADBEAiBBRbfMzLi7+SVyO8SM3xxwUsMf/k1B+Nkvf1kBTfCfGwIgSAx/6mI+ |
| pNqdXqZZGESXy1MT1aBc4ynPGLFUr2r7cPY= |
| """ |
| def setUp(self): |
| self.asn1Spec = rfc5280.Certificate() |
| |
| def testDerCodec(self): |
| substrate = pem.readBase64fromText(self.dsa_cert_pem_text) |
| asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec) |
| self.assertFalse(rest) |
| self.assertTrue(asn1Object.prettyPrint()) |
| self.assertEqual(substrate, der_encoder(asn1Object)) |
| |
| spki = asn1Object['tbsCertificate']['subjectPublicKeyInfo'] |
| self.assertEqual(rfc3370.id_dsa, spki['algorithm']['algorithm']) |
| pk_substrate = spki['subjectPublicKey'].asOctets() |
| |
| pk, rest = der_decoder(pk_substrate, asn1Spec=rfc3370.Dss_Pub_Key()) |
| self.assertFalse(rest) |
| self.assertTrue(pk.prettyPrint()) |
| self.assertEqual(pk_substrate, der_encoder(pk)) |
| |
| self.assertEqual(48, pk % 1024) |
| |
| class SMIMECapabilitiesTestCase(unittest.TestCase): |
| smime_capabilities_pem_text = """\ |
| MGIwDAYIKwYBBQUIAQIFADAfBgsqhkiG9w0BCRADBTAQBgsqhkiG9w0BCRADBwIB |
| OjAfBgsqhkiG9w0BCRADCjAQBgsqhkiG9w0BCRADBwIBOjAQBgsqhkiG9w0BCRAD |
| BwIBOg== |
| """ |
| |
| def setUp(self): |
| self.asn1Spec = rfc5751.SMIMECapabilities() |
| |
| def testDerCodec(self): |
| substrate = pem.readBase64fromText(self.smime_capabilities_pem_text) |
| asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec) |
| self.assertFalse(rest) |
| self.assertTrue(asn1Object.prettyPrint()) |
| self.assertEqual(substrate, der_encoder(asn1Object)) |
| |
| found_wrap_alg_param = False |
| for cap in asn1Object: |
| if cap['capabilityID'] in rfc5751.smimeCapabilityMap.keys(): |
| if cap['parameters'].hasValue(): |
| param, rest = der_decoder( |
| cap['parameters'], |
| asn1Spec=rfc5751.smimeCapabilityMap[cap['capabilityID']]) |
| self.assertFalse(rest) |
| self.assertTrue(param.prettyPrint()) |
| self.assertEqual(cap['parameters'], der_encoder(param)) |
| |
| if cap['capabilityID'] == rfc3370.id_alg_ESDH: |
| kwa, rest = der_decoder( |
| cap['parameters'], |
| asn1Spec=rfc5751.smimeCapabilityMap[cap['capabilityID']]) |
| self.assertFalse(rest) |
| self.assertTrue(kwa.prettyPrint()) |
| self.assertEqual(cap['parameters'], der_encoder(kwa)) |
| |
| self.assertTrue(kwa['algorithm'] in rfc5280.algorithmIdentifierMap.keys()) |
| self.assertEqual(rfc3370.id_alg_CMSRC2wrap, kwa['algorithm']) |
| kwa_p, rest = der_decoder( |
| kwa['parameters'], |
| asn1Spec=rfc5280.algorithmIdentifierMap[kwa['algorithm']]) |
| self.assertFalse(rest) |
| self.assertTrue(kwa_p.prettyPrint()) |
| self.assertEqual(kwa['parameters'], der_encoder(kwa_p)) |
| self.assertEqual(58, kwa_p) |
| found_wrap_alg_param = True |
| |
| self.assertTrue(found_wrap_alg_param) |
| |
| def testOpenTypes(self): |
| substrate = pem.readBase64fromText(self.smime_capabilities_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)) |
| |
| found_wrap_alg_param = False |
| for cap in asn1Object: |
| if cap['capabilityID'] == rfc3370.id_alg_ESDH: |
| self.assertEqual(rfc3370.id_alg_CMSRC2wrap, cap['parameters']['algorithm']) |
| self.assertEqual(58, cap['parameters']['parameters']) |
| found_wrap_alg_param = True |
| |
| self.assertTrue(found_wrap_alg_param) |
| |
| |
| suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__]) |
| |
| if __name__ == '__main__': |
| result = unittest.TextTestRunner(verbosity=2).run(suite) |
| sys.exit(not result.wasSuccessful()) |
| |