#!/bin/sh # ring-a-party - print a keyring suitable for a key signing party # Copyright (C) 2000, 2001 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. if [ $# -lt 1 ]; then echo "usage: ring-a-party keyring [headerline]" >&2 exit 1 fi keyring="$1" hdrline="$1" if [ $# -gt 1 ]; then hdrline="$2" fi if [ ! -f $keyring ]; then echo "ring-a-party: '$keyring': no such file" >&2 exit 1 fi echo "ring-a-party: output will be written to 'a.pub'" >&2 gpg --dry-run --with-fingerprint --with-colons $keyring \ | gawk -v "KEYRING=$hdrline" ' BEGIN { FS=":" algos[1] = "RSA"; algos[16] = "Elgamal"; algos[17] = "DSA"; any = 0; lines = -1; page = 0; now = strftime("%b %d %H:%M %Y"); } END { if (any) myflush(); } $1 == "pub" { if( any ) myflush(); uidcount = 0; signencrypt = 0; uids[uidcount++] = $10; nbits = $3; keyid = substr($5,9); created = $6; expires = $7; algostr = mapalgo($4); if( $4 == 20 || $4 == 1 ) signencrypt = 1; any = 1; } $1 == "fpr" { fpr = $10 } $1 == "uid" { uids[uidcount++] = $10 } $1 == "sub" { if( $4 != 17 && $4 != 3 ) signencrypt=1 } function myflush() { # fixme: take lines to print here into account if( lines > 45 || lines == -1 ) { if( lines != -1 ) printf "\f"; page++; printf "%s %-50.50s Page %d\n\n", now, KEYRING, page ; printf " Type Bits KeyID Created Expires Algorithm Use\n\n"; lines = 1; } printf "[ ] pub %04d 0x%s %10s %10s %-10s %15s\n", nbits, keyid, created, expires == ""? "----------":expires, algostr, signencrypt == 1? "Sign & Encrypt":"Sign only"; length(fpr) == 40 ? printfpr20( fpr ) : printfpr16( fpr ); lnes += 2; for( i=0; i < uidcount; i++ ) { printf "( ) uid %s\n", uids[i]; lines++; } printf "\n\n"; lines += 2; } function mapalgo( no ) { if( no in algos ) return algos[no]; return sprintf( "algoID=%ds", no ); } function printfpr16( s ) { printf " f16 Fingerprint16 ="; for(i=0; i < 16; i++ ) { if( i == 8 ) printf " "; printf " %s", substr( s, i*2+1, 2 ); } printf "\n" } function printfpr20( s ) { printf " f20 Fingerprint20 ="; for(i=0; i < 10; i++ ) { if( i == 5 ) printf " "; printf " %s", substr( s, i*4+1, 4 ); } printf "\n" } ' | tee a.pub | gpg --print-mds