| # This file is being contributed to pyasn1-modules software. | |
| # | |
| # Created by Russ Housley with assistance from asn1ate v.0.6.0. | |
| # | |
| # Copyright (c) 2019, Vigil Security, LLC | |
| # License: http://snmplabs.com/pyasn1/license.html | |
| # | |
| # S/MIME Version 3.2 Message Specification | |
| # | |
| # ASN.1 source from: | |
| # https://www.rfc-editor.org/rfc/rfc5751.txt | |
| from pyasn1.type import namedtype | |
| from pyasn1.type import opentype | |
| from pyasn1.type import tag | |
| from pyasn1.type import univ | |
| from pyasn1_modules import rfc5652 | |
| from pyasn1_modules import rfc8018 | |
| def _OID(*components): | |
| output = [] | |
| for x in tuple(components): | |
| if isinstance(x, univ.ObjectIdentifier): | |
| output.extend(list(x)) | |
| else: | |
| output.append(int(x)) | |
| return univ.ObjectIdentifier(output) | |
| # Imports from RFC 5652 and RFC 8018 | |
| IssuerAndSerialNumber = rfc5652.IssuerAndSerialNumber | |
| RecipientKeyIdentifier = rfc5652.RecipientKeyIdentifier | |
| SubjectKeyIdentifier = rfc5652.SubjectKeyIdentifier | |
| rc2CBC = rfc8018.rc2CBC | |
| # S/MIME Capabilities Attribute | |
| smimeCapabilities = univ.ObjectIdentifier('1.2.840.113549.1.9.15') | |
| smimeCapabilityMap = { } | |
| class SMIMECapability(univ.Sequence): | |
| pass | |
| SMIMECapability.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('capabilityID', univ.ObjectIdentifier()), | |
| namedtype.OptionalNamedType('parameters', univ.Any(), | |
| openType=opentype.OpenType('capabilityID', smimeCapabilityMap)) | |
| ) | |
| class SMIMECapabilities(univ.SequenceOf): | |
| pass | |
| SMIMECapabilities.componentType = SMIMECapability() | |
| class SMIMECapabilitiesParametersForRC2CBC(univ.Integer): | |
| # which carries the RC2 Key Length (number of bits) | |
| pass | |
| # S/MIME Encryption Key Preference Attribute | |
| id_smime = univ.ObjectIdentifier('1.2.840.113549.1.9.16') | |
| id_aa = _OID(id_smime, 2) | |
| id_aa_encrypKeyPref = _OID(id_aa, 11) | |
| class SMIMEEncryptionKeyPreference(univ.Choice): | |
| pass | |
| SMIMEEncryptionKeyPreference.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('issuerAndSerialNumber', | |
| IssuerAndSerialNumber().subtype(implicitTag=tag.Tag( | |
| tag.tagClassContext, tag.tagFormatSimple, 0))), | |
| namedtype.NamedType('receipentKeyId', | |
| # Yes, 'receipentKeyId' is spelled incorrectly, but kept | |
| # this way for alignment with the ASN.1 module in the RFC. | |
| RecipientKeyIdentifier().subtype(implicitTag=tag.Tag( | |
| tag.tagClassContext, tag.tagFormatSimple, 1))), | |
| namedtype.NamedType('subjectAltKeyIdentifier', | |
| SubjectKeyIdentifier().subtype(implicitTag=tag.Tag( | |
| tag.tagClassContext, tag.tagFormatSimple, 2))) | |
| ) | |
| # The Prefer Binary Inside SMIMECapabilities attribute | |
| id_cap = _OID(id_smime, 11) | |
| id_cap_preferBinaryInside = _OID(id_cap, 1) | |
| # CMS Attribute Map | |
| _cmsAttributesMapUpdate = { | |
| smimeCapabilities: SMIMECapabilities(), | |
| id_aa_encrypKeyPref: SMIMEEncryptionKeyPreference(), | |
| } | |
| rfc5652.cmsAttributesMap.update(_cmsAttributesMapUpdate) | |
| # SMIMECapabilities Attribute Map | |
| # | |
| # Do not include OIDs in the dictionary when the parameters are absent. | |
| _smimeCapabilityMapUpdate = { | |
| rc2CBC: SMIMECapabilitiesParametersForRC2CBC(), | |
| } | |
| smimeCapabilityMap.update(_smimeCapabilityMapUpdate) |