123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- # This file is being contributed to pyasn1-modules software.
- #
- # Created by Russ Housley with assistance from the asn1ate tool.
- #
- # Copyright (c) 2019, Vigil Security, LLC
- # License: http://snmplabs.com/pyasn1/license.html
- #
- # PKCS #12: Personal Information Exchange Syntax v1.1
- #
- # ASN.1 source from:
- # https://www.rfc-editor.org/rfc/rfc7292.txt
- # https://www.rfc-editor.org/errata_search.php?rfc=7292
- 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_modules import rfc2315
- from pyasn1_modules import rfc5652
- from pyasn1_modules import rfc5280
- from pyasn1_modules import rfc5958
- 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)
- # Initialize the maps used in PKCS#12
- pkcs12BagTypeMap = { }
- pkcs12CertBagMap = { }
- pkcs12CRLBagMap = { }
- pkcs12SecretBagMap = { }
- # Imports from RFC 2315, RFC 5652, and RFC 5958
- DigestInfo = rfc2315.DigestInfo
- ContentInfo = rfc5652.ContentInfo
- PKCS12Attribute = rfc5652.Attribute
- EncryptedPrivateKeyInfo = rfc5958.EncryptedPrivateKeyInfo
- PrivateKeyInfo = rfc5958.PrivateKeyInfo
- # CMSSingleAttribute is the same as Attribute in RFC 5652 except the attrValues
- # SET must have one and only one member
- class AttributeType(univ.ObjectIdentifier):
- pass
- class AttributeValue(univ.Any):
- pass
- class AttributeValues(univ.SetOf):
- pass
- AttributeValues.componentType = AttributeValue()
- class CMSSingleAttribute(univ.Sequence):
- pass
- CMSSingleAttribute.componentType = namedtype.NamedTypes(
- namedtype.NamedType('attrType', AttributeType()),
- namedtype.NamedType('attrValues',
- AttributeValues().subtype(sizeSpec=constraint.ValueSizeConstraint(1, 1)),
- openType=opentype.OpenType('attrType', rfc5652.cmsAttributesMap)
- )
- )
- # Object identifier arcs
- rsadsi = _OID(1, 2, 840, 113549)
- pkcs = _OID(rsadsi, 1)
- pkcs_9 = _OID(pkcs, 9)
- certTypes = _OID(pkcs_9, 22)
- crlTypes = _OID(pkcs_9, 23)
- pkcs_12 = _OID(pkcs, 12)
- # PBE Algorithm Identifiers and Parameters Structure
- pkcs_12PbeIds = _OID(pkcs_12, 1)
- pbeWithSHAAnd128BitRC4 = _OID(pkcs_12PbeIds, 1)
- pbeWithSHAAnd40BitRC4 = _OID(pkcs_12PbeIds, 2)
- pbeWithSHAAnd3_KeyTripleDES_CBC = _OID(pkcs_12PbeIds, 3)
- pbeWithSHAAnd2_KeyTripleDES_CBC = _OID(pkcs_12PbeIds, 4)
- pbeWithSHAAnd128BitRC2_CBC = _OID(pkcs_12PbeIds, 5)
- pbeWithSHAAnd40BitRC2_CBC = _OID(pkcs_12PbeIds, 6)
- class Pkcs_12PbeParams(univ.Sequence):
- pass
- Pkcs_12PbeParams.componentType = namedtype.NamedTypes(
- namedtype.NamedType('salt', univ.OctetString()),
- namedtype.NamedType('iterations', univ.Integer())
- )
- # Bag types
- bagtypes = _OID(pkcs_12, 10, 1)
- class BAG_TYPE(univ.Sequence):
- pass
- BAG_TYPE.componentType = namedtype.NamedTypes(
- namedtype.NamedType('id', univ.ObjectIdentifier()),
- namedtype.NamedType('unnamed1', univ.Any(),
- openType=opentype.OpenType('attrType', pkcs12BagTypeMap)
- )
- )
- id_keyBag = _OID(bagtypes, 1)
- class KeyBag(PrivateKeyInfo):
- pass
- id_pkcs8ShroudedKeyBag = _OID(bagtypes, 2)
- class PKCS8ShroudedKeyBag(EncryptedPrivateKeyInfo):
- pass
- id_certBag = _OID(bagtypes, 3)
- class CertBag(univ.Sequence):
- pass
- CertBag.componentType = namedtype.NamedTypes(
- namedtype.NamedType('certId', univ.ObjectIdentifier()),
- namedtype.NamedType('certValue',
- univ.Any().subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)),
- openType=opentype.OpenType('certId', pkcs12CertBagMap)
- )
- )
- x509Certificate = CertBag()
- x509Certificate['certId'] = _OID(certTypes, 1)
- x509Certificate['certValue'] = univ.OctetString()
- # DER-encoded X.509 certificate stored in OCTET STRING
- sdsiCertificate = CertBag()
- sdsiCertificate['certId'] = _OID(certTypes, 2)
- sdsiCertificate['certValue'] = char.IA5String()
- # Base64-encoded SDSI certificate stored in IA5String
- id_CRLBag = _OID(bagtypes, 4)
- class CRLBag(univ.Sequence):
- pass
- CRLBag.componentType = namedtype.NamedTypes(
- namedtype.NamedType('crlId', univ.ObjectIdentifier()),
- namedtype.NamedType('crlValue',
- univ.Any().subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)),
- openType=opentype.OpenType('crlId', pkcs12CRLBagMap)
- )
- )
- x509CRL = CRLBag()
- x509CRL['crlId'] = _OID(crlTypes, 1)
- x509CRL['crlValue'] = univ.OctetString()
- # DER-encoded X.509 CRL stored in OCTET STRING
- id_secretBag = _OID(bagtypes, 5)
- class SecretBag(univ.Sequence):
- pass
- SecretBag.componentType = namedtype.NamedTypes(
- namedtype.NamedType('secretTypeId', univ.ObjectIdentifier()),
- namedtype.NamedType('secretValue',
- univ.Any().subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)),
- openType=opentype.OpenType('secretTypeId', pkcs12SecretBagMap)
- )
- )
- id_safeContentsBag = _OID(bagtypes, 6)
- class SafeBag(univ.Sequence):
- pass
- SafeBag.componentType = namedtype.NamedTypes(
- namedtype.NamedType('bagId', univ.ObjectIdentifier()),
- namedtype.NamedType('bagValue',
- univ.Any().subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)),
- openType=opentype.OpenType('bagId', pkcs12BagTypeMap)
- ),
- namedtype.OptionalNamedType('bagAttributes',
- univ.SetOf(componentType=PKCS12Attribute())
- )
- )
- class SafeContents(univ.SequenceOf):
- pass
- SafeContents.componentType = SafeBag()
- # The PFX PDU
- class AuthenticatedSafe(univ.SequenceOf):
- pass
- AuthenticatedSafe.componentType = ContentInfo()
- # Data if unencrypted
- # EncryptedData if password-encrypted
- # EnvelopedData if public key-encrypted
- class MacData(univ.Sequence):
- pass
- MacData.componentType = namedtype.NamedTypes(
- namedtype.NamedType('mac', DigestInfo()),
- namedtype.NamedType('macSalt', univ.OctetString()),
- namedtype.DefaultedNamedType('iterations', univ.Integer().subtype(value=1))
- # Note: The default is for historical reasons and its use is deprecated
- )
- class PFX(univ.Sequence):
- pass
- PFX.componentType = namedtype.NamedTypes(
- namedtype.NamedType('version',
- univ.Integer(namedValues=namedval.NamedValues(('v3', 3)))
- ),
- namedtype.NamedType('authSafe', ContentInfo()),
- namedtype.OptionalNamedType('macData', MacData())
- )
- # Local key identifier (also defined as certificateAttribute in rfc2985.py)
- pkcs_9_at_localKeyId = _OID(pkcs_9, 21)
- localKeyId = CMSSingleAttribute()
- localKeyId['attrType'] = pkcs_9_at_localKeyId
- localKeyId['attrValues'][0] = univ.OctetString()
- # Friendly name (also defined as certificateAttribute in rfc2985.py)
- pkcs_9_ub_pkcs9String = univ.Integer(255)
- pkcs_9_ub_friendlyName = univ.Integer(pkcs_9_ub_pkcs9String)
- pkcs_9_at_friendlyName = _OID(pkcs_9, 20)
- class FriendlyName(char.BMPString):
- pass
- FriendlyName.subtypeSpec = constraint.ValueSizeConstraint(1, pkcs_9_ub_friendlyName)
- friendlyName = CMSSingleAttribute()
- friendlyName['attrType'] = pkcs_9_at_friendlyName
- friendlyName['attrValues'][0] = FriendlyName()
- # Update the PKCS#12 maps
- _pkcs12BagTypeMap = {
- id_keyBag: KeyBag(),
- id_pkcs8ShroudedKeyBag: PKCS8ShroudedKeyBag(),
- id_certBag: CertBag(),
- id_CRLBag: CRLBag(),
- id_secretBag: SecretBag(),
- id_safeContentsBag: SafeBag(),
- }
- pkcs12BagTypeMap.update(_pkcs12BagTypeMap)
- _pkcs12CertBagMap = {
- _OID(certTypes, 1): univ.OctetString(),
- _OID(certTypes, 2): char.IA5String(),
- }
- pkcs12CertBagMap.update(_pkcs12CertBagMap)
- _pkcs12CRLBagMap = {
- _OID(crlTypes, 1): univ.OctetString(),
- }
- pkcs12CRLBagMap.update(_pkcs12CRLBagMap)
- # Update the Algorithm Identifier map
- _algorithmIdentifierMapUpdate = {
- pbeWithSHAAnd128BitRC4: Pkcs_12PbeParams(),
- pbeWithSHAAnd40BitRC4: Pkcs_12PbeParams(),
- pbeWithSHAAnd3_KeyTripleDES_CBC: Pkcs_12PbeParams(),
- pbeWithSHAAnd2_KeyTripleDES_CBC: Pkcs_12PbeParams(),
- pbeWithSHAAnd128BitRC2_CBC: Pkcs_12PbeParams(),
- pbeWithSHAAnd40BitRC2_CBC: Pkcs_12PbeParams(),
- }
- rfc5280.algorithmIdentifierMap.update(_algorithmIdentifierMapUpdate)
- # Update the CMS Attribute map
- _cmsAttributesMapUpdate = {
- pkcs_9_at_friendlyName: FriendlyName(),
- pkcs_9_at_localKeyId: univ.OctetString(),
- }
- rfc5652.cmsAttributesMap.update(_cmsAttributesMapUpdate)
|