| # coding: utf-8 | |
| # | |
| # This file is part of pyasn1-modules software. | |
| # | |
| # Created by Stanisław Pitucha with asn1ate tool. | |
| # Modified by Russ Housley to add a maps for CMC Control Attributes | |
| # and CMC Content Types for use with opentypes. | |
| # | |
| # Copyright (c) 2005-2019, Ilya Etingof <[email protected]> | |
| # License: http://snmplabs.com/pyasn1/license.html | |
| # | |
| # Certificate Management over CMS (CMC) Updates | |
| # | |
| # ASN.1 source from: | |
| # https://www.rfc-editor.org/rfc/rfc6402.txt | |
| # | |
| from pyasn1.type import char | |
| from pyasn1.type import constraint | |
| from pyasn1.type import namedtype | |
| from pyasn1.type import namedval | |
| from pyasn1.type import opentype | |
| from pyasn1.type import tag | |
| from pyasn1.type import univ | |
| from pyasn1.type import useful | |
| from pyasn1_modules import rfc4211 | |
| from pyasn1_modules import rfc5280 | |
| from pyasn1_modules import rfc5652 | |
| MAX = float('inf') | |
| def _buildOid(*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) | |
| # Since CMS Attributes and CMC Controls both use 'attrType', one map is used | |
| cmcControlAttributesMap = rfc5652.cmsAttributesMap | |
| class ChangeSubjectName(univ.Sequence): | |
| pass | |
| ChangeSubjectName.componentType = namedtype.NamedTypes( | |
| namedtype.OptionalNamedType('subject', rfc5280.Name()), | |
| namedtype.OptionalNamedType('subjectAlt', rfc5280.GeneralNames()) | |
| ) | |
| class AttributeValue(univ.Any): | |
| pass | |
| class CMCStatus(univ.Integer): | |
| pass | |
| CMCStatus.namedValues = namedval.NamedValues( | |
| ('success', 0), | |
| ('failed', 2), | |
| ('pending', 3), | |
| ('noSupport', 4), | |
| ('confirmRequired', 5), | |
| ('popRequired', 6), | |
| ('partial', 7) | |
| ) | |
| class PendInfo(univ.Sequence): | |
| pass | |
| PendInfo.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('pendToken', univ.OctetString()), | |
| namedtype.NamedType('pendTime', useful.GeneralizedTime()) | |
| ) | |
| bodyIdMax = univ.Integer(4294967295) | |
| class BodyPartID(univ.Integer): | |
| pass | |
| BodyPartID.subtypeSpec = constraint.ValueRangeConstraint(0, bodyIdMax) | |
| class BodyPartPath(univ.SequenceOf): | |
| pass | |
| BodyPartPath.componentType = BodyPartID() | |
| BodyPartPath.sizeSpec = constraint.ValueSizeConstraint(1, MAX) | |
| class BodyPartReference(univ.Choice): | |
| pass | |
| BodyPartReference.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('bodyPartID', BodyPartID()), | |
| namedtype.NamedType('bodyPartPath', BodyPartPath()) | |
| ) | |
| class CMCFailInfo(univ.Integer): | |
| pass | |
| CMCFailInfo.namedValues = namedval.NamedValues( | |
| ('badAlg', 0), | |
| ('badMessageCheck', 1), | |
| ('badRequest', 2), | |
| ('badTime', 3), | |
| ('badCertId', 4), | |
| ('unsupportedExt', 5), | |
| ('mustArchiveKeys', 6), | |
| ('badIdentity', 7), | |
| ('popRequired', 8), | |
| ('popFailed', 9), | |
| ('noKeyReuse', 10), | |
| ('internalCAError', 11), | |
| ('tryLater', 12), | |
| ('authDataFail', 13) | |
| ) | |
| class CMCStatusInfoV2(univ.Sequence): | |
| pass | |
| CMCStatusInfoV2.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('cMCStatus', CMCStatus()), | |
| namedtype.NamedType('bodyList', univ.SequenceOf(componentType=BodyPartReference())), | |
| namedtype.OptionalNamedType('statusString', char.UTF8String()), | |
| namedtype.OptionalNamedType( | |
| 'otherInfo', univ.Choice( | |
| componentType=namedtype.NamedTypes( | |
| namedtype.NamedType('failInfo', CMCFailInfo()), | |
| namedtype.NamedType('pendInfo', PendInfo()), | |
| namedtype.NamedType( | |
| 'extendedFailInfo', univ.Sequence( | |
| componentType=namedtype.NamedTypes( | |
| namedtype.NamedType('failInfoOID', univ.ObjectIdentifier()), | |
| namedtype.NamedType('failInfoValue', AttributeValue())) | |
| ) | |
| ) | |
| ) | |
| ) | |
| ) | |
| ) | |
| class GetCRL(univ.Sequence): | |
| pass | |
| GetCRL.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('issuerName', rfc5280.Name()), | |
| namedtype.OptionalNamedType('cRLName', rfc5280.GeneralName()), | |
| namedtype.OptionalNamedType('time', useful.GeneralizedTime()), | |
| namedtype.OptionalNamedType('reasons', rfc5280.ReasonFlags()) | |
| ) | |
| id_pkix = _buildOid(1, 3, 6, 1, 5, 5, 7) | |
| id_cmc = _buildOid(id_pkix, 7) | |
| id_cmc_batchResponses = _buildOid(id_cmc, 29) | |
| id_cmc_popLinkWitness = _buildOid(id_cmc, 23) | |
| class PopLinkWitnessV2(univ.Sequence): | |
| pass | |
| PopLinkWitnessV2.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('keyGenAlgorithm', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('macAlgorithm', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('witness', univ.OctetString()) | |
| ) | |
| id_cmc_popLinkWitnessV2 = _buildOid(id_cmc, 33) | |
| id_cmc_identityProofV2 = _buildOid(id_cmc, 34) | |
| id_cmc_revokeRequest = _buildOid(id_cmc, 17) | |
| id_cmc_recipientNonce = _buildOid(id_cmc, 7) | |
| class ControlsProcessed(univ.Sequence): | |
| pass | |
| ControlsProcessed.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('bodyList', univ.SequenceOf(componentType=BodyPartReference())) | |
| ) | |
| class CertificationRequest(univ.Sequence): | |
| pass | |
| CertificationRequest.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType( | |
| 'certificationRequestInfo', univ.Sequence( | |
| componentType=namedtype.NamedTypes( | |
| namedtype.NamedType('version', univ.Integer()), | |
| namedtype.NamedType('subject', rfc5280.Name()), | |
| namedtype.NamedType( | |
| 'subjectPublicKeyInfo', univ.Sequence( | |
| componentType=namedtype.NamedTypes( | |
| namedtype.NamedType('algorithm', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('subjectPublicKey', univ.BitString()) | |
| ) | |
| ) | |
| ), | |
| namedtype.NamedType( | |
| 'attributes', univ.SetOf( | |
| componentType=rfc5652.Attribute()).subtype( | |
| implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)) | |
| ) | |
| ) | |
| ) | |
| ), | |
| namedtype.NamedType('signatureAlgorithm', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('signature', univ.BitString()) | |
| ) | |
| class TaggedCertificationRequest(univ.Sequence): | |
| pass | |
| TaggedCertificationRequest.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('bodyPartID', BodyPartID()), | |
| namedtype.NamedType('certificationRequest', CertificationRequest()) | |
| ) | |
| class TaggedRequest(univ.Choice): | |
| pass | |
| TaggedRequest.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('tcr', TaggedCertificationRequest().subtype( | |
| implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))), | |
| namedtype.NamedType('crm', | |
| rfc4211.CertReqMsg().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))), | |
| namedtype.NamedType('orm', univ.Sequence(componentType=namedtype.NamedTypes( | |
| namedtype.NamedType('bodyPartID', BodyPartID()), | |
| namedtype.NamedType('requestMessageType', univ.ObjectIdentifier()), | |
| namedtype.NamedType('requestMessageValue', univ.Any()) | |
| )) | |
| .subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 2))) | |
| ) | |
| id_cmc_popLinkRandom = _buildOid(id_cmc, 22) | |
| id_cmc_statusInfo = _buildOid(id_cmc, 1) | |
| id_cmc_trustedAnchors = _buildOid(id_cmc, 26) | |
| id_cmc_transactionId = _buildOid(id_cmc, 5) | |
| id_cmc_encryptedPOP = _buildOid(id_cmc, 9) | |
| class PublishTrustAnchors(univ.Sequence): | |
| pass | |
| PublishTrustAnchors.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('seqNumber', univ.Integer()), | |
| namedtype.NamedType('hashAlgorithm', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('anchorHashes', univ.SequenceOf(componentType=univ.OctetString())) | |
| ) | |
| class RevokeRequest(univ.Sequence): | |
| pass | |
| RevokeRequest.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('issuerName', rfc5280.Name()), | |
| namedtype.NamedType('serialNumber', univ.Integer()), | |
| namedtype.NamedType('reason', rfc5280.CRLReason()), | |
| namedtype.OptionalNamedType('invalidityDate', useful.GeneralizedTime()), | |
| namedtype.OptionalNamedType('passphrase', univ.OctetString()), | |
| namedtype.OptionalNamedType('comment', char.UTF8String()) | |
| ) | |
| id_cmc_senderNonce = _buildOid(id_cmc, 6) | |
| id_cmc_authData = _buildOid(id_cmc, 27) | |
| class TaggedContentInfo(univ.Sequence): | |
| pass | |
| TaggedContentInfo.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('bodyPartID', BodyPartID()), | |
| namedtype.NamedType('contentInfo', rfc5652.ContentInfo()) | |
| ) | |
| class IdentifyProofV2(univ.Sequence): | |
| pass | |
| IdentifyProofV2.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('proofAlgID', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('macAlgId', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('witness', univ.OctetString()) | |
| ) | |
| class CMCPublicationInfo(univ.Sequence): | |
| pass | |
| CMCPublicationInfo.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('hashAlg', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('certHashes', univ.SequenceOf(componentType=univ.OctetString())), | |
| namedtype.NamedType('pubInfo', rfc4211.PKIPublicationInfo()) | |
| ) | |
| id_kp_cmcCA = _buildOid(rfc5280.id_kp, 27) | |
| id_cmc_confirmCertAcceptance = _buildOid(id_cmc, 24) | |
| id_cmc_raIdentityWitness = _buildOid(id_cmc, 35) | |
| id_ExtensionReq = _buildOid(1, 2, 840, 113549, 1, 9, 14) | |
| id_cct = _buildOid(id_pkix, 12) | |
| id_cct_PKIData = _buildOid(id_cct, 2) | |
| id_kp_cmcRA = _buildOid(rfc5280.id_kp, 28) | |
| class CMCStatusInfo(univ.Sequence): | |
| pass | |
| CMCStatusInfo.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('cMCStatus', CMCStatus()), | |
| namedtype.NamedType('bodyList', univ.SequenceOf(componentType=BodyPartID())), | |
| namedtype.OptionalNamedType('statusString', char.UTF8String()), | |
| namedtype.OptionalNamedType( | |
| 'otherInfo', univ.Choice( | |
| componentType=namedtype.NamedTypes( | |
| namedtype.NamedType('failInfo', CMCFailInfo()), | |
| namedtype.NamedType('pendInfo', PendInfo()) | |
| ) | |
| ) | |
| ) | |
| ) | |
| class DecryptedPOP(univ.Sequence): | |
| pass | |
| DecryptedPOP.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('bodyPartID', BodyPartID()), | |
| namedtype.NamedType('thePOPAlgID', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('thePOP', univ.OctetString()) | |
| ) | |
| id_cmc_addExtensions = _buildOid(id_cmc, 8) | |
| id_cmc_modCertTemplate = _buildOid(id_cmc, 31) | |
| class TaggedAttribute(univ.Sequence): | |
| pass | |
| TaggedAttribute.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('bodyPartID', BodyPartID()), | |
| namedtype.NamedType('attrType', univ.ObjectIdentifier()), | |
| namedtype.NamedType('attrValues', univ.SetOf(componentType=AttributeValue()), | |
| openType=opentype.OpenType('attrType', cmcControlAttributesMap) | |
| ) | |
| ) | |
| class OtherMsg(univ.Sequence): | |
| pass | |
| OtherMsg.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('bodyPartID', BodyPartID()), | |
| namedtype.NamedType('otherMsgType', univ.ObjectIdentifier()), | |
| namedtype.NamedType('otherMsgValue', univ.Any()) | |
| ) | |
| class PKIData(univ.Sequence): | |
| pass | |
| PKIData.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('controlSequence', univ.SequenceOf(componentType=TaggedAttribute())), | |
| namedtype.NamedType('reqSequence', univ.SequenceOf(componentType=TaggedRequest())), | |
| namedtype.NamedType('cmsSequence', univ.SequenceOf(componentType=TaggedContentInfo())), | |
| namedtype.NamedType('otherMsgSequence', univ.SequenceOf(componentType=OtherMsg())) | |
| ) | |
| class BodyPartList(univ.SequenceOf): | |
| pass | |
| BodyPartList.componentType = BodyPartID() | |
| BodyPartList.sizeSpec = constraint.ValueSizeConstraint(1, MAX) | |
| id_cmc_responseBody = _buildOid(id_cmc, 37) | |
| class AuthPublish(BodyPartID): | |
| pass | |
| class CMCUnsignedData(univ.Sequence): | |
| pass | |
| CMCUnsignedData.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('bodyPartPath', BodyPartPath()), | |
| namedtype.NamedType('identifier', univ.ObjectIdentifier()), | |
| namedtype.NamedType('content', univ.Any()) | |
| ) | |
| class CMCCertId(rfc5652.IssuerAndSerialNumber): | |
| pass | |
| class PKIResponse(univ.Sequence): | |
| pass | |
| PKIResponse.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('controlSequence', univ.SequenceOf(componentType=TaggedAttribute())), | |
| namedtype.NamedType('cmsSequence', univ.SequenceOf(componentType=TaggedContentInfo())), | |
| namedtype.NamedType('otherMsgSequence', univ.SequenceOf(componentType=OtherMsg())) | |
| ) | |
| class ResponseBody(PKIResponse): | |
| pass | |
| id_cmc_statusInfoV2 = _buildOid(id_cmc, 25) | |
| id_cmc_lraPOPWitness = _buildOid(id_cmc, 11) | |
| class ModCertTemplate(univ.Sequence): | |
| pass | |
| ModCertTemplate.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('pkiDataReference', BodyPartPath()), | |
| namedtype.NamedType('certReferences', BodyPartList()), | |
| namedtype.DefaultedNamedType('replace', univ.Boolean().subtype(value=1)), | |
| namedtype.NamedType('certTemplate', rfc4211.CertTemplate()) | |
| ) | |
| id_cmc_regInfo = _buildOid(id_cmc, 18) | |
| id_cmc_identityProof = _buildOid(id_cmc, 3) | |
| class ExtensionReq(univ.SequenceOf): | |
| pass | |
| ExtensionReq.componentType = rfc5280.Extension() | |
| ExtensionReq.sizeSpec = constraint.ValueSizeConstraint(1, MAX) | |
| id_kp_cmcArchive = _buildOid(rfc5280.id_kp, 28) | |
| id_cmc_publishCert = _buildOid(id_cmc, 30) | |
| id_cmc_dataReturn = _buildOid(id_cmc, 4) | |
| class LraPopWitness(univ.Sequence): | |
| pass | |
| LraPopWitness.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('pkiDataBodyid', BodyPartID()), | |
| namedtype.NamedType('bodyIds', univ.SequenceOf(componentType=BodyPartID())) | |
| ) | |
| id_aa = _buildOid(1, 2, 840, 113549, 1, 9, 16, 2) | |
| id_aa_cmc_unsignedData = _buildOid(id_aa, 34) | |
| id_cmc_getCert = _buildOid(id_cmc, 15) | |
| id_cmc_batchRequests = _buildOid(id_cmc, 28) | |
| id_cmc_decryptedPOP = _buildOid(id_cmc, 10) | |
| id_cmc_responseInfo = _buildOid(id_cmc, 19) | |
| id_cmc_changeSubjectName = _buildOid(id_cmc, 36) | |
| class GetCert(univ.Sequence): | |
| pass | |
| GetCert.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('issuerName', rfc5280.GeneralName()), | |
| namedtype.NamedType('serialNumber', univ.Integer()) | |
| ) | |
| id_cmc_identification = _buildOid(id_cmc, 2) | |
| id_cmc_queryPending = _buildOid(id_cmc, 21) | |
| class AddExtensions(univ.Sequence): | |
| pass | |
| AddExtensions.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('pkiDataReference', BodyPartID()), | |
| namedtype.NamedType('certReferences', univ.SequenceOf(componentType=BodyPartID())), | |
| namedtype.NamedType('extensions', univ.SequenceOf(componentType=rfc5280.Extension())) | |
| ) | |
| class EncryptedPOP(univ.Sequence): | |
| pass | |
| EncryptedPOP.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('request', TaggedRequest()), | |
| namedtype.NamedType('cms', rfc5652.ContentInfo()), | |
| namedtype.NamedType('thePOPAlgID', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('witnessAlgID', rfc5280.AlgorithmIdentifier()), | |
| namedtype.NamedType('witness', univ.OctetString()) | |
| ) | |
| id_cmc_getCRL = _buildOid(id_cmc, 16) | |
| id_cct_PKIResponse = _buildOid(id_cct, 3) | |
| id_cmc_controlProcessed = _buildOid(id_cmc, 32) | |
| class NoSignatureValue(univ.OctetString): | |
| pass | |
| id_ad_cmc = _buildOid(rfc5280.id_ad, 12) | |
| id_alg_noSignature = _buildOid(id_pkix, 6, 2) | |
| # Map of CMC Control OIDs to CMC Control Attributes | |
| _cmcControlAttributesMapUpdate = { | |
| id_cmc_statusInfo: CMCStatusInfo(), | |
| id_cmc_statusInfoV2: CMCStatusInfoV2(), | |
| id_cmc_identification: char.UTF8String(), | |
| id_cmc_identityProof: univ.OctetString(), | |
| id_cmc_identityProofV2: IdentifyProofV2(), | |
| id_cmc_dataReturn: univ.OctetString(), | |
| id_cmc_transactionId: univ.Integer(), | |
| id_cmc_senderNonce: univ.OctetString(), | |
| id_cmc_recipientNonce: univ.OctetString(), | |
| id_cmc_addExtensions: AddExtensions(), | |
| id_cmc_encryptedPOP: EncryptedPOP(), | |
| id_cmc_decryptedPOP: DecryptedPOP(), | |
| id_cmc_lraPOPWitness: LraPopWitness(), | |
| id_cmc_getCert: GetCert(), | |
| id_cmc_getCRL: GetCRL(), | |
| id_cmc_revokeRequest: RevokeRequest(), | |
| id_cmc_regInfo: univ.OctetString(), | |
| id_cmc_responseInfo: univ.OctetString(), | |
| id_cmc_queryPending: univ.OctetString(), | |
| id_cmc_popLinkRandom: univ.OctetString(), | |
| id_cmc_popLinkWitness: univ.OctetString(), | |
| id_cmc_popLinkWitnessV2: PopLinkWitnessV2(), | |
| id_cmc_confirmCertAcceptance: CMCCertId(), | |
| id_cmc_trustedAnchors: PublishTrustAnchors(), | |
| id_cmc_authData: AuthPublish(), | |
| id_cmc_batchRequests: BodyPartList(), | |
| id_cmc_batchResponses: BodyPartList(), | |
| id_cmc_publishCert: CMCPublicationInfo(), | |
| id_cmc_modCertTemplate: ModCertTemplate(), | |
| id_cmc_controlProcessed: ControlsProcessed(), | |
| id_ExtensionReq: ExtensionReq(), | |
| } | |
| cmcControlAttributesMap.update(_cmcControlAttributesMapUpdate) | |
| # Map of CMC Content Type OIDs to CMC Content Types are added to | |
| # the ones that are in rfc5652.py | |
| _cmsContentTypesMapUpdate = { | |
| id_cct_PKIData: PKIData(), | |
| id_cct_PKIResponse: PKIResponse(), | |
| } | |
| rfc5652.cmsContentTypesMap.update(_cmsContentTypesMapUpdate) | |