| # | |
| # This file is being contributed to pyasn1-modules software. | |
| # | |
| # Created by Russ Housley. | |
| # Modified by Russ Housley to add a map for use with opentypes. | |
| # | |
| # Copyright (c) 2019, Vigil Security, LLC | |
| # License: http://snmplabs.com/pyasn1/license.html | |
| # | |
| # Asymmetric Key Packages, which is essentially version 2 of | |
| # the PrivateKeyInfo structure in PKCS#8 in RFC 5208 | |
| # | |
| # ASN.1 source from: | |
| # https://www.rfc-editor.org/rfc/rfc5958.txt | |
| from pyasn1.type import univ, constraint, namedtype, namedval, tag | |
| from pyasn1_modules import rfc5280 | |
| from pyasn1_modules import rfc5652 | |
| MAX = float('inf') | |
| class KeyEncryptionAlgorithmIdentifier(rfc5280.AlgorithmIdentifier): | |
| pass | |
| class PrivateKeyAlgorithmIdentifier(rfc5280.AlgorithmIdentifier): | |
| pass | |
| class EncryptedData(univ.OctetString): | |
| pass | |
| class EncryptedPrivateKeyInfo(univ.Sequence): | |
| componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('encryptionAlgorithm', KeyEncryptionAlgorithmIdentifier()), | |
| namedtype.NamedType('encryptedData', EncryptedData()) | |
| ) | |
| class Version(univ.Integer): | |
| namedValues = namedval.NamedValues(('v1', 0), ('v2', 1)) | |
| class PrivateKey(univ.OctetString): | |
| pass | |
| class Attributes(univ.SetOf): | |
| componentType = rfc5652.Attribute() | |
| class PublicKey(univ.BitString): | |
| pass | |
| # OneAsymmetricKey is essentially version 2 of PrivateKeyInfo. | |
| # If publicKey is present, then the version must be v2; | |
| # otherwise, the version should be v1. | |
| class OneAsymmetricKey(univ.Sequence): | |
| componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('version', Version()), | |
| namedtype.NamedType('privateKeyAlgorithm', PrivateKeyAlgorithmIdentifier()), | |
| namedtype.NamedType('privateKey', PrivateKey()), | |
| namedtype.OptionalNamedType('attributes', Attributes().subtype( | |
| implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))), | |
| namedtype.OptionalNamedType('publicKey', PublicKey().subtype( | |
| implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1))) | |
| ) | |
| class PrivateKeyInfo(OneAsymmetricKey): | |
| pass | |
| # The CMS AsymmetricKeyPackage Content Type | |
| id_ct_KP_aKeyPackage = univ.ObjectIdentifier('2.16.840.1.101.2.1.2.78.5') | |
| class AsymmetricKeyPackage(univ.SequenceOf): | |
| pass | |
| AsymmetricKeyPackage.componentType = OneAsymmetricKey() | |
| AsymmetricKeyPackage.sizeSpec=constraint.ValueSizeConstraint(1, MAX) | |
| # Map of Content Type OIDs to Content Types is added to the | |
| # ones that are in rfc5652.py | |
| _cmsContentTypesMapUpdate = { | |
| id_ct_KP_aKeyPackage: AsymmetricKeyPackage(), | |
| } | |
| rfc5652.cmsContentTypesMap.update(_cmsContentTypesMapUpdate) |