#!/bin/sh # Prepara lo que acompaña a los ficheros de una versión para que cualquiera # pueda comprobar que son los auténticos: un manifiesto con la huella SHA-256 # de cada fichero y la firma PGP de ese manifiesto. Es el mismo esquema que # usan Sparrow o Bitcoin Core, y se puede comprobar desde Sparrow # (Herramientas › Verificar descarga) o con dos órdenes (ver VERIFICAR.md). # # sh empaquetado/firmar-version.sh [clave] # # En la carpeta van los ficheros que se publican (instalables, APK, paquetes). # Deja a su lado caudal--manifest.txt y caudal--manifest.txt.asc. # «clave» es la huella o el correo de la clave con la que firmar; sin ella, la # que gpg use por defecto. La firma la pide gpg: con la clave en una tarjeta, # habrá que tenerla puesta y tocarla. set -eu CARPETA="${1:?Falta la carpeta con los ficheros de la versión}" VERSION="${2:?Falta la versión (por ejemplo 0.1.1)}" CLAVE="${3:-}" MANIFIESTO="caudal-$VERSION-manifest.txt" cd "$CARPETA" rm -f "$MANIFIESTO" "$MANIFIESTO.asc" # Todo lo que haya, salvo manifiestos y firmas de otras veces, en orden estable FICHEROS="$(find . -maxdepth 1 -type f ! -name '*-manifest.txt' ! -name '*-manifest.txt.asc' ! -name '.*' | sed 's|^\./||' | LC_ALL=C sort)" if [ -z "$FICHEROS" ]; then echo "En $CARPETA no hay ningún fichero que firmar." >&2 exit 1 fi printf '%s\n' "$FICHEROS" | while IFS= read -r f; do sha256sum -- "$f"; done > "$MANIFIESTO" if [ -n "$CLAVE" ]; then gpg --armor --detach-sign --local-user "$CLAVE" --output "$MANIFIESTO.asc" "$MANIFIESTO" else gpg --armor --detach-sign --output "$MANIFIESTO.asc" "$MANIFIESTO" fi # Se comprueba aquí mismo, como lo hará quien lo descargue gpg --verify "$MANIFIESTO.asc" "$MANIFIESTO" sha256sum --check "$MANIFIESTO" echo echo "Listo. Publica junto a los ficheros: $MANIFIESTO y $MANIFIESTO.asc"