On Mon, Aug 15, 2016 at 12:12:02 +0200, Ansgar Burchardt wrote: > If you restore support for `InRelease` and want to use `gpgv`, please > split `InRelease` into two files, i.e. `Release` and `Release.gpg`, and > verify that the signature actually covers all of `Release`. > Here's an attempt at doing that. Only lightly tested.
Cheers, Julien diff --git a/debian/changelog b/debian/changelog index 46b4974..3f0ef23 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +debootstrap (1.0.82) UNRELEASED; urgency=medium + + * Add support for downloading and validating InRelease files, by splitting + up detached signature from signed data. + + -- Julien Cristau <jcris...@debian.org> Fri, 02 Sep 2016 20:26:38 +0200 + debootstrap (1.0.81) unstable; urgency=medium [ Luca Falavigna ] diff --git a/functions b/functions index 031721f..407cc38 100644 --- a/functions +++ b/functions @@ -537,15 +537,30 @@ download_release_sig () { download_release_indices () { local m1="${MIRRORS%% *}" local reldest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release")" - local relsigdest + local inreldest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/InRelease")" + local relsigdest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release.gpg")" progress 0 100 DOWNREL "Downloading Release file" progress_next 100 - get "$m1/dists/$SUITE/Release" "$reldest" nocache || - error 1 NOGETREL "Failed getting release file %s" "$m1/dists/$SUITE/Release" - relsigdest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release.gpg")" - progress 100 100 DOWNREL "Downloading Release file" + if get "$m1/dists/$SUITE/InRelease" "$inreldest" nocache; then + sed -n '/^-----BEGIN PGP SIGNATURE-----$/,/^-----END PGP SIGNATURE-----$/p' < "$inreldest" > "$relsigdest" + awk 'BEGIN {ORS="" ; first=1} + /^-----BEGIN PGP SIGNED MESSAGE-----$/,/^$/ { next } + /^-----BEGIN PGP SIGNATURE-----$/,/^-----END PGP SIGNATURE-----$/ {next} + { if (first) { first=0 } else { printf "\n" } print }' \ + < "$inreldest" > "$reldest" + progress 100 100 DOWNREL "Downloading Release file" + info RELEASESIG "Checking Release signature" + # Don't worry about the exit status from gpgv; parsing the output will + # take care of that. + (gpgv --status-fd 1 --keyring "$KEYRING" --ignore-time-conflict \ + "$relsigdest" "$reldest" || true) | read_gpg_status + else + get "$m1/dists/$SUITE/Release" "$reldest" nocache || + error 1 NOGETREL "Failed getting release file %s" "$m1/dists/$SUITE/Release" + progress 100 100 DOWNREL "Downloading Release file" - download_release_sig "$m1" "$reldest" "$relsigdest" + download_release_sig "$m1" "$reldest" "$relsigdest" + fi extract_release_components $reldest