source: keysigning/gpg-challenge.pl @ 44

Last change on this file since 44 was 44, checked in by simon, 17 years ago
  • Modify copyright and copying permission statement
  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-perl
File size: 4.3 KB
Line 
1#!/usr/bin/perl
2#
3#  Copyright 2007 Simon Ward <simon@bleah.co.uk>
4#  Copyright 2002-2006 Ingo Kloecker <mail@ingo-kloecker.de>
5#
6#  This program is free software; you can redistribute it and/or modify
7#  it under the terms of version 2 of the GNU General Public License as
8#  published by the Free Software Foundation.
9#
10#  is free software; you can redistribute it and/or modify
11#  it under the terms of the GNU General Public License as published by
12#  the Free Software Foundation; either version 2 of the License, or
13#  (at your option) any later version.
14#
15#  This program is distributed in the hope that it will be useful,
16#  but WITHOUT ANY WARRANTY; without even the implied warranty of
17#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18#  GNU General Public License for more details.
19#
20#  You should have received a copy of the GNU General Public License
21#  along with this program; if not, write to the Free Software
22#  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23#
24
25use strict;
26use File::Temp qw(tempfile);
27
28my $myKeyID="0123456789ABCDEF";
29my $myEmailAddress="Full Name <name\@example.com>";
30my $myName="Full Name";
31my $policyURL="http://www.example.com/gpg/policy";
32my $occasion="something";
33
34sub get_uids ($)
35{
36    my $keyID = shift;
37
38    my (%uids);
39
40    open( GPG, "gpg --with-colon --list-sigs --fixed-list-mode $keyID 2>/dev/null|" )
41        || die "Cannot run gpg\n";
42
43    my $uid = "";
44
45    while ( <GPG> ) {
46        if ( /^uid/ ) {
47            if ( defined( $uid ) && $uid ne "" ) {
48                $uids{$uid} = $uid;
49            }
50            my @fields = split /:/;
51            if ( ( $fields[1] ne "r" ) && ( $fields[1] ne "e" ) ) {
52                # user ID wasn't revoked and hasn't expired
53                $uid = $fields[9];
54                # convert some UTF-8 to latin1
55                $uid =~ s/Ã\\x9f/ß/g;
56                $uid =~ s/Ã\\x89/É/g;
57                $uid =~ s/ä/ä/g;
58                $uid =~ s/á/á/g;
59                $uid =~ s/é/é/g;
60                $uid =~ s/è/è/g;
61                $uid =~ s/ø/ø/g;
62                $uid =~ s/ö/ö/g;
63                $uid =~ s/ü/ü/g;
64                $uid =~ s/Ä\\x8c/C/g;
65                $uid =~ s/Å\\x99/r/g;
66                $uid =~ s/\\x3a/:/g;
67                printf STDERR "Found valid user id $uid.\n"
68            }
69        }
70        elsif ( /^sig.*:$myKeyID:.*x:$/ ) {
71            $uid = "";
72            printf STDERR "This user id was already signed by me.\n"
73        }
74    }
75    close GPG;
76
77    if ( defined( $uid ) && $uid ne "" ) {
78        $uids{$uid} = $uid;
79    }
80
81    return %uids;
82}
83
84foreach my $keyID (@ARGV) {
85    if ( $keyID !~ /[A-F0-9]{8}/i )
86    {
87        die "\"$keyID\" doesn't look like a valid Key-ID!\n";
88    }
89
90    printf STDERR "Key ID: $keyID\n";
91    my (%uids) = get_uids($keyID);
92
93    foreach my $uid ( keys %uids )
94    {
95        # Get a random string:
96        my $challenge;
97        open ( RANDOM, "dd if=/dev/random count=64 bs=1 | mimencode|" )
98            || die "Cannot get random string\n";
99        while ( <RANDOM> )
100        {
101            $challenge .= $_;
102        }
103        chomp $challenge;
104        close RANDOM;
105
106        # Create the encrypted part of the body of the message:
107        my $body = << "EOF";
108Hi,
109
110You are receiving this email because you gave me your OpenPGP key
111details for key-signing at $occasion.
112
113This message is a challenge to help verify that you can read email sent
114to $uid and encrypted to the key with ID $keyID.
115
116You should have received an email for each UID, each containing a random
117string of data.  Please reply from each of the UIDs a message was sent
118to, including the random string, making sure you sign the message.  (You
119may encrypt your reply, but this is not necessary.)
120
121After receiving your reply and checking that the challenge string
122matches the original, I will upload your key to a key server unless you
123specify otherwise.
124
125My key-signing policy can be found at:
126
127    $policyURL
128
129BEGIN CHALLENGE
130$challenge
131END CHALLENGE
132
133Regards,
134$myName
135EOF
136
137        my ($tmp_fh, $tmp_fname) = tempfile();
138        print $tmp_fh $body;
139        close $tmp_fh;
140        system ( "mutt -e \"set pgp_autosign=yes;set pgp_autoencrypt=yes\" -i \"$tmp_fname\" -s \"OpenPGP UID verification\" -- \"$uid\"" );
141        print "$challenge: $uid ($keyID)\n";
142    }
143}
Note: See TracBrowser for help on using the repository browser.