-#! /bin/sh
-
-set -e
-
-VERSION="0.3.1"
-USAGE="Usage: $0 [-p papersize] [-r revoked-style] keyid-or-name"
-
-
-if [ -z "$*" ]; then
- echo $USAGE
- exit 1
-fi
-
-KEYIDS=
-REVOKESTYLE=hide
-
-while [ -n "$1" ]; do
- case "$1" in
- -p)
- PAPERSIZE=$2
- export PAPERSIZE
- shift 2
- ;;
- -p*)
- PAPERSIZE=`echo $1 | sed -e 's/^-p//'`
- export PAPERSIZE
- shift 1
- ;;
- -r)
- REVOKESTYLE=$2
- shift 2
- ;;
- -r*)
- REVOKESTYLE=`echo $1 | sed -e 's/^-r//'`
- shift 1
- ;;
- -*)
- echo $USAGE
- exit 1
- ;;
- *)
- KEYIDS=$1
- shift 1
- ;;
- esac
-done
-
-case "$REVOKESTYLE" in
-grey|hide|note|show|strike)
- ;;
-*)
- echo >&2 "Unknown style \"$REVOKESTYLE\". Please use one of"
- echo >&2 " grey - Print text in grey"
- echo >&2 " hide - Don't show revoked uids"
- echo >&2 " note - Add \"(revoked)\""
- echo >&2 " show - List revoked uids normally"
- echo >&2 " strike - Strike through lines"
- exit 1
- ;;
-esac
-
-TMPFILE=`mktemp -t gpg-key2ps.XXXXXX`
-
-if ! gpg --fingerprint --with-colons $KEYIDS 2>/dev/null >$TMPFILE; then
- echo >&2 "Key not found. Try 'gpg --list-keys'"
- rm $TMPFILE
- exit 1
-fi
-
-NUMLINES=$((`wc -l <$TMPFILE` + `grep '^pub:' $TMPFILE | wc -l` - 1))
-
-if test -x /usr/bin/paperconf; then
- w=`paperconf -w`
- h=`paperconf -h`
-else
+#!/usr/bin/perl -w
+#
+# gpg-key2ps: convert a PGP/GnuPG key into paper slips.
+# Copyright (C) 2001-2005 Simon Richter and Thijs Kinkhorst
+# Licenced under the GNU General Public License,
+# version 2 or later.
+#
+# $Id$
+
+use strict;
+use Getopt::Std;
+
+my $version = '$Rev$';
+$version =~ s/\$Rev:\s*(\d+)\s*\$/$1/;
+my $usage = "Usage: $0 [-p papersize] [-r revoked-style] keyid-or-name\n";
+my $keyids = "";
+my $revokestyle="hide";
+
+if ( $#ARGV < 0 ) {
+ print $usage;
+ exit 1;
+}
+
+# fetch command line parameters
+my %opts;
+getopt('pr', \%opts);
+if ( $opts{r} ) { $revokestyle = $opts{'r'}; }
+if ( $opts{p} ) { $ENV{'PAPERSIZE'} = $opts{'p'}; }
+foreach (@ARGV) { $keyids .= $_ . " "; }
+
+if ( $revokestyle !~ /^(grey|hide|note|show|strike)$/ ) {
+ print STDERR "Unknown style \"$revokestyle\". Please use one of\n";
+ print STDERR " grey - Print text in grey\n";
+ print STDERR " hide - Don't show revoked uids\n";
+ print STDERR " note - Add \"(revoked)\"\n";
+ print STDERR " show - List revoked uids normally\n";
+ print STDERR " strike - Strike through lines\n";
+ exit 1;
+}
+
+# determine default papersize through the paperconf tool
+my $w; my $h;
+if ( -x "/usr/bin/paperconf" ) {
+ $w=`paperconf -w`;
+ $h=`paperconf -h`;
+ chomp($w);
+ chomp($h);
+} else {
# Default to A4.
- w=596
- h=842
-fi
-
-cat <<EOF
+ $w=596;
+ $h=842;
+}
+
+# check if key exists
+# can't check that accurately through the 'open' call below
+# so have to run gpg twice). Please supply a better way.
+if ( system( "gpg --fingerprint $keyids >/dev/null" ) != 0 ) {
+ print STDERR "Key not found. Try 'gpg --list-keys'\n";
+ exit 1;
+}
+
+# open a gpg process we'll be reading from below
+open(GPG, "gpg --fingerprint --with-colons $keyids |");
+
+# start the PostScript output
+print <<EOF;
%!PS-Adobe-3.0
%%BoundingBox: 0 0 $w $h
%%Title:
-%%Creator: gpg-key2ps $VERSION
+%%Creator: gpg-key2ps $version
EOF
-echo "%%CreationDate: `date`"
-cat <<EOF
+print "%%CreationDate: " . scalar(localtime) . "\n";
+print <<EOF;
%%Pages: 1
%%EndComments
/condhline { } def
} def
+/showAlgorithm {
+ << 1 (R) 2 (r) 3 (s) 16 (g) 20 (G) 17 (D) >> exch get
+ show
+} def
+
/pub {
condhline
50 y moveto (pub) show
- 70 y moveto show show (/) show show
+ 70 y moveto show showAlgorithm (/) show show
150 y moveto show
200 y moveto show
newline
EOF
-case "$REVOKESTYLE" in
-grey)
- echo "/revuid {"
- echo " .5 setgray"
- echo " uid"
- echo " 0 setgray"
- echo "} def"
- ;;
-hide)
- echo "/revuid {} def"
- ;;
-note)
- echo "/revuid {"
- echo " 50 y moveto (uid) show"
- echo " 200 y moveto show ([revoked]) show"
- echo " newline"
- echo "} def"
- ;;
-show)
- echo "/revuid { uid } def"
- ;;
-strike)
- echo "/revuid {"
- echo " uid"
- echo " 45 y 9 add moveto h 2 div 45 sub y 18 add lineto stroke"
- echo "} def"
- ;;
-esac
-
-cat <<EOF
+# output the desired display for revoked uids
+if ( $revokestyle eq "grey" ) {
+ print "/revuid {\n";
+ print " .5 setgray\n";
+ print " uid\n";
+ print " 0 setgray\n";
+ print "} def\n";
+} elsif ( $revokestyle eq "hide" ) {
+ print "/revuid {} def\n";
+} elsif ( $revokestyle eq "note" ) {
+ print "/revuid {\n";
+ print " 50 y moveto (uid) show\n";
+ print " 200 y moveto show ([revoked]) show\n";
+ print " newline\n";
+ print "} def\n";
+} elsif ( $revokestyle eq "show" ) {
+ print "/revuid { uid } def\n";
+} elsif ( $revokestyle eq "strike" ) {
+ print "/revuid {\n";
+ print " uid\n";
+ print " 45 y 9 add moveto h 2 div 45 sub y 18 add lineto stroke\n";
+ print "} def\n";
+}
+
+print <<EOF;
/sbk {
50 y moveto (sub) show
- 70 y moveto show show (/) show show
+ 70 y moveto show showAlgorithm (/) show show
150 y moveto show
newline
} def
/key {
noneedhline
EOF
-sed -e '/^tru:/d' \
- -e '/^uat:/d' \
- -e 's/^pub:[^:]*:\([^:]*\):1:.\{8,8\}\(.\{8,8\}\):\([^:]*\):[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:.*/ (\4) (\3) (\2) (R) (\1) pub/' \
- -e 's/^pub:[^:]*:\([^:]*\):17:.\{8,8\}\(.\{8,8\}\):\([^:]*\):[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:.*/ (\4) (\3) (\2) (D) (\1) pub/' \
- -e 's/^fpr:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):.*/ (\1) fpr/' \
- -e 's/(\(.\{16,16\}\)\(.\{16,16\}\)) fpr/(@split@\1@ @split@\2@) fpr/' \
- -e 's/@split@\(.\{2,2\}\)\(.\{2,2\}\)\(.\{2,2\}\)\(.\{2,2\}\)\(.\{2,2\}\)\(.\{2,2\}\)\(.\{2,2\}\)\(.\{2,2\}\)@/\1 \2 \3 \4 \5 \6 \7 \8/g' \
- -e 's/(\(.\{20,20\}\)\(.\{20,20\}\)) fpr/(@split@\1@ @split@\2@) fpr/' \
- -e 's/@split@\(.\{4,4\}\)\(.\{4,4\}\)\(.\{4,4\}\)\(.\{4,4\}\)\(.\{4,4\}\)@/\1 \2 \3 \4 \5/g' \
- -e 's/^uid:[^:r]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):.*/ (\1) uid/' \
- -e 's/^uid:r[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):.*/ (\1) revuid/' \
- -e 's/^sub:[^:]*:\([^:]*\):16:.\{8,8\}\(.\{8,8\}\):\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:.*/ (\3) (\2) (g) (\1) sbk/' \
- <$TMPFILE
-cat <<EOF
+
+# walk the output of gpg line by line
+# $numlines has the total number of lines so we'll know how many to put on page
+my $numlines = 0;
+while(<GPG>) {
+ # we don't use these
+ if ( /^(tru|uat):/ ) { next; }
+ # every primary uid causes an extra line because of the separator
+ if ( /^pub:/ ) { $numlines++; }
+ # primary uid
+ s/^pub:[^:]*:([^:]*):([0-9]*):.{8,8}(.{8,8}):([^:]*):[^:]*:[^:]*:[^:]*:([^:]*):[^:]*:[^:]*:.*/ ($5) ($4) ($3) $2 ($1) pub/;
+ # fingerprint, format it nicely with spaces
+ if ( /^fpr:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^:]*):.*/ ) {
+ my $fpr = $1;
+ # v4 key
+ $fpr =~ s/(\w{4})(\w{4})(\w{4})(\w{4})(\w{4})(\w{4})(\w{4})(\w{4})(\w{4})(\w{4})/$1 $2 $3 $4 $5 $6 $7 $8 $9 $10/;
+ # v3 key
+ $fpr =~ s/(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})/$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16/g;
+ $_ = " ($fpr) fpr\n";
+ }
+ # user id's
+ s/^uid:[^:r]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^:]*):.*/ ($1) uid/;
+ s/^uid:[^:r]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^:]*):.*/ ($1) uid/;
+ # revoked user id
+ s/^uid:r[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^:]*):.*/ ($1) revuid/;
+ # subkey
+ s/^sub:[^:]*:([^:]*):([0-9]*):.{8,8}(.{8,8}):([^:]*):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:.*/ ($4) ($3) $2 ($1) sbk/;
+ $numlines++;
+ # print this line
+ print;
+}
+close(GPG);
+
+# output the remaining postscript
+print <<EOF;
} def
EOF
-echo "/numlines $(($NUMLINES + 1)) def"
-cat <<EOF
+print "/numlines $numlines def\n";
+print <<EOF;
/num w 16 sub 10 div numlines div def
/column {
%%EOF
EOF
-rm $TMPFILE
+# done!
+exit 0;
+
+
+__END__
+
+=head1 NAME
+
+B<gpg-key2ps> - generates a PS file from a GnuPG keyring
+
+=head1 SYNOPSIS
+
+B<gpg-key2ps> [-r I<revoked-style>] [-p I<papersize>] I<keyid>I<[> I<keyidI<[> I<...>I<]>>I<]>
+
+=head1 DESCRIPTION
+
+gpg-key2ps generates a PostScript file with your OpenPGP key fingerprint (repeated
+as often as it fits) useful for keysigning parties. The only argument is the same
+as you would pass to GPG's list-keys command, either a key-id or a (partial) name.
+The PS data is written to stdout.
+
+=head1 OPTIONS
+
+=over
+
+=item -p I<paper-size>
+
+Select the output paper size. Default is to look into /etc/papersize or A4 if
+libpaper isn't installed.
+
+=item -r I<revoked-style>
+
+Select how to mark revoked UIDs. Five styles are available:
+B<hide> (don't show at all),
+B<show> (show normally),
+B<grey> (display in 50% grey),
+B<note> (add a note), and
+B<strike> (strike through).
+
+=item I<keyid>
+
+Keyid's to print. Multiple can be separated by spaces.
+
+
+=back
+
+
+=head1 SEE ALSO
+
+gpg(1)
+
+http://pgp-tools.alioth.debian.org/
+
+=head1 AUTHORS AND COPYRIGHT
+
+(c) 2001 - 2005 Simon Richter <sjr@debian.org>
+
+(c) 2005 Thijs Kinkhorst <thijs@kinkhorst.com>
+