#!/bin/bash # Copyright (c) 2012 Jonathan McDowell , # 2019 Daniel Kahn Gillmor # GNU GPL; v2 or later # Given a key directory, prune, clean, or minimize the keys # "prune" just does basic cleanup on the file, without getting rid of # any third-party signatures. set -e if [ -z "$1" ] || [ -z "$2" ]; then cat >&2 <&2 exit 1 fi if [ ! -d "$2" ]; then printf '%s is not a directory' "$2" >&2 exit 1 fi # takes name of transferable public key file as $1, emits the laundered key to file named $2 launder_tpk() { local interim="$(mktemp -d interim.XXXXXXX)" local success=false local key="$1" local output="$2" mkdir -p -m 0700 "$interim/gpg" "$interim/split" cat > "$interim/gpg/gpg.conf" <&2 fi else printf 'Could not find minimal TPK for %s (fpr: %s)\n' "$key" "$fpr" >&2 fi else printf 'failed to do initial import of %s\n' "$key" >&2 fi rm -rf "$interim" [ $success = true ] } cd "$2" for key in 0x*; do success=false if [ "$1" == launder ]; then if launder_tpk "$key" "$key.new"; then success=true fi else if gpg "${GPGOPTIONS[@]}" --output "$key.new" --import "$key"; then success=true fi fi if [ $success = true ] && [ -s $key.new ]; then OLDSIZE=$(stat -c "%s" "$key") NEWSIZE=$(stat -c "%s" "$key.new") if [ $OLDSIZE -gt $NEWSIZE ]; then echo "Cleaning $key [$OLDSIZE] -> [$NEWSIZE]" mv "$key.new" "$key" elif [ $OLDSIZE -eq $NEWSIZE ] && ! cmp --quiet "$key" "$key.new" ; then printf "Packets were reordered in $key" if [ "$1" == launder ]; then echo " (but ignoring while doing launder: https://dev.gnupg.org/T4422)" else mv "$key.new" "$key" echo fi fi fi [ -e "$key.new" ] && rm "$key.new" done exit 0