"""
剥掉 0xfe59 EXIF 段（保留 Copyright），看 hash 是否等于 token 内 hashedMessage。
"""
import hashlib
import struct
import sys

p = sys.argv[1] if len(sys.argv) > 1 else r'C:\Users\13794\Desktop\workspace\工作\2026\aigcdemo\images\aigc1.jpg'
expected_hash = sys.argv[2] if len(sys.argv) > 2 else '331c07f7e5ea9cbf6b7aab0b8e54765bf366f97f40047168299dd415e0e62597'

with open(p, 'rb') as f:
    data = f.read()

# 找 Exif\0\0 段头
exif_marker = data.find(b'Exif\x00\x00')
if exif_marker < 0:
    print('No Exif!')
    sys.exit(0)

# APP1 段开始 = exif_marker - 2 (FF E1) - 2 (length)
app1_start = exif_marker - 4
seg_len = (data[app1_start + 2] << 8) | data[app1_start + 3]
app1_end = app1_start + 2 + seg_len

print(f'APP1 段位置: {app1_start} - {app1_end} (长度 {seg_len})')

# 找 APP1 段里的 0xfe59 tag
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
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)

# ExifIFD
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)
        fe59_data_start = tiff_start + r32(eo + 8)  # 这是 EXIF data area 内的偏移
        # fe59_data_start 是相对 TIFF header 的偏移
        # 在文件中：绝对位置 = exif_marker + 6 + (fe59_data_start - tiff_start) ... 实际上
        # fe59_data_start = tiff_start + offset
        # 文件位置 = exif_marker + 6 + (tiff_start + offset - tiff_start) = exif_marker + 6 + offset?
        # 不对，tiff_start 是相对于文件开始 (exif_marker + 6 = tiff_start)
        # fe59_data_start 是相对于 tiff_start，所以文件位置 = tiff_start + (fe59_data_start - tiff_start) = fe59_data_start
        # 实际上 r32(eo + 8) 已经是文件绝对偏移（因为 tiff_start + 它指向 offset）
        # 让我重看：r32(eo + 8) 是 TIFF 文件 offset（从 TIFF header 起）
        # 所以文件绝对位置 = tiff_start + (relative offset) 不对，应该是直接 (relative offset)
        # 让我看 parser 的实现
        break

print(f'tiff_start = {tiff_start}')
print('重新看 r32(eo+8) =', r32(eo + 8))
print('fe59 数据文件绝对位置应该是 tiff_start + r32(eo+8) =', tiff_start + r32(eo + 8))
print('但 EXIF APP1 段起点是', app1_start)
print('所以 fe59 数据文件绝对位置 = exif_marker + 6 + r32(eo+8) =', exif_marker + 6 + r32(eo + 8))

# 用 tiff_start + r32
# 但 TIFF header 的偏移是从 TIFF header 算的，所以 fe59 文件绝对位置 = tiff_start + r32(eo+8)
# tiff_start = exif_marker + 6
fe59_abs = tiff_start + r32(eo + 8)
print('实际 fe59 数据文件绝对位置 = tiff_start + r32(eo+8) =', fe59_abs)
print(f'fe59 count = {count}')

# 验证：data[fe59_abs:fe59_abs+count] 应该全是 base64 字符
fe59_b64 = data[fe59_abs:fe59_abs + count]
print(f'fe59 b64 (前 30 字符): {fe59_b64[:30].decode("ascii","replace")}')

# 现在剥掉整个 APP1 段（含 0xfe59）
# 但仅剥 0xfe59 难（它内嵌在 EXIF IFD 中），最简单方案：剥整个 APP1 段
new_data = data[:app1_start] + data[app1_end:]
print(f'剥掉 APP1 后大小: {len(new_data)}')

# 或者更精细：找 0xfe59 entry 精确位置
# APP1 中 EXIF TIFF header 之后是 IFD0，然后 ExifIFD 等
# 我们直接剥掉 0xfe59 entry：
# 重新算: fe59 entry 文件绝对位置
fe59_entry_abs = tiff_start + exif_off + 2 + i * 12
print(f'0xfe59 entry 文件位置: {fe59_entry_abs}, 大小 12 bytes')
# 把这个 entry 改成 12 个 0
new_data2 = bytearray(data)
for j in range(12):
    new_data2[fe59_entry_abs + j] = 0
# 然后还有 fe59 data 也要清
for j in range(count):
    if fe59_abs + j < len(new_data2):
        new_data2[fe59_abs + j] = 0
print(f'清掉 0xfe59 entry+data 后大小: {len(new_data2)}')
h2 = hashlib.sha256(bytes(new_data2)).hexdigest()
print(f'SHA-256 (清 0xfe59): {h2}')
print(f'expected (token):    {expected_hash}')
print('match:', h2 == expected_hash)

# 完整剥 APP1
h3 = hashlib.sha256(new_data).hexdigest()
print(f'SHA-256 (剥 APP1):  {h3}')
print('match (APP1):', h3 == expected_hash)