Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Crypt::OpenPGP - finding and using preferred SK algorithm

by hv (Parson)
on Feb 03, 2004 at 16:40 UTC ( #326235=sourcecode: print w/replies, xml ) Need Help??
Category: Cryptography
Author/Contact Info hv

Crypt::OpenPGP provides no overt mechanism to interrogate a self-signed key to determine the owner's preferred encryption mechanisms. After pointers in Crypt::OpenPGP - determining which cipher to use I came up with this sample code that shows how you can do that.

Caveats: delves into object innards, provided for education only, tested only with modern (v4) signatures, assumption that code is self-documenting may be dubious.

#!/usr/bin/perl -w
use Crypt::OpenPGP;
use Crypt::OpenPGP::KeyRing;

my($keyfile, $email) = @ARGV;
my $ring = Crypt::OpenPGP::KeyRing->new(Filename => $keyfile);
my $pgp = Crypt::OpenPGP->new(PubRing => $ring);
my $kb = $ring->find_keyblock_by_uid($email);
my $alg = $kb->preferred_sk_alg;
my $crypt = $pgp->encrypt(
    Data => 'squeamish ossifrage',
    Recipients => [ $email ],
    Armour => 1,
    ($alg ? (Cipher => $alg) : ()), # use default if no preference loc
print $crypt;
exit 0;

    package Crypt::OpenPGP::KeyBlock;
    sub preferred_sk_alg {
        my $self = shift;
        use Crypt::OpenPGP::Cipher;
        my $supported = Crypt::OpenPGP::Cipher->supported;
        my @prefs;
        for my $sig (@{ $self->get('Crypt::OpenPGP::Signature') }) {
            if ($sig->is_primary) {
                unshift @prefs, @{ $sig->preferred_sk_alg };
            } else {
                push @prefs, @{ $sig->preferred_sk_alg };
        for (@prefs) {
            return $_ if $supported->{$_};
    package Crypt::OpenPGP::Signature;
    sub is_primary {
        my $self = shift;
        my $packet = $self->find_subpacket(25); # primary user id
        ($packet && $packet->{data}) || 0;
    sub preferred_sk_alg {
        my $self = shift;
        my $packet = $self->find_subpacket(11); # preferred SK algorit
        $packet ? $packet->{data} : [];
Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://326235]
[marto]: it literally doesn't work. Also, via their citrix interface theres no way to open attachments, or upload an attachment for sending. The company policy is that you email you work account from a personal one, and forward it on from there :/
[Corion]: marto: Ouch :/ And having that as a (written) policy strikes me as inane...
[Corion]: So maybe you can use that momentum in the household instead, or use it for taxes or other chores ;)

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2018-01-16 08:55 GMT
Find Nodes?
    Voting Booth?
    How did you see in the new year?

    Results (175 votes). Check out past polls.