App-CamelPKI
view release on metacpan or search on metacpan
lib/App/CamelPKI/CA.pm view on Meta::CPAN
=head1 INTERNAL METHODS
=head2 _certificate_path
=head2 _key_path
Retrun respectives access paths to the certificate and private keys, in
the directory passed to L</load>.
=cut
sub _certificate_path { catfile(shift->{cryptdir}, "ca.crt") }
sub _key_path { catfile(shift->{cryptdir}, "ca.key") }
=head2 _private_key
Returns an instance of
L<Crypt::OpenSSL::CA/Crypt::OpenSSL::CA::PrivateKey> which modelise the
CA private key.
=cut
sub _private_key {
my ($self) = @_;
$self->{private_key} ||=
Crypt::OpenSSL::CA::PrivateKey->parse
(scalar(read_file($self->_key_path)));
}
require My::Tests::Below unless caller;
1;
__END__
=head1 TEST SUITE
=cut
use Test::More qw(no_plan);
use Test::Group;
use File::Spec::Functions qw(catdir catfile);
use Fatal qw(mkdir);
use App::CamelPKI::Certificate;
use App::CamelPKI::PrivateKey;
use App::CamelPKI::Test qw(%test_rootca_certs %test_keys_plaintext
%test_public_keys);
use App::CamelPKI::Error;
use App::CamelPKI::CADB;
=pod
If the following code is activated (replacing C<if (0)> by
C<if (1)>), SQL requests done by L<App::CamelPKI::CADB> will be printed
during tests execution.
=cut
App::CamelPKI::CADB->debug_statements(sub {
my ($sql, @bind_values) = @_;
map { $_ = "<der>" if m/[\000-\010]/ } @bind_values;
diag join(" / ", $sql, @bind_values) . "\n";
}) if (0);
my $cadir = catdir(My::Tests::Below->tempdir, "test-CA");
mkdir($cadir);
sub load_ca {
my $cadb = load App::CamelPKI::CADB($cadir);
return load App::CamelPKI::CA($cadir, $cadb);
}
test "creation and key ceremony for a CA" => sub {
my $ca = load_ca;
ok(! $ca->is_operational);
try {
$ca->certificate;
fail;
} catch Error with {
pass;
};
my $cert = parse App::CamelPKI::Certificate($test_rootca_certs{"rsa1024"});
my $key = parse App::CamelPKI::PrivateKey($test_keys_plaintext{"rsa1024"});
$ca->set_keys(-certificate => $cert, -key => $key);
ok($ca->is_operational);
ok($ca->certificate->equals($cert));
};
=pod
The I<App::CamelPKI::CertTemplate::Foo> class has been copy-pasted from
L<App::CamelPKI::CertTemplate/SYNOPSIS> in its march 22 2007 release. Thats
not that bad if the two code pieces are to diverge one of these days.
=cut
{
package App::CamelPKI::CertTemplate::Foo;
use base "App::CamelPKI::CertTemplate";
use Crypt::OpenSSL::CA;
sub list_keys { qw(name uid) }
sub prepare_certificate {
my ($class, $cacert, $cert, %opts) = @_;
$class->copy_from_ca_cert($cacert, $cert);
$cert->set_notBefore($opts{time});
$cert->set_notAfter($cacert->get_notAfter());
$cert->set_subject_DN
(Crypt::OpenSSL::CA::X509_NAME->new_utf8
("2.5.4.11" => "Internet widgets",
CN => $opts{name}, x500UniqueIdentifier => $opts{uid}));
# ...
}
# Only one certificate may be valid at one time for a given UID:
sub test_certificate_conflict {
my ($class, $db, %opts) = @_;
return $db->search(uid => $opts{uid});
}
( run in 1.345 second using v1.01-cache-2.11-cpan-2398b32b56e )