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