1#
2# This file is part of pyasn1-modules software.
3#
4# Created by Russ Housley
5# Copyright (c) 2019, Vigil Security, LLC
6# License: http://snmplabs.com/pyasn1/license.html
7#
8
9import sys
10
11from pyasn1.codec.der.decoder import decode as der_decode
12from pyasn1.codec.der.encoder import encode as der_encode
13
14from pyasn1.type import univ
15
16from pyasn1_modules import pem
17from pyasn1_modules import rfc5280
18from pyasn1_modules import rfc8017
19from pyasn1_modules import rfc2985
20
21try:
22    import unittest2 as unittest
23
24except ImportError:
25    import unittest
26
27class SMIMECapabilitiesTestCase(unittest.TestCase):
28    smime_capabilities_pem_text = """\
29MIIBAzA8BgkqhkiG9w0BAQcwL6APMA0GCWCGSAFlAwQCAgUAoRwwGgYJKoZIhvcN
30AQEIMA0GCWCGSAFlAwQCAgUAMDwGCSqGSIb3DQEBCjAvoA8wDQYJYIZIAWUDBAIC
31BQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAICBQAwDQYJKoZIhvcNAQECBQAw
32DQYJKoZIhvcNAQEEBQAwDQYJKoZIhvcNAQEFBQAwDQYJKoZIhvcNAQEOBQAwDQYJ
33KoZIhvcNAQELBQAwDQYJKoZIhvcNAQEMBQAwDQYJKoZIhvcNAQENBQAwDQYJKoZI
34hvcNAQEPBQAwDQYJKoZIhvcNAQEQBQA=
35"""
36
37    def setUp(self):
38        self.asn1Spec = rfc2985.SMIMECapabilities()
39
40    def testDerCodec(self):
41        substrate = pem.readBase64fromText(self.smime_capabilities_pem_text)
42        asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec)
43        assert not rest
44        assert asn1Object.prettyPrint()
45        assert der_encode(asn1Object) == substrate
46
47        for cap in asn1Object:
48            assert cap['algorithm'] in rfc5280.algorithmIdentifierMap.keys()
49            if cap['parameters'].hasValue():
50                p, rest = der_decode(cap['parameters'],
51                    asn1Spec=rfc5280.algorithmIdentifierMap[cap['algorithm']])
52                assert not rest
53                if not p == univ.Null(""):
54                    assert p.prettyPrint()
55                assert der_encode(p) == cap['parameters']
56
57                if cap['algorithm'] == rfc8017.id_RSAES_OAEP:
58                    assert p['hashFunc']['algorithm'] == rfc8017.id_sha384
59                    assert p['maskGenFunc']['algorithm'] == rfc8017.id_mgf1
60
61    def OpenTypesCodec(self):
62        substrate = pem.readBase64fromText(self.smime_capabilities_pem_text)
63        asn1Object, rest = der_decode(substrate,
64            asn1Spec=self.asn1Spec,
65            decodeOpenTypes=True)
66        assert not rest
67        assert asn1Object.prettyPrint()
68        assert der_encode(asn1Object) == substrate
69
70        for cap in asn1Object:
71            if cap['algorithm'] == rfc8017.id_RSAES_OAEP:
72                p = cap['parameters']
73                assert p['hashFunc']['algorithm'] == rfc8017.id_sha384
74                assert p['maskGenFunc']['algorithm'] == rfc8017.id_mgf1
75
76
77class MultiprimeRSAPrivateKeyTestCase(unittest.TestCase):
78    pem_text = """\
79MIIE2QIBAQKCAQEAn82EqwXasE2TFNSmZucB8LNza2mOWLHF3nxpxKXalPMDvezc
805Dq7Ytcv/k9jJL4j4jYfvR4yyZdU9iHLaD6hOINZ8E6hVpx/4c96ZUSOLzD2g+u+
81jIuoNfG+zygSBGYCS6BLCAIsZ+2wUyxYpLJknHJld9/jy+aLmmyrilhH9dH5AUiV
823NeWht/68++dMXf4ZI/gV4bMSlWhggxkz2WJJpiQdCdJatGkwNDkHmLA9X0tC6OH
83SPE7qYdxG38cYS5F445SgnhDpiK7BodSqYLwgehaDjoOYdEgHVnOcpBCDI5zCJSL
84b1c/z8uhrB1xxlECR44wCLcKsIIYQxaEErRJ/wIDAQABAoIBAD+Ra5L0szeqxDVn
85GgKZJkZvvBwgU0WpAgMtDo3xQ/A4c2ab0IrhaiU5YJgTUGcPVArqaNm8J4vVrTBz
865QxEzbFDXwWe4cMoYh6bgB7ElKLlIUr8/kGZUfgc7kI29luEjcAIEAC2/RQHesVn
87DHkL5OzqZL+4fIwckAMh0tXdflsPgZ/jgIaKca4OqKu4KGnczm3UvqtlvwisAjkx
88zMyfZXOLn0vEwP2bfbhQrCVrP7n6a+CV+Kqm8NBWnbiS6x2rWemVVssNTbfXQztq
89wC6ZJZCLK7plciDBWvHcS6vxdcsS9DUxuqSV6o/stCGTl1D+9tDx8Od0Eunna2B2
90wAoRHZECVgbNO1bqwfYpp5aFuySWoP+KZz8f/5ZkHjLwiNGpQcqVd4+7Ql2R4qgF
91NgSoQQOZFhKtiOeLVU0HYfp6doI4waSINZdF/fJDHD6fY3AMOc/IIMDHHIzbAlYG
92vKOocLXWj/2+gcyQ1XoAmrE70aIFUBLSvd7RCi8GI74zYWp5lCSvO850Z4GsWSZT
9341iF13sTDDJPm3+BbzMvEu2GuACi/8/IpbUr24/FP9Cp1Rf7kwJWAgMxfoshbrNu
94ebQB5laHNnT+DYhrOFVRNiNDaD2bUNSetrFidosWtD4ueHxMGENwa4BbFJ9+UrdP
95fyxC6k7exM7khGjaNZczwTep1VpYtKjzP/bp9KcCVgYoj9s9HZ1FCAsNEPodjGfd
96AcPTQS9mIa7wzy19B7uvFQJXPURi/p4KKBMVQ99Pp8/r9lJzxxiEf8FyPr8N7lZM
97EUKkFkDrZQDhKpsrHWSNj6yRFlltAlYC7dYR8KLEWoOUATLosxQhwgypv+23r+d4
98ZdPOdDv9n8Kmj+NFy/oISFfdXzlOU4RWQtMx3hEwAabwct7vjiJEej/kmiTqco02
9917tt13VvvQ5ZXF73dDCCAQwwggEIAlYDfMpM1WNfxcLLOgkRZ+0S9OvIrEOi0ALV
100SquTdi/thhCuCsK3lMD4miN9te8j16YtqEFVWXC3a6DWwIJ6m/xZ50bBwPqM8RsI
1016FWhZw4Dr5VqjYXUvwJWAvapRk9SydDYri/cAtGIkUJVlspkE1emALAaSw30vmfd
102hrgYLT6YGOmK3UmcNJ4NVeET275MXWF1ZOhkOGKTN6aj5wPhJaHBMnmUQrq7GwC6
103/LfUkSsCVgMCDTV9gbFW8u6TcTVW85dBIeUGxZh1T2pbU3dkGO3IOxOhzJUplH4/
104EeEs9dusHakg1ERXAg4Vo1YowPW8kuVbZ9faxeVrmuER5NcCuZzS5X/obGUw
105"""
106
107    def setUp(self):
108        self.asn1Spec = rfc8017.RSAPrivateKey()
109
110    def testDerCodec(self):
111        substrate = pem.readBase64fromText(self.pem_text)
112        asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec)
113        assert not rest
114        assert asn1Object.prettyPrint()
115        assert der_encode(asn1Object) == substrate
116
117
118suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
119
120if __name__ == '__main__':
121    import sys
122
123    result = unittest.TextTestRunner(verbosity=2).run(suite)
124    sys.exit(not result.wasSuccessful())
125