123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- #
- # 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 = """\
- MIIFjAYJKoZIhvcNAQcDoIIFfTCCBXkCAQIxZqJkAgEEMCMEEH744tkBAA6gplAQ
- nKYxCF8YDzIwMTkwOTEyMTIwMDAwWjAQBgsqhkiG9w0BCRADBwIBOgQocOaZ+1cB
- 94MzMPtx6HyFpCC9yZrwXSKvWg5I018xOJhsuq+0so1PNTCCBQoGCSqGSIb3DQEH
- ATAZBggqhkiG9w0DAjANAgE6BAhCT0dVU19JVoCCBOBzx7F6GMkP+C0Q4iuDq0rk
- SZprg8nuXx/4S3IMP999BrJdUAbPYxdQhAwTOZIuueyv00TJe/Eam9yyLuZXy0PF
- lTRi7KED8L8cyHsRoEobWGMLvE3D4hEhTGttElqQxBvMxZZgm6kLnNG7j8Z72L4l
- U4aARLYTQvktlJnnfCaccDSiWzU8eXcXdnZAzcKR7CoDc0/XBpdDRddvQ7KXoarX
- YHuSybt649YDcpy0SN9gEPqcFPrBB3nusAx4VOTlpx5Z3ZJv/TEymN8KDobNfykB
- ZURTwupO9WaVJZ3Hd/d8C1SCJn6DHuM1jwDp26WfzO8xCfea08MJrnQbNKsDHwmt
- 4dFZIOvcOnwR8nNSB/Lt1aUj3GzluHVMyQQyT4AdZDmwFdNmQOBUBLmbWYhtd7t3
- O7Eqx8bGNa7V7LL0nvua04aj1oA6ph/G/8jxhByBYdN5Bwg7f1Ga3ZCwju2tFoQn
- WOCPYTVOjmBEJshBbNC7KhLpp9+C7/13A9cIC3T7Reuc7m+Fopf9Fabu97yFiyJP
- S8jSF0EnesNGR1L1Uvo2Wdc66iECoSrxvezaSgGKB2uLTnaFx4ASVMcP7gDipEOI
- wuUUuVCqgmWkHAK0Q9mwhBLLrYrsn9OjDHFpvkWgWNRMLl/v3E9A+grFh2BQHkB4
- C7keB1ZOfj1SqDi/+ylM9I1FOYMxVXJn2qHMl+QOkfdMoIATm3n3DiBI97/uX4x5
- KaX074v0dN31WeDcsFsh2ze5Dhx8vLJCaXLzWqkmNHX5G/CjjqE6bSR/awgWLRZQ
- uY/9fMvDpvVJuId/+OoWDtMVPIsyQ8w8yZzv+SkuZhsrJMHiKd5qxNQv5sOvC765
- LMUCNNwj7WzPhajintFXLAEMpIjk5xt3eIy3hdYla3PQoFfqcHOVX4EFMLBoYwBT
- gik8Fg669yXtMlbH84MGNs7jObhP/rrDkgbe0qmxUyzgm2uHya1VcItMGYoPPKMF
- U3ZfwAsZdqsi1GAtruTzSUmOpMfAoKOIAyZP96HrsrPCaoGrn7ysm5eRrHQ2hdwO
- 7rGQIw0dRAFh2eyRomoLam7yEiw9M6uHuJ5hIS5yEW+7uUjQT6nvKlbrkIyLL5j9
- Gbk5Z4fOMqRTkBs+3H8x7a+lBEKBo/ByJm6fHYi+LX5ZhQFTWkY0M7tfPtrxQdsN
- RGSHtv7jS7PZ3thCMqCtkG/pjAsCbDUtMThtP08z2fstE6dfy7qSx6LzKLDyBl5W
- 76mVYdsX7Q72yIoCDFmUGdrRcWA+l3OMwNNL+x9MhhdaUWPtxqaGyZMNGOjkbYHb
- XZ69oqYqCHkAstIVKTzpk3kq9C9x+ynzWO8kIGYNK2uxSBIzPLQ6Daq4c53rWFFN
- WVjPC8m98zMcYp0hbBhRsdk4qj8osSTcTfpT0+Q+hkYQvZl4IfgX1aHeaCDSScF8
- SaU+cZ7GYFvLo1cYrtVbeXrFwmWl0xpco1Ux+XZgryT/fgfJ+3ToppgsQmzECqTW
- mYsSYaF1kLU4Cqi9UH/VqBLOkwxoH05Zao2xOMNzu2QO3wFnvY2wBsIj1eaxfzVb
- 42o9vom7V20jT1ufXXctf9ls5J1WJxBxdKmXQWdNloeAcl1AtxTbw7vIUU5uWqu9
- wwqly11MDVPAb0tcQW20auWmCNkXd52jQJ7PXR6kr5I=
- """
- 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())
|