1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#!/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
|