bitchat-android/tools/reproducible-builds/compare-archive-payloads.sh
2026-07-28 14:29:49 +02:00

49 lines
1.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
FIRST_ARCHIVE="${1:?usage: compare-archive-payloads.sh FIRST.apk|aab SECOND.apk|aab}"
SECOND_ARCHIVE="${2:?usage: compare-archive-payloads.sh FIRST.apk|aab SECOND.apk|aab}"
TEMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TEMP_DIR"' EXIT
if ! command -v unzip >/dev/null 2>&1; then
echo "error: unzip is required" >&2
exit 1
fi
if command -v sha256sum >/dev/null 2>&1; then
SHA256=(sha256sum)
elif command -v shasum >/dev/null 2>&1; then
SHA256=(shasum -a 256)
else
echo "error: sha256sum or shasum is required" >&2
exit 1
fi
write_payload_manifest() {
local archive="$1"
local output="$2"
: > "$output"
while IFS= read -r entry; do
case "$entry" in
*/|META-INF/MANIFEST.MF|META-INF/*.SF|META-INF/*.RSA|META-INF/*.DSA|META-INF/*.EC)
continue
;;
esac
local digest
digest="$(unzip -p "$archive" "$entry" | "${SHA256[@]}" | awk '{print $1}')"
printf '%s %s\n' "$digest" "$entry" >> "$output"
done < <(unzip -Z1 "$archive" | LC_ALL=C sort)
}
write_payload_manifest "$FIRST_ARCHIVE" "$TEMP_DIR/first"
write_payload_manifest "$SECOND_ARCHIVE" "$TEMP_DIR/second"
if ! diff -u "$TEMP_DIR/first" "$TEMP_DIR/second"; then
echo "error: signed/unsigned archive payloads differ" >&2
exit 1
fi
echo "Archive entry names and uncompressed payload bytes match (signing metadata excluded)."