#!/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
