Skip to content

Cryptography parsed the CRL file with an incorrect inner identifier. #14267

@onepeople158

Description

@onepeople158

Version: 45.0.3

Hello developers, I used the cryptography library to parse a CRL file with an inner identifier OID of 1.2.840.98445.1.1.11, while its outer identifier is sha256_rsa. When I parsed this CRL file using Go, it displayed the error: "inner and outer signature algorithm identifiers don't match".

Test Case:

wrong_inner_signature_oid.zip

Code:

import os
import sys
from cryptography import x509
from cryptography.hazmat.backends import default_backend

# Try to import asn1crypto for low-level structure analysis
try:
    from asn1crypto import crl as asn1_crl
    HAS_ASN1CRYPTO = True
except ImportError:
    HAS_ASN1CRYPTO = False
    print("Warning: 'asn1crypto' library is not installed. It is recommended to run 'pip install asn1crypto' to view detailed inner/outer algorithm comparison.")


def parse_crl_algorithm_identifier(file_path):
    # Check if file exists
    if not os.path.exists(file_path):
        print(f"Error: File {file_path} not found")
        return

    try:
        # Read file in binary mode
        with open(file_path, "rb") as f:
            crl_data = f.read()

        print(f"Analyzing file: {os.path.basename(file_path)}")
        print("=" * 60)

        # ==========================================
        # 1. Low-level structure analysis with asn1crypto (check inner/outer algorithms)
        # ==========================================
        if HAS_ASN1CRYPTO:
            try:
                # Parse ASN.1 structure
                parsed_crl = asn1_crl.CertificateList.load(crl_data)

                # Extract outer signature algorithm (CertificateList -> signatureAlgorithm)
                outer_algo = parsed_crl['signature_algorithm']['algorithm'].native

                # Extract inner signature algorithm (CertificateList -> tbsCertList -> signature)
                inner_algo = parsed_crl['tbs_cert_list']['signature']['algorithm'].native

                print(f"【Algorithm Consistency Check】")
                print(f"  Outer SignatureAlgorithm: {outer_algo}")
                print(f"  Inner TBSCertList.signature: {inner_algo}")

                if outer_algo != inner_algo:
                    print(f"  ⚠️ Warning: Inner and outer algorithms do not match! (MISMATCH)")
                else:
                    print(f"  Status: Matched (MATCH)")
                print("-" * 60)
            except Exception as e:
                print(f"ASN.1 low-level parsing failed: {e}")
                print("-" * 60)

        # ==========================================
        # 2. Standard parsing with cryptography
        # ==========================================
        try:
            # Load DER-formatted CRL
            crl = x509.load_der_x509_crl(crl_data, default_backend())

            # Print algorithm identified by cryptography (usually outer algorithm)
            print(f"【Cryptography Library Parsing Result】")
            print(f"  Identified Algorithm OID: {crl.signature_algorithm_oid.dotted_string} ({crl.signature_algorithm_oid._name})")

        except ValueError as e:
            print(f"\n❌ Cryptography parsing failed: {e}")
            print("   This is usually due to file format errors, or the library refusing to load due to enforced inner/outer algorithm consistency check.")

    except Exception as e:
        print(f"Unknown error occurred: {e}")


if __name__ == "__main__":
    target_file = r"crl_wrong_inner_signature_oid.der"
    parse_crl_algorithm_identifier(target_file)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions