"""
找 TSA token 里的 tsaExt
"""
import base64
import hashlib
import io
import re
import struct
from PIL import Image
from asn1crypto import cms

p = r'C:\Users\13794\Desktop\workspace\工作\2026\aigcdemo\images\aigc1.jpg'
with open(p, 'rb') as f:
    data = f.read()

img = Image.open(io.BytesIO(data)).convert('RGB')
buf = io.BytesIO()
img.save(buf, 'JPEG', quality=85)
image_buffer_hash = hashlib.sha256(buf.getvalue()).hexdigest()
print(f'imageBufferHash (重编码): {image_buffer_hash}')

exif_marker = data.find(b'Exif\x00\x00')
tiff_start = exif_marker + 6
bo = 'LE' if data[tiff_start:tiff_start+2] == b'II' else 'BE'
def r16(o): return data[o] | (data[o+1] << 8) if bo == 'LE' else (data[o] << 8) | data[o+1]
def r32(o): return data[o] | (data[o+1] << 8) | (data[o+2] << 16) | (data[o+3] << 24) if bo == 'LE' else (data[o] << 24) | (data[o+1] << 16) | (data[o+2] << 8) | data[o+3]
ifd0_off = r32(tiff_start + 4)
ifd0_n = r16(tiff_start + ifd0_off)
exif_off = None
for i in range(ifd0_n):
    eo = tiff_start + ifd0_off + 2 + i * 12
    if r16(eo) == 0x8769:
        exif_off = r32(eo + 8)
exif_n = r16(tiff_start + exif_off)
for i in range(exif_n):
    eo = tiff_start + exif_off + 2 + i * 12
    if r16(eo) == 0xfe59:
        count = r32(eo + 4)
        data_off = tiff_start + r32(eo + 8)
        b64 = data[data_off:data_off + count].rstrip(b'\x00').decode('ascii')
        break

tsa = base64.b64decode(b64)
content_info = cms.ContentInfo.load(tsa)
signed_data = content_info['content']
signer_infos = signed_data['signer_infos']

for si in signer_infos:
    signed_attrs = si.get('signed_attrs')
    if signed_attrs is None:
        continue
    attrs = list(signed_attrs)
    for attr in attrs:
        # attr 是 CMSAttribute，有 .type 和 .values
        oid = attr['type'].native
        for v in attr['values']:
            try:
                content = v.parsed
                if isinstance(content, str) and ('imageBufferHash' in content or 'metaDataHash' in content):
                    print(f'tsaExt content (first 500 chars):')
                    print(content[:500])
            except Exception as e:
                pass