1#
2# This file is part of pyasn1-modules software.
3#
4# Copyright (c) 2019, Vigil Security, LLC
5# License: http://snmplabs.com/pyasn1/license.html
6#
7import sys
8
9from pyasn1.codec.der.decoder import decode as der_decode
10from pyasn1.codec.der.encoder import encode as der_encode
11
12from pyasn1.type import univ
13
14from pyasn1_modules import pem
15from pyasn1_modules import rfc5652
16from pyasn1_modules import rfc4108
17
18try:
19    import unittest2 as unittest
20except ImportError:
21    import unittest
22
23
24class CMSFirmwareWrapperTestCase(unittest.TestCase):
25    pem_text = """\
26MIIEvAYJKoZIhvcNAQcCoIIErTCCBKkCAQExDTALBglghkgBZQMEAgEwggIVBgsq
27hkiG9w0BCRABEKCCAgQEggIA3ntqPr5kDpx+//pgWGfHCH/Ht4pbenGwXv80txyE
28Y0I2mT9BUGz8ILkbhD7Xz89pBS5KhEJpthxH8WREJtvS+wL4BqYLt23wjWoZy5Gt
295dPzWgaNlV/aQ5AdfAY9ljmnNYnK8D8r8ur7bQM4cKUdxry+QA0nqXHMAOSpx4Um
308impCc0BICXaFfL3zBrNxyPubbFO9ofbYOAWaNmmIAhzthXf12vDrLostIqmYrP4
31LMRCjTr4LeYaVrAWfKtbUbByN6IuBef3Qt5cJaChr74udz3JvbYFsUvCpl64kpRq
32g2CT6R+xE4trO/pViJlI15dvJVz04BBYQ2jQsutJwChi97/DDcjIv03VBmrwRE0k
33RJNFP9vpDM8CxJIqcobC5Kuv8b0GqGfGl6ouuQKEVMfBcrupgjk3oc3KL1iVdSr1
34+74amb1vDtTMWNm6vWRqh+Kk17NGEi2mNvYkkZUTIHNGH7OgiDclFU8dSMZd1fun
35/D9dmiFiErDB3Fzr4+8Qz0aKedNE/1uvM+dhu9qjuRdkDzZ4S7txTfk6y9pG9iyk
36aEeTV2kElKXblgi+Cf0Ut4f5he8rt6jveHdMo9X36YiUQVvevj2cgN7lFivEnFYV
37QY0xugpP7lvEFDfsi2+0ozgP8EKOLYaCUKpuvttlYJ+vdtUFEijizEZ4cx02RsXm
38EesxggJ6MIICdgIBA4AUnutnybladNRNLxY5ZoDoAbXLpJwwCwYJYIZIAWUDBAIB
39oIG8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABEDArBgsqhkiG9w0BCRACJDEc
40MBoGCysGAQQBjb9BAQEqBgsrBgEEAY2/QQEBMDAvBgkqhkiG9w0BCQQxIgQgAJfv
41uasB4P6WDLOkOyvj33YPgZW4olHbidzyh1EKP9YwQAYLKoZIhvcNAQkQAikxMTAv
42MAsGCWCGSAFlAwQCAQQgAJfvuasB4P6WDLOkOyvj33YPgZW4olHbidzyh1EKP9Yw
43CwYJKoZIhvcNAQELBIIBgDivAlSLbMPPu+zV+pPcYpNp+A1mwVOytjMBzSo31kR/
44qEu+hVrDknAOk9IdCaDvcz612CcfNT85/KzrYvWWxOP2woU/vZj253SnndALpfNN
45n3/crJjF6hKgkjUwoXebI7kuj5WCh2q5lkd6xUa+jkCw+CINcN43thtS66UsVI4d
46mv02EvsS2cxPY/508uaQZ6AYAacm667bgX8xEjbzACMOeMCuvKQXWAuh3DkNk+gV
47xizHDw7xZxXgMGMAnJglAeBtd3Si5ztILw9U2gKUqFn/nOgy+eW63JuU/q31/Hgg
48ZATjyBznSzneTZrw8/ePoSCj7E9vBeCTUkeFbVB2tJK1iYDMblp6HUuwgYuGKXy/
49ZwKL3GvB11qg7ntdEyjdLq0xcVrht/K0d2dPo4iO4Ac7c1xbFMDAlWOt4FMPWh6O
50iTh55YvT7hAJjTbB5ebgMA9QJnAczQPFnaIePnlFrkETd3YyLK4yHwnoIGo1GiW/
51dsnhVtIdkPtfJIvcYteYJg==
52"""
53
54    def setUp(self):
55        self.asn1Spec = rfc5652.ContentInfo()
56
57    def testDerCodec(self):
58        substrate = pem.readBase64fromText(self.pem_text)
59
60        asn1Object, rest = der_decode(substrate, asn1Spec=self.asn1Spec)
61
62        assert not rest
63        assert asn1Object.prettyPrint()
64        assert der_encode(asn1Object) == substrate
65
66        assert asn1Object['contentType'] == rfc5652.id_signedData
67        inner, rest = der_decode(asn1Object['content'], asn1Spec=rfc5652.SignedData())
68
69        assert inner['encapContentInfo']['eContentType'] == rfc4108.id_ct_firmwarePackage
70        assert inner['encapContentInfo']['eContent']
71
72        attribute_list = [ ]
73        for attr in inner['signerInfos'][0]['signedAttrs']:
74            attribute_list.append(attr['attrType'])
75            if attr['attrType'] == rfc4108.id_aa_targetHardwareIDs:
76                av, rest = der_decode(attr['attrValues'][0],
77                    asn1Spec=rfc4108.TargetHardwareIdentifiers())
78                assert len(av) == 2
79                for oid in av:
80                    assert '1.3.6.1.4.1.221121.1.1.' in oid.prettyPrint()
81
82        assert rfc5652.id_contentType in attribute_list
83        assert rfc5652.id_messageDigest in attribute_list
84        assert rfc4108.id_aa_targetHardwareIDs in attribute_list
85        assert rfc4108.id_aa_fwPkgMessageDigest in attribute_list
86
87    def testOpenTypes(self):
88        substrate = pem.readBase64fromText(self.pem_text)
89        asn1Object, rest = der_decode(substrate,
90            asn1Spec=self.asn1Spec,
91            decodeOpenTypes=True)
92        assert not rest
93        assert asn1Object.prettyPrint()
94        assert der_encode(asn1Object) == substrate
95
96        assert asn1Object['contentType'] == rfc5652.id_signedData
97        sd_eci = asn1Object['content']['encapContentInfo']
98        assert sd_eci['eContentType'] == rfc4108.id_ct_firmwarePackage
99        assert sd_eci['eContent'].hasValue()
100
101        for attr in asn1Object['content']['signerInfos'][0]['signedAttrs']:
102            assert attr['attrType'] in rfc5652.cmsAttributesMap.keys()
103            if attr['attrType'] == rfc4108.id_aa_targetHardwareIDs:
104               for oid in attr['attrValues'][0]:
105                   assert '1.3.6.1.4.1.221121.1.1.' in oid.prettyPrint()
106
107
108suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
109
110if __name__ == '__main__':
111    import sys
112
113    result = unittest.TextTestRunner(verbosity=2).run(suite)
114    sys.exit(not result.wasSuccessful())
115