package Crypt::Keyczar::DsaPrivateKey;
use base 'Crypt::Keyczar::Key';
use strict;
use warnings;
use Crypt::Keyczar::Util;
use Crypt::Keyczar::DsaPublicKey;
sub expose {
my $self = shift;
my $expose = {};
$expose->{size} = $self->{size};
$expose->{publicKey} = $self->get_public->expose;
$expose->{x} = $self->{x};
return $expose;
}
sub read {
my $class = shift;
my $json_string = shift;
my $obj = Crypt::Keyczar::Util::decode_json($json_string);
my $self = bless $obj, $class;
$self->{publicKey} = bless $self->{publicKey}, 'Crypt::Keyczar::DsaPublicKey';
$self->{publicKey}->init();
$self->init();
return $self;
}
sub generate {
my $class = shift;
my $size = shift;
my $key = Crypt::Keyczar::DsaPrivateKeyEngine->generate($size);
my $priv = {};
$priv->{size} = $size;
$priv->{x} = Crypt::Keyczar::Util::encode($key->{x});
my $self = bless $priv, $class;
my $pub = {};
$pub->{size} = $size;
$pub->{y} = Crypt::Keyczar::Util::encode($key->{y});
$pub->{p} = Crypt::Keyczar::Util::encode($key->{p});
$pub->{q} = Crypt::Keyczar::Util::encode($key->{q});
$pub->{g} = Crypt::Keyczar::Util::encode($key->{g});
$self->{publicKey} = bless $pub, 'Crypt::Keyczar::DsaPublicKey';
$self->{publicKey}->init();
$self->init();
return $self;
}
sub get_engine {
my $self = shift;
my @args = map { Crypt::Keyczar::Util::decode($_) } (
$self->{x},
$self->get_public->{y},
$self->get_public->{p},
$self->get_public->{q},
$self->get_public->{g},
);
return Crypt::Keyczar::DsaPrivateKeyEngine->new(@args);
}
sub hash { return $_[0]->get_public->hash(); }
sub digest_size { return 48; }
sub get_public { return $_[0]->{publicKey}; }
1;
package Crypt::Keyczar::DsaPrivateKeyEngine;
use base 'Exporter';
use strict;
use warnings;
use Crypt::Keyczar::Engine;
1;
__END__