#!/usr/bin/perl use strict; BEGIN { $| = 1; $^W = 1; } use Test::More; BEGIN { eval { require Crypt::DES_EDE3 }; if ( $@ ) { Test::More->import( skip_all => 'no Crypt::DES_EDE3' ); } eval { require Convert::PEM }; if ( $@ ) { Test::More->import( skip_all => 'no Convert::PEM' ); } Test::More->import( tests => 26 ); } use Crypt::DSA; use Crypt::DSA::Key; use Crypt::DSA::Signature; my $keyfile = "./dsa-key.pem"; my $dsa = Crypt::DSA->new; my $key = $dsa->keygen( Size => 512 ); ## Serialize a signature. my $sig = $dsa->sign( Message => 'foo', Key => $key, ); ok($sig, 'Signature created correctly using Crypt::DSA->sign'); my $buf = $sig->serialize; ok($buf, 'Signature serialized correctly'); my $sig2 = Crypt::DSA::Signature->new( Content => $buf ); ok($sig2, 'Signature created correctly using Crypt::DSA::Signature'); is($sig2->r, $sig->r, '->r of both signatures is identical'); is($sig2->s, $sig->s, '->s of both signatures is identical'); ok($key->write( Type => 'PEM', Filename => $keyfile), 'Writing key works.'); my $key2 = Crypt::DSA::Key->new( Type => 'PEM', Filename => $keyfile ); ok($key2, 'Load key using Crypt::DSA::key'); is($key->p, $key2->p, '->p of both keys is identical'); is($key->q, $key2->q, '->q of both keys is identical'); is($key->g, $key2->g, '->g of both keys is identical'); is($key->pub_key, $key2->pub_key, '->pub_key of both keys is identical'); is($key->priv_key, $key2->priv_key, '->priv_key of both keys is identical'); ok($key->write( Type => 'PEM', Filename => $keyfile, Password => 'foo'), 'Writing keyfile with password works'); $key2 = Crypt::DSA::Key->new( Type => 'PEM', Filename => $keyfile, Password => 'foo' ); ok($key2, 'Reading keyfile with password works'); is($key->p, $key2->p, '->p of both keys is identical'); is($key->q, $key2->q, '->q of both keys is identical'); is($key->g, $key2->g, '->g of both keys is identical'); is($key->pub_key, $key2->pub_key, '->pub_key of both keys is identical'); is($key->priv_key, $key2->priv_key, '->priv_key of both keys is identical'); ## Now remove the private key portion of the key. write should automatically ## write a public key format instead, and new should be able to understand ## it. $key->priv_key(undef); ok($key->write( Type => 'PEM', Filename => $keyfile), 'Writing keyfile without private key works'); $key2 = Crypt::DSA::Key->new( Type => 'PEM', Filename => $keyfile ); ok($key2, 'Reading keyfile without private key works'); is($key->p, $key2->p, '->p of both keys is identical'); is($key->q, $key2->q, '->q of both keys is identical'); is($key->g, $key2->g, '->g of both keys is identical'); is($key->pub_key, $key2->pub_key, '->pub_key of both keys is identical'); ok(!$key->priv_key, 'No private key'); unlink $keyfile;