#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 13;
use File::Spec;
use Net::SSLeay;
Net::SSLeay::randomize();
Net::SSLeay::load_error_strings();
Net::SSLeay::add_ssl_algorithms();
my $key_pem = File::Spec->catfile('t', 'data', 'key.pem.e');
my $key_password = 'secret';
my $cb_1_calls = 0;
my $cb_2_calls = 0;
my $cb_3_calls = 0;
sub callback {
my ($rwflag, $userdata) = @_;
$cb_1_calls++;
is( $$userdata, $key_password, 'recieved userdata properly' );
return $$userdata;
}
sub callback2 {
my ($rwflag, $userdata) = @_;
$cb_2_calls++;
is( $$userdata, $key_password, 'recieved userdata properly' );
return $$userdata;
}
sub callback3 {
my ($rwflag, $userdata) = @_;
$cb_3_calls++;
is( $userdata, undef, 'recieved no userdata' );
return $key_password;
}
my $ctx = Net::SSLeay::CTX_new();
ok($ctx, 'CTX_new');
my $ctx_2 = Net::SSLeay::CTX_new();
ok($ctx, 'CTX_new');
my $ctx_3 = Net::SSLeay::CTX_new();
ok($ctx, 'CTX_new');
Net::SSLeay::CTX_set_default_passwd_cb($ctx, \&callback);
Net::SSLeay::CTX_set_default_passwd_cb_userdata($ctx, \$key_password);
Net::SSLeay::CTX_set_default_passwd_cb($ctx_2, \&callback2);
Net::SSLeay::CTX_set_default_passwd_cb_userdata($ctx_2, \$key_password);
Net::SSLeay::CTX_set_default_passwd_cb($ctx_3, \&callback3);
ok( Net::SSLeay::CTX_use_PrivateKey_file($ctx, $key_pem, &Net::SSLeay::FILETYPE_PEM),
'CTX_use_PrivateKey_file works with right passphrase and userdata' );
ok( Net::SSLeay::CTX_use_PrivateKey_file($ctx_2, $key_pem, &Net::SSLeay::FILETYPE_PEM),
'CTX_use_PrivateKey_file works with right passphrase and userdata' );
ok( Net::SSLeay::CTX_use_PrivateKey_file($ctx_3, $key_pem, &Net::SSLeay::FILETYPE_PEM),
'CTX_use_PrivateKey_file works with right passphrase and without userdata' );
ok( $cb_1_calls == 1
&& $cb_2_calls == 1
&& $cb_3_calls == 1,
'different cbs per ctx work' );
$key_password = \'incorrect';
ok( !Net::SSLeay::CTX_use_PrivateKey_file($ctx, $key_pem, &Net::SSLeay::FILETYPE_PEM),
'CTX_use_PrivateKey_file doesn\'t work with wrong passphrase' );
is($cb_1_calls, 2, 'callback called 2 times');