# 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)