See ChangeLog: Mon Sep 18 16:35:45 CEST 2000 Werner Koch
[gnupg.git] / tools / ring-a-party
1 #!/bin/sh
2 # ring-a-party  - print a keyring suitable for a key signing party
3
4 if [ $# -lt 1 ]; then
5     echo "usage: ring-a-party keyring [headerline]" >&2
6     exit 1
7 fi
8
9 keyring="$1"
10 hdrline="$1"
11 if [ $# -gt 1 ]; then
12     hdrline="$2"
13 fi
14
15 if [ ! -f $keyring ]; then
16     echo "ring-a-party: '$keyring': no such file" >&2
17     exit 1
18 fi
19
20 echo "ring-a-party: output will be written to 'a.pub'" >&2
21
22
23 gpg --dry-run --with-fingerprint --with-colons $keyring \
24     | gawk -v "KEYRING=$hdrline" '
25 BEGIN { FS=":"
26         algos[1] = "RSA";
27         algos[16] = "ElGamal";
28         algos[17] = "DSA";
29         any = 0;
30         lines = -1;
31         page = 0;
32         now = strftime("%b %d %H:%M %Y");
33       }
34 END { 
35     if (any) myflush(); 
36 }
37 $1 == "pub" {
38               if( any ) myflush();
39               uidcount = 0;
40               signencrypt = 0;
41               uids[uidcount++] = $10;
42               nbits = $3;
43               keyid = substr($5,9);
44               created = $6;
45               expires = $7;
46               algostr = mapalgo($4);
47               if( $4 == 20 || $4 == 1 ) signencrypt = 1;
48               any = 1;
49             }
50 $1 == "fpr" { fpr = $10 }
51 $1 == "uid" { uids[uidcount++] = $10 }
52 $1 == "sub" { if( $4 != 17 && $4 != 3 )  signencrypt=1 }
53
54 function myflush()
55 {
56     # fixme: take lines to print here into account
57     if( lines > 50 || lines == -1 ) {
58         if( lines != -1 ) printf "\f";
59         page++;
60         printf "%s  %-50.50s Page %d\n\n", now, KEYRING, page ;
61         printf "Type Bits KeyID      Created    Expires    Algorithm                 Use\n";
62         lines = 1;
63     }
64     printf "pub  %04d 0x%s %10s %10s %-10s     %15s\n",
65           nbits, keyid, created, expires == ""? "----------":expires, algostr,
66                         signencrypt == 1? "Sign & Encrypt":"Sign only";
67     length(fpr) == 40 ? printfpr20( fpr ) : printfpr16( fpr );
68     lnes += 2;
69     for( i=0; i < uidcount; i++ ) {
70         printf "uid  %s\n", uids[i];
71         lines++;
72     }
73     printf "\n\n";
74     lines += 2;
75 }
76
77 function mapalgo( no )
78 {
79     if( no in algos )
80         return algos[no];
81     return sprintf( "algoID=%ds", no );
82 }
83
84
85 function printfpr16( s )
86 {
87     printf "f16    Fingerprint16 =";
88     for(i=0; i < 16; i++ ) {
89         if( i == 8 ) printf " ";
90         printf " %s", substr( s, i*2+1, 2 );
91     }
92     printf "\n"
93 }
94
95 function printfpr20( s )
96 {
97     printf "f20    Fingerprint20 =";
98     for(i=0; i < 10; i++ ) {
99         if( i == 5 ) printf " ";
100         printf " %s", substr( s, i*4+1, 4 );
101     }
102     printf "\n"
103 }
104
105 ' | tee a.pub | gpg --print-mds
106
107
108
109