The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# $Id: 11-public.t,v 1.2 2001/08/29 03:38:48 btrott Exp $

use Test;
use Crypt::Keys;

use File::Spec::Functions qw( catfile );

use vars qw( $SAMPLES );
my %ALG;
BEGIN {
    unshift @INC, 't/';
    require 'test-common.pl';

    %ALG = (
        DSA_OPENSSH => {
            keyfile => catfile($SAMPLES, 'dsa-pub.openssh'),
            datafields => [ qw( p q g pub_key ) ],
            format => 'Public::DSA::OpenSSH',
            desc => 'DSA Public Key, OpenSSH-encoded',
            skip => 0,
        },
        RSA_OPENSSH => {
            keyfile => catfile($SAMPLES, 'rsa-pub.openssh'),
            datafields => [ qw( e n ) ],
            format => 'Public::RSA::OpenSSH',
            desc => 'RSA Public Key, OpenSSH-encoded',
            skip => 0,
        },
        RSA_SSH1 => {
            keyfile => catfile($SAMPLES, 'rsa-pub.ssh1'),
            datafields => [ qw( e n ) ],
            format => 'Public::RSA::SSH1',
            desc => 'RSA Public Key, SSH1-encoded',
            skip => 0,
        },
    );

    my $num_tests = 0;
    for my $alg (keys %ALG) {
        next if $ALG{$alg}{skip};
        $num_tests += 11;  ## static tests
        $num_tests += @{ $ALG{$alg}{datafields} } * 2;
    }

    plan tests => $num_tests;
}

for my $alg (keys %ALG) {
    my $rec = $ALG{$alg};
    next if $rec->{skip};

    my $type_data = Crypt::Keys->detect( Filename => $rec->{keyfile} );
    ok($type_data && ref($type_data) eq "HASH");
    ok($type_data->{Format} & $type_data->{Description});
    ok($type_data->{Format}, $rec->{format});
    ok($type_data->{Description}, $rec->{desc});

    my $key_data = Crypt::Keys->read( Filename => $rec->{keyfile} );
    ok($key_data && ref($key_data) eq "HASH");
    ok($key_data->{Format} && $key_data->{Data});
    ok($key_data->{Format}, $rec->{format});
    for my $df (@{ $rec->{datafields} }) {
        ok($key_data->{Data}{$df});
    }

    my $temp = $rec->{keyfile} . ".tmp";
    ok(Crypt::Keys->write(
                      Filename => $temp,
                      Data     => $key_data,
               ));

    my $key_data2 = Crypt::Keys->read( Filename => $temp );
    ok($key_data2 && ref($key_data2) eq "HASH");
    ok($key_data2->{Format} && $key_data2->{Data});
    ok($key_data2->{Format}, $rec->{format});
    for my $df (@{ $rec->{datafields} }) {
        ok($key_data->{Data}{$df}, $key_data2->{Data}{$df});
    }

    unlink $temp or die "Can't unlink $temp: $!";
}