text: # This file is being contributed to pyasn1-modules software.
  #
  # Created by Russ Housley with assistance from the asn1ate tool, with manual
  #   changes to implement appropriate constraints and added comments.
  # Modified by Russ Housley to add maps for use with opentypes.
  #
  # Copyright (c) 2019, Vigil Security, LLC
  # License: http://snmplabs.com/pyasn1/license.html
  #
  # JWT Claim Constraints and TN Authorization List for certificate extensions.
  #
  # ASN.1 source from:
  # https://www.rfc-editor.org/rfc/rfc8226.txt (with errata corrected)
  
  from pyasn1.type import char, constraint, namedtype, tag, univ
  
  from pyasn1_modules import rfc5280
  
  MAX = float("inf")
  
  
  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)
  
  
  class JWTClaimName(char.IA5String):
      pass
  
  
  class JWTClaimNames(univ.SequenceOf):
      pass
  
  
  JWTClaimNames.componentType = JWTClaimName()
  JWTClaimNames.sizeSpec = constraint.ValueSizeConstraint(1, MAX)
  
  
  class JWTClaimPermittedValues(univ.Sequence):
      pass
  
  
  JWTClaimPermittedValues.componentType = namedtype.NamedTypes(
      namedtype.NamedType("claim", JWTClaimName()),
      namedtype.NamedType(
          "permitted",
          univ.SequenceOf(componentType=char.UTF8String()).subtype(
              sizeSpec=constraint.ValueSizeConstraint(1, MAX)
          ),
      ),
  )
  
  
  class JWTClaimPermittedValuesList(univ.SequenceOf):
      pass
  
  
  JWTClaimPermittedValuesList.componentType = JWTClaimPermittedValues()
  JWTClaimPermittedValuesList.sizeSpec = constraint.ValueSizeConstraint(1, MAX)
  
  
  class JWTClaimConstraints(univ.Sequence):
      pass
  
  
  JWTClaimConstraints.componentType = namedtype.NamedTypes(
      namedtype.OptionalNamedType(
          "mustInclude",
          JWTClaimNames().subtype(
              explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)
          ),
      ),
      namedtype.OptionalNamedType(
          "permittedValues",
          JWTClaimPermittedValuesList().subtype(
              explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1)
          ),
      ),
  )
  
  JWTClaimConstraints.subtypeSpec = constraint.ConstraintsUnion(
      constraint.WithComponentsConstraint(
          ("mustInclude", constraint.ComponentPresentConstraint())
      ),
      constraint.WithComponentsConstraint(
          ("permittedValues", constraint.ComponentPresentConstraint())
      ),
  )
  
  
  id_pe_JWTClaimConstraints = _OID(1, 3, 6, 1, 5, 5, 7, 1, 27)
  
  
  class ServiceProviderCode(char.IA5String):
      pass
  
  
  class TelephoneNumber(char.IA5String):
      pass
  
  
  TelephoneNumber.subtypeSpec = constraint.ConstraintsIntersection(
      constraint.ValueSizeConstraint(1, 15),
      constraint.PermittedAlphabetConstraint(
          "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "#", "*"
      ),
  )
  
  
  class TelephoneNumberRange(univ.Sequence):
      pass
  
  
  TelephoneNumberRange.componentType = namedtype.NamedTypes(
      namedtype.NamedType("start", TelephoneNumber()),
      namedtype.NamedType(
          "count",
          univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(2, MAX)),
      ),
  )
  
  
  class TNEntry(univ.Choice):
      pass
  
  
  TNEntry.componentType = namedtype.NamedTypes(
      namedtype.NamedType(
          "spc",
          ServiceProviderCode().subtype(
              explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)
          ),
      ),
      namedtype.NamedType(
          "range",
          TelephoneNumberRange().subtype(
              explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1)
          ),
      ),
      namedtype.NamedType(
          "one",
          TelephoneNumber().subtype(
              explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2)
          ),
      ),
  )
  
  
  class TNAuthorizationList(univ.SequenceOf):
      pass
  
  
  TNAuthorizationList.componentType = TNEntry()
  TNAuthorizationList.sizeSpec = constraint.ValueSizeConstraint(1, MAX)
  
  id_pe_TNAuthList = _OID(1, 3, 6, 1, 5, 5, 7, 1, 26)
  
  
  id_ad_stirTNList = _OID(1, 3, 6, 1, 5, 5, 7, 48, 14)
  
  
  # Map of Certificate Extension OIDs to Extensions added to the
  # ones that are in rfc5280.py
  
  _certificateExtensionsMapUpdate = {
      id_pe_TNAuthList: TNAuthorizationList(),
      id_pe_JWTClaimConstraints: JWTClaimConstraints(),
  }
  
  rfc5280.certificateExtensionsMap.update(_certificateExtensionsMapUpdate)
  