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