# # This file is part of pyasn1-modules software. # # Created by Russ Housley. # # Copyright (c) 2019, Vigil Security, LLC # License: http://snmplabs.com/pyasn1/license.html # # PKCS #1: RSA Cryptography Specifications Version 2.2 # # ASN.1 source from: # https://www.rfc-editor.org/rfc/rfc8017.txt # from pyasn1.type import constraint from pyasn1.type import namedtype from pyasn1.type import namedval from pyasn1.type import univ from pyasn1_modules import rfc2437 from pyasn1_modules import rfc3447 from pyasn1_modules import rfc4055 from pyasn1_modules import rfc5280 MAX = float('inf') # Import Algorithm Identifier from RFC 5280 AlgorithmIdentifier = rfc5280.AlgorithmIdentifier class DigestAlgorithm(AlgorithmIdentifier): pass class HashAlgorithm(AlgorithmIdentifier): pass class MaskGenAlgorithm(AlgorithmIdentifier): pass class PSourceAlgorithm(AlgorithmIdentifier): pass # Object identifiers from NIST SHA2 hashAlgs = univ.ObjectIdentifier('2.16.840.1.101.3.4.2') id_sha256 = rfc4055.id_sha256 id_sha384 = rfc4055.id_sha384 id_sha512 = rfc4055.id_sha512 id_sha224 = rfc4055.id_sha224 id_sha512_224 = hashAlgs + (5, ) id_sha512_256 = hashAlgs + (6, ) # Basic object identifiers pkcs_1 = univ.ObjectIdentifier('1.2.840.113549.1.1') rsaEncryption = rfc2437.rsaEncryption id_RSAES_OAEP = rfc2437.id_RSAES_OAEP id_pSpecified = rfc2437.id_pSpecified id_RSASSA_PSS = rfc4055.id_RSASSA_PSS md2WithRSAEncryption = rfc2437.md2WithRSAEncryption md5WithRSAEncryption = rfc2437.md5WithRSAEncryption sha1WithRSAEncryption = rfc2437.sha1WithRSAEncryption sha224WithRSAEncryption = rfc4055.sha224WithRSAEncryption sha256WithRSAEncryption = rfc4055.sha256WithRSAEncryption sha384WithRSAEncryption = rfc4055.sha384WithRSAEncryption sha512WithRSAEncryption = rfc4055.sha512WithRSAEncryption sha512_224WithRSAEncryption = pkcs_1 + (15, ) sha512_256WithRSAEncryption = pkcs_1 + (16, ) id_sha1 = rfc2437.id_sha1 id_md2 = univ.ObjectIdentifier('1.2.840.113549.2.2') id_md5 = univ.ObjectIdentifier('1.2.840.113549.2.5') id_mgf1 = rfc2437.id_mgf1 # Default parameter values sha1 = rfc4055.sha1Identifier SHA1Parameters = univ.Null("") mgf1SHA1 = rfc4055.mgf1SHA1Identifier class EncodingParameters(univ.OctetString): subtypeSpec = constraint.ValueSizeConstraint(0, MAX) pSpecifiedEmpty = rfc4055.pSpecifiedEmptyIdentifier emptyString = EncodingParameters(value='') # Main structures class Version(univ.Integer): namedValues = namedval.NamedValues( ('two-prime', 0), ('multi', 1) ) class TrailerField(univ.Integer): namedValues = namedval.NamedValues( ('trailerFieldBC', 1) ) RSAPublicKey = rfc2437.RSAPublicKey OtherPrimeInfo = rfc3447.OtherPrimeInfo OtherPrimeInfos = rfc3447.OtherPrimeInfos RSAPrivateKey = rfc3447.RSAPrivateKey RSAES_OAEP_params = rfc4055.RSAES_OAEP_params rSAES_OAEP_Default_Identifier = rfc4055.rSAES_OAEP_Default_Identifier RSASSA_PSS_params = rfc4055.RSASSA_PSS_params rSASSA_PSS_Default_Identifier = rfc4055.rSASSA_PSS_Default_Identifier # Syntax for the EMSA-PKCS1-v1_5 hash identifier class DigestInfo(univ.Sequence): componentType = namedtype.NamedTypes( namedtype.NamedType('digestAlgorithm', DigestAlgorithm()), namedtype.NamedType('digest', univ.OctetString()) ) # Update the Algorithm Identifier map _algorithmIdentifierMapUpdate = { id_sha1: univ.Null(), id_sha224: univ.Null(), id_sha256: univ.Null(), id_sha384: univ.Null(), id_sha512: univ.Null(), id_sha512_224: univ.Null(), id_sha512_256: univ.Null(), id_mgf1: AlgorithmIdentifier(), id_pSpecified: univ.OctetString(), id_RSAES_OAEP: RSAES_OAEP_params(), id_RSASSA_PSS: RSASSA_PSS_params(), md2WithRSAEncryption: univ.Null(), md5WithRSAEncryption: univ.Null(), sha1WithRSAEncryption: univ.Null(), sha224WithRSAEncryption: univ.Null(), sha256WithRSAEncryption: univ.Null(), sha384WithRSAEncryption: univ.Null(), sha512WithRSAEncryption: univ.Null(), sha512_224WithRSAEncryption: univ.Null(), sha512_256WithRSAEncryption: univ.Null(), } rfc5280.algorithmIdentifierMap.update(_algorithmIdentifierMapUpdate)