Die folgenden Kommandos sind bei der Analyse der signierten PGP-Nachricht nützlich.
# Kopieren aus dem PDF-Dokument oder einem OCR-Scan
cat > signedDocument.pgp

# Öffentlichen Schlüssel aus vertrauenswürdiger Quelle herunterladen
curl --output 9F7A3119DF9110EB.asc https://keys.openpgp.org/vks/v1/by-fingerprint/222E67EA2AA253A967408ABE9F7A3119DF9110EB
gpg --import 9F7A3119DF9110EB.asc

# Verifikation mit Warnung
gpg --verify signedDocument.pgp

# Ergänzen der Leerzeile
sed -i '1G' signedDocument.pgp

# Verifikation ohne Warnung
gpg --verify signedDocument.pgp
Erhält man bei der Signaturprüfung noch die Warnung
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
so kann meine Tasse im Frühstücksraum der Fachschaft einen weiteren verläßlichen Hinweis liefern.
# Prüfen des signierten elektronischen Dokuments und zugleich Extrahieren der signierten Datei
gpg --output signedDocument.tex --yes --verify signedDocument.pgp

# Extraktion der Binärdaten aus der PGP-Nachricht
sed '/^[-=]/d;' signedDocument.pgp | base64 -d > signedDocument.bin

# Tag- (0xA3 = compressed) und Algorithmus-Byte (0x02 = zlib)
xxd -p -l2 signedDocument.bin

# Dekomprimieren nach RFC 1950 mit zpipe aus http://zlib.net/zlib-1.2.11.tar.gz
#   ./configure; make; make install; cd examples; gcc zpipe.c -o zpipe -lz
tail -c+3 signedDocument.bin | zpipe -d > signedDocument.dec

# Anzeigen der drei PGP-Pakete mit den Längen der Pakete
gpg -v --list-packets signedDocument.dec

# Extrahieren der signierten Rohdaten aus dem PGP-Paket (die Werte ergeben sich aus den Paket-Längen)
raw=$( gpg -v --list-packets signedDocument.dec | sed '/raw data:/!d;s/[^0-9]//g' )
tail -c+51 signedDocument.dec | head -c $raw > dtbs.bin

# Vergleich des extrahierten Dokuments mit den Rohdaten
diff signedDocument.tex dtbs.bin

# signierte Attribute aus dem Signaturpaket und den Trailer mit Längeninformation ergänzen
echo "
 04 00 13 08 : info bytes
 001D : length bytes
 16 21 04 222e67ea2aa253a967408abe9f7a3119df9110eb : signed attribute fingerprint
 05 02 5f214fd2 : signed attribute signature creation time
 04ff 00000023 : v4 trailer and length info " | sed 's/:.*//' | xxd -p -r >> dtbs.bin

# Berechnen des SHA256-Hashwertes der data-to-be-signed
openssl sha256 -binary dtbs.bin > dtbs.hash
xxd -p -c32 dtbs.hash

# Öffentlichen Schlüssel eg.pub im ASN.1-Format erstellen
echo '3059301306072a8648ce3d020106082a8648ce3d030107034200' | xxd -p -r > eg.bin
sed '/^[-=]/d' 9F7A3119DF9110EB.asc | base64 -d | tail -c +20 | head -c65 >> eg.bin
openssl ec -inform der -pubin -in eg.bin -out eg.pub

# Vergleich der EC-Schlüssel im OpenPGP- und ASN.1-Format
gpg -v --list-packets 9F7A3119DF9110EB.asc | sed '/keyid/q'
openssl ec -text -noout -in eg.pub -pubin
gpg -v --list-packets 9F7A3119DF9110EB.asc | sed -n '/keyid/{g;s/.* //;p;q};h'
openssl ec -text -noout -in eg.pub -pubin 2>&1 | sed -n '/^ /H;${g;s/[ :\n]//g;p}'

# Rekonstruktion der Signatur (r,s) im ASN.1-Format aus der OpenPGP-Signatur
r=$( gpg -v --list-packets signedDocument.dec | sed 'h;N;$!d;x;s/.* //' )
s=$( gpg -v --list-packets signedDocument.dec | sed '$!d;s/.* //' )
# führende Null-Bytes sind nicht erforderlich, da die jeweiligen oberen Bit bei r und s nicht gesetzt sind
printf "30 44\n 02 20 %s\n 02 20 %s\n" $r $s | xxd -p -r > dtbs.sig

# rekonstruierte ASN.1-Signatur anzeigen und vergleichen
openssl asn1parse -i -inform der -in dtbs.sig
gpg -v --list-packets signedDocument.pgp | sed '1,/ctb=88/d'

# Verifikation der Signatur mit OpenSSL
openssl dgst -verify eg.pub -sha256 -signature dtbs.sig dtbs.bin

# PDF-Dokument aus dem elektronischen Dokument erstellen
pdflatex signedDocument.tex
# Logo-Datei nachladen und Extension reduzieren
curl --output Huberlin-logo.png https://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Huberlin-logo.svg/240px-Huberlin-logo.svg.png
# Finales PDF-Dokument erstellen
pdflatex signedDocument.tex
Bei meinen Gutachten unterscheiden sich das aus dem base64-kodierten Text wieder erstellte lesbare signierte Dokument und das ursprüngliche PDF-Dokument nicht. Bei dem hier vorliegenden Dokument ist das ein wenig anders, denn schließlich nimmt das PDF auf der letzten Seite Bezug auf die konkreten Signaturdaten des signierten Dokuments, die ja natürlich erst nach dem Signieren ins PDF übernommen werden konnten. Trotzdem habe ich mich bemüt, die Unterschiede so gering wie möglich zu halten. Man kann dazu die beiden PDF-Dokumente ElektronischeGutachten.pdf und signedDocument.pdf miteinander vergleichen. Wem das zu mühselig ist, der kann sich aber auch hier das Ergebnis des Vergleichs der beiden Quelltexte ansehen:
--- signedDocument.tex  2020-07-29 12:29:10.724178400 +0200
+++ ElektronischeGutachten.tex  2020-07-29 12:35:42.697152800 +0200
@@ -171,2 +171,2 @@
-        data: 5C6A01B15E2CB0B02FB31927207F2A49789D5950F5F04EF8B3EC4F91D58EC3A4
-        data: 50D74FB9DBE09676FD74E3FFEE78049BC5C35044!EG!0DE1CD512138FA0F9EFD
+        data: 5CA99BD65057B064605F54BBBD99F0D52BDD9D372C7523FAB6157100C6F7BAAA
+        data: 5634C700FE38D1DFA826D22544617FEB7F1A184A2F2B8E816691C150F8C940FC
@@ -200,2 +200,2 @@
-%  00ff 5c6a01b15e2cb1b02fb31927207f2a49789d5950f5f04ef8b3ec4f91d58ec3a4
-%  00ff 50d74fb9dbe99676fd74e3ffee78049bc5c350449eb28de1cd512138fa0f9efd
+%  00ff 5ca99bd65057b064605f54bbbd99f0d52bdd9d372c7523fab6157100c6f7baaa
+%  00ff 5634c700fe38d1dfa826d22544617feb7f1a184a2f2b8e816691c150f8c940fc
@@ -228 +228 @@
-  d3eea3c110028fbd0faf6f9c80be85250b3c80dd08a518ee8307b61f676b91b2
+  d3ee268e692e5b03a805a657c47de9be3264af0a45438dfaaa60d49e84c0c264
Wie man sieht, unterscheiden sie sich nur in den Signaturdaten und im Hash-Wert. Hätte man in der Beschreibung auf die konkreten Werte verzichtet, wäre nur noch ein Unterschied in den extern nachzuladenden Logos vorhanden. Und natürlich auch im zusätzlich integrierten MP3 des Morse-Codes, das aber für den Inhalt des Artikels keine weitere Bedeutung hat, da sich die entsprechende Kodierung als Kommentar auch im signierten LaTeX-Quelltext befindet.