#!/bin/sh # Bouwt de WKD-boom (advanced method) uit keys//.asc met gpg-wks-client. # Gebruik: build-wkd.sh → //{policy,hu/} # Faalt hard (build breekt) als een .asc geen publieke sleutel is, een privésleutel bevat, de # bestandsnaam niet bij de map hoort, of de sleutel geen UID met precies dat adres heeft. set -eu KEYS=$1; OUT=$2 export GNUPGHOME=$(mktemp -d); chmod 700 "$GNUPGHOME" mkdir -p "$OUT" n=0 for domdir in "$KEYS"/*/; do [ -d "$domdir" ] || continue domain=$(basename "$domdir" | tr 'A-Z' 'a-z') mkdir -p "$OUT/$domain/hu" : > "$OUT/$domain/policy" # verplicht; leeg volstaat (spec §3.1) for f in "$domdir"*.asc; do [ -f "$f" ] || continue addr=$(basename "$f" .asc) case "$addr" in *@"$domain") ;; *) echo "FOUT: $f — bestandsnaam moet @$domain.asc zijn" >&2; exit 1 ;; esac if grep -q 'PRIVATE KEY BLOCK' "$f"; then echo "FOUT: $f bevat een PRIVÉSLEUTEL — nooit in deze repo" >&2; exit 1 fi gpg --batch --quiet --import "$f" # exact-match op het adres (), niet substring fpr=$(gpg --batch --with-colons --list-keys "<$addr>" 2>/dev/null | awk -F: '/^fpr/{print $10; exit}') if [ -z "$fpr" ]; then echo "FOUT: $f — geen sleutel met een UID die exact <$addr> bevat" >&2; exit 1 fi # --install-key: exporteert binair, filtert op deze UID, schrijft /hu/ (+ policy) gpg-wks-client --quiet --directory "$OUT" --install-key "$fpr" "$addr" hash=$(gpg-wks-client --print-wkd-hash "$addr" | awk '{print $1}') [ -s "$OUT/$domain/hu/$hash" ] || { echo "FOUT: $OUT/$domain/hu/$hash niet aangemaakt" >&2; exit 1; } echo "OK $addr → $domain/hu/$hash ($fpr)" n=$((n+1)) done done rm -rf "$GNUPGHOME" echo "Klaar: $n sleutel(s)." find "$OUT" -type f | sort