82 lines
2.5 KiB
Python
82 lines
2.5 KiB
Python
"""
|
|
快速CRT提取测试 - 只测试一个PDF
|
|
"""
|
|
import pikepdf
|
|
from cryptography.hazmat.primitives.serialization.pkcs7 import load_der_pkcs7_certificates
|
|
from cryptography.x509.oid import NameOID
|
|
|
|
pdf_path = "src/test/resources/data/pdfs/YDQ25_002294.pdf"
|
|
|
|
print(f"Testing CRT extraction for: {pdf_path}")
|
|
|
|
try:
|
|
pdf = pikepdf.Pdf.open(pdf_path)
|
|
acroform = pdf.Root.get("/AcroForm")
|
|
|
|
if not acroform:
|
|
print("ERROR: No /AcroForm found")
|
|
exit(1)
|
|
|
|
fields = acroform.get("/Fields", [])
|
|
print(f"Found {len(fields)} fields")
|
|
|
|
signatures = []
|
|
for idx, field in enumerate(fields):
|
|
field_obj = field
|
|
if field_obj.get("/FT") != "/Sig":
|
|
continue
|
|
|
|
sig_dict = field_obj.get("/V")
|
|
if not sig_dict:
|
|
continue
|
|
|
|
contents_obj = sig_dict.get("/Contents")
|
|
if contents_obj is None:
|
|
continue
|
|
|
|
contents = bytes(contents_obj)
|
|
print(f"\nSignature #{len(signatures)}:")
|
|
print(f" Size: {len(contents)} bytes")
|
|
|
|
# Try PKCS#7 parsing
|
|
try:
|
|
certs = load_der_pkcs7_certificates(contents)
|
|
print(f" PKCS#7 parsing: SUCCESS ({len(certs)} certificates)")
|
|
|
|
for cert_idx, cert in enumerate(certs):
|
|
print(f" Certificate #{cert_idx}:")
|
|
print(f" Subject: {cert.subject}")
|
|
|
|
# Try to get organization name
|
|
for oid in [NameOID.COMMON_NAME, NameOID.ORGANIZATION_NAME]:
|
|
val = cert.subject.get_attributes_for_oid(oid)
|
|
if val:
|
|
print(f" {oid._name}: {val[0].value}")
|
|
|
|
except Exception as e:
|
|
print(f" PKCS#7 parsing: FAILED ({e})")
|
|
|
|
# Try binary search fallback
|
|
known_institutions = [
|
|
"广东产品质量监督检验研究院",
|
|
"广东产品质量监督检验",
|
|
]
|
|
|
|
for inst in known_institutions:
|
|
encoded = inst.encode('utf-8')
|
|
if encoded in contents:
|
|
print(f" Binary search: FOUND '{inst}'")
|
|
print(f" Position: {contents.find(encoded)}")
|
|
break
|
|
|
|
signatures.append(contents)
|
|
if len(signatures) >= 3: # Only test first 3 signatures
|
|
break
|
|
|
|
print(f"\nTotal signatures tested: {len(signatures)}")
|
|
|
|
except Exception as e:
|
|
print(f"ERROR: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|