make use of PGPExtension in X.509 public key carriers
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Mon, 14 Mar 2011 05:08:17 +0000 (01:08 -0400)
committerDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Mon, 14 Mar 2011 05:27:11 +0000 (01:27 -0400)
Changelog
Crypt/Monkeysphere/MSVA.pm

index ba076bad2b2f8ac328e64031f2d078319da1ddf7..03c8069f10218c9a2ac228b7c4181338b576e183 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -16,8 +16,10 @@ msva-perl (0.9~pre) upstream;
   * Now depending on Crypt::X509 0.50 for pubkey components directly.
   * Crypt::Monkeysphere::OpenPGP for helper functions in
     packet generation and parsing.
+  * Parse and make use of X.509 PGPExtension if present in X.509 public
+    key carrier.
 
- -- Daniel Kahn Gillmor <dkg@fifthhorseman.net>  Fri, 11 Mar 2011 01:24:55 -0500
+ -- Daniel Kahn Gillmor <dkg@fifthhorseman.net>  Mon, 14 Mar 2011 01:07:50 -0400
 
 msva-perl (0.8) upstream;
 
index 5c48fa1e13de80e26b0b901c1325317d530d7bfe..0b71816bed84a7dee446fc0fd0852dd2577b603f 100755 (executable)
@@ -38,6 +38,7 @@
   use Crypt::Monkeysphere::Logger;
   use Crypt::Monkeysphere::Util qw(untaint);
   use Crypt::Monkeysphere::MSVA::Monitor;
+  use Crypt::Monkeysphere::OpenPGP;
 
   use JSON;
   use POSIX qw(strftime);
         if (! defined $key) {
           msvalog('verbose', "failed to decode %s\n", unpack('H*', $cert->pubkey()));
           $key = {error => 'failed to decode the public key'};
+        } else {
+          # ensure these are Math::BigInts!
+          $key->{exponent} = Math::BigInt::->new($key->{exponent}) unless (ref($key->{exponent}));
+          $key->{modulus} = Math::BigInt::->new($key->{modulus}) unless (ref($key->{modulus}));
+
+          my $pgpext = $cert->PGPExtension();
+          if (defined $pgpext) {
+            $key->{openpgp4fpr} = Crypt::Monkeysphere::OpenPGP::fingerprint($key, $pgpext);
+            msvalog('verbose', "OpenPGP Fingerprint (derived from X.509 cert): 0x%s\n", uc(unpack("H*", $key->{openpgp4fpr})));
+          }
         }
       }
     }
       if ($data->{pkc}->{data} =~ /^(0x)?([[:xdigit:]]{40})$/) {
        $data->{pkc}->{data} = uc($2);
        $fpr = $data->{pkc}->{data};
-       msvalog('verbose', "OpenPGP v4 fingerprint: %s\n",$fpr);
       } else {
        msvalog('error', "invalid OpenPGP v4 fingerprint: %s\n",$data->{pkc}->{data});
        $ret->{message} = sprintf("Invalid OpenPGP v4 fingerprint.");
        $ret->{message} = $key->{error};
        return $status,$ret;
       }
+      $fpr = uc(unpack('H*', $key->{openpgp4fpr}))
+        if (exists $key->{openpgp4fpr});
     }
+    msvalog('verbose', "OpenPGP v4 fingerprint: %s\n",$fpr)
+      if defined $fpr;
 
     # determine keyserver policy
     my $kspolicy;