| # |
| # 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 |
| |
| |
| 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 = rfc5280.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 |
| # To be added to the ones that are in rfc5652.py |
| |
| cmsContentTypesMapUpdate = { |
| id_ct_KP_aKeyPackage: AsymmetricKeyPackage(), |
| } |