"""Export public APK signing information and verify continuity. No private keys.""" import argparse import hashlib import json import struct import zipfile from pathlib import Path from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.serialization import pkcs7 from cryptography.hazmat.primitives.asymmetric import rsa from cryptography import x509 def length_prefixed(data, offset=0): size = struct.unpack_from(' len(data): raise ValueError('Malformed APK signing record.') return data[offset + 4:end], end def modern_certificate(apk): # APK v2/v3 certificates live before the ZIP central directory, not META-INF. with open(apk, 'rb') as stream: stream.seek(0, 2) size = stream.tell() stream.seek(max(0, size - 65557)) tail = stream.read() eocd = tail.rfind(b'PK\x05\x06') if eocd < 0: raise ValueError('Missing ZIP directory.') central = struct.unpack_from(' central: raise ValueError('Malformed APK signing block.') stream.seek(central - block_size - 8) block = stream.read(block_size + 8) if struct.unpack_from('