| # | |
| # 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 #5: Password-Based Cryptography Specification, Version 2.1 | |
| # | |
| # ASN.1 source from: | |
| # https://www.rfc-editor.org/rfc/rfc8018.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 rfc3565 | |
| from pyasn1_modules import rfc5280 | |
| MAX = float('inf') | |
| 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) | |
| # Import from RFC 3565 | |
| AES_IV = rfc3565.AES_IV | |
| # Import from RFC 5280 | |
| AlgorithmIdentifier = rfc5280.AlgorithmIdentifier | |
| # Basic object identifiers | |
| nistAlgorithms = _OID(2, 16, 840, 1, 101, 3, 4) | |
| aes = _OID(nistAlgorithms, 1) | |
| oiw = _OID(1, 3, 14) | |
| rsadsi = _OID(1, 2, 840, 113549) | |
| pkcs = _OID(rsadsi, 1) | |
| digestAlgorithm = _OID(rsadsi, 2) | |
| encryptionAlgorithm = _OID(rsadsi, 3) | |
| pkcs_5 = _OID(pkcs, 5) | |
| # HMAC object identifiers | |
| id_hmacWithSHA1 = _OID(digestAlgorithm, 7) | |
| id_hmacWithSHA224 = _OID(digestAlgorithm, 8) | |
| id_hmacWithSHA256 = _OID(digestAlgorithm, 9) | |
| id_hmacWithSHA384 = _OID(digestAlgorithm, 10) | |
| id_hmacWithSHA512 = _OID(digestAlgorithm, 11) | |
| id_hmacWithSHA512_224 = _OID(digestAlgorithm, 12) | |
| id_hmacWithSHA512_256 = _OID(digestAlgorithm, 13) | |
| # PBES1 object identifiers | |
| pbeWithMD2AndDES_CBC = _OID(pkcs_5, 1) | |
| pbeWithMD2AndRC2_CBC = _OID(pkcs_5, 4) | |
| pbeWithMD5AndDES_CBC = _OID(pkcs_5, 3) | |
| pbeWithMD5AndRC2_CBC = _OID(pkcs_5, 6) | |
| pbeWithSHA1AndDES_CBC = _OID(pkcs_5, 10) | |
| pbeWithSHA1AndRC2_CBC = _OID(pkcs_5, 11) | |
| # Supporting techniques object identifiers | |
| desCBC = _OID(oiw, 3, 2, 7) | |
| des_EDE3_CBC = _OID(encryptionAlgorithm, 7) | |
| rc2CBC = _OID(encryptionAlgorithm, 2) | |
| rc5_CBC_PAD = _OID(encryptionAlgorithm, 9) | |
| aes128_CBC_PAD = _OID(aes, 2) | |
| aes192_CBC_PAD = _OID(aes, 22) | |
| aes256_CBC_PAD = _OID(aes, 42) | |
| # PBES1 | |
| class PBEParameter(univ.Sequence): | |
| pass | |
| PBEParameter.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('salt', univ.OctetString().subtype( | |
| subtypeSpec=constraint.ValueSizeConstraint(8, 8))), | |
| namedtype.NamedType('iterationCount', univ.Integer()) | |
| ) | |
| # PBES2 | |
| id_PBES2 = _OID(pkcs_5, 13) | |
| class PBES2_params(univ.Sequence): | |
| pass | |
| PBES2_params.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('keyDerivationFunc', AlgorithmIdentifier()), | |
| namedtype.NamedType('encryptionScheme', AlgorithmIdentifier()) | |
| ) | |
| # PBMAC1 | |
| id_PBMAC1 = _OID(pkcs_5, 14) | |
| class PBMAC1_params(univ.Sequence): | |
| pass | |
| PBMAC1_params.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('keyDerivationFunc', AlgorithmIdentifier()), | |
| namedtype.NamedType('messageAuthScheme', AlgorithmIdentifier()) | |
| ) | |
| # PBKDF2 | |
| id_PBKDF2 = _OID(pkcs_5, 12) | |
| algid_hmacWithSHA1 = AlgorithmIdentifier() | |
| algid_hmacWithSHA1['algorithm'] = id_hmacWithSHA1 | |
| algid_hmacWithSHA1['parameters'] = univ.Null("") | |
| class PBKDF2_params(univ.Sequence): | |
| pass | |
| PBKDF2_params.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('salt', univ.Choice(componentType=namedtype.NamedTypes( | |
| namedtype.NamedType('specified', univ.OctetString()), | |
| namedtype.NamedType('otherSource', AlgorithmIdentifier()) | |
| ))), | |
| namedtype.NamedType('iterationCount', univ.Integer().subtype( | |
| subtypeSpec=constraint.ValueRangeConstraint(1, MAX))), | |
| namedtype.OptionalNamedType('keyLength', univ.Integer().subtype( | |
| subtypeSpec=constraint.ValueRangeConstraint(1, MAX))), | |
| namedtype.DefaultedNamedType('prf', algid_hmacWithSHA1) | |
| ) | |
| # RC2 CBC algorithm parameter | |
| class RC2_CBC_Parameter(univ.Sequence): | |
| pass | |
| RC2_CBC_Parameter.componentType = namedtype.NamedTypes( | |
| namedtype.OptionalNamedType('rc2ParameterVersion', univ.Integer()), | |
| namedtype.NamedType('iv', univ.OctetString().subtype( | |
| subtypeSpec=constraint.ValueSizeConstraint(8, 8))) | |
| ) | |
| # RC5 CBC algorithm parameter | |
| class RC5_CBC_Parameters(univ.Sequence): | |
| pass | |
| RC5_CBC_Parameters.componentType = namedtype.NamedTypes( | |
| namedtype.NamedType('version', | |
| univ.Integer(namedValues=namedval.NamedValues(('v1_0', 16))).subtype( | |
| subtypeSpec=constraint.SingleValueConstraint(16))), | |
| namedtype.NamedType('rounds', | |
| univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(8, 127))), | |
| namedtype.NamedType('blockSizeInBits', | |
| univ.Integer().subtype(subtypeSpec=constraint.SingleValueConstraint(64, 128))), | |
| namedtype.OptionalNamedType('iv', univ.OctetString()) | |
| ) | |
| # Initialization Vector for AES: OCTET STRING (SIZE(16)) | |
| class AES_IV(univ.OctetString): | |
| pass | |
| AES_IV.subtypeSpec = constraint.ValueSizeConstraint(16, 16) | |
| # Initialization Vector for DES: OCTET STRING (SIZE(8)) | |
| class DES_IV(univ.OctetString): | |
| pass | |
| DES_IV.subtypeSpec = constraint.ValueSizeConstraint(8, 8) | |
| # Update the Algorithm Identifier map | |
| _algorithmIdentifierMapUpdate = { | |
| # PBKDF2-PRFs | |
| id_hmacWithSHA1: univ.Null(), | |
| id_hmacWithSHA224: univ.Null(), | |
| id_hmacWithSHA256: univ.Null(), | |
| id_hmacWithSHA384: univ.Null(), | |
| id_hmacWithSHA512: univ.Null(), | |
| id_hmacWithSHA512_224: univ.Null(), | |
| id_hmacWithSHA512_256: univ.Null(), | |
| # PBES1Algorithms | |
| pbeWithMD2AndDES_CBC: PBEParameter(), | |
| pbeWithMD2AndRC2_CBC: PBEParameter(), | |
| pbeWithMD5AndDES_CBC: PBEParameter(), | |
| pbeWithMD5AndRC2_CBC: PBEParameter(), | |
| pbeWithSHA1AndDES_CBC: PBEParameter(), | |
| pbeWithSHA1AndRC2_CBC: PBEParameter(), | |
| # PBES2Algorithms | |
| id_PBES2: PBES2_params(), | |
| # PBES2-KDFs | |
| id_PBKDF2: PBKDF2_params(), | |
| # PBMAC1Algorithms | |
| id_PBMAC1: PBMAC1_params(), | |
| # SupportingAlgorithms | |
| desCBC: DES_IV(), | |
| des_EDE3_CBC: DES_IV(), | |
| rc2CBC: RC2_CBC_Parameter(), | |
| rc5_CBC_PAD: RC5_CBC_Parameters(), | |
| aes128_CBC_PAD: AES_IV(), | |
| aes192_CBC_PAD: AES_IV(), | |
| aes256_CBC_PAD: AES_IV(), | |
| } | |
| rfc5280.algorithmIdentifierMap.update(_algorithmIdentifierMapUpdate) |