Crypt-MatrixSSL3
view release on metacpan or search on metacpan
t/matrixSslEncodeRehandshake.t view on Meta::CPAN
# diag "ALERTS: @Alert";
done_testing();
sub new {
my ($trustedCA, $cb) = @_;
lives_ok { $Server_Keys = Crypt::MatrixSSL3::Keys->new() }
'Keys->new (server)';
is PS_SUCCESS, $Server_Keys->load_rsa($certFile, $privFile, $privPass, undef),
'$Server_Keys->load_rsa';
lives_ok { $Server_SSL = Crypt::MatrixSSL3::Server->new($Server_Keys, undef) }
'Server->new';
lives_ok { $Client_Keys = Crypt::MatrixSSL3::Keys->new() }
'Keys->new (client)';
is PS_SUCCESS, $Client_Keys->load_rsa(undef, undef, undef, $trustedCA),
'$Client_Keys->load_rsa';
lives_ok { $Client_SSL = Crypt::MatrixSSL3::Client->new($Client_Keys, undef, undef, $cb, undef, undef, undef) }
'Client->new';
($client2server, $server2client) = (q{}, q{});
return;
}
sub handshake {
my ($client_rc, $server_rc);
while (1) {
$server_rc = _decode($Server_SSL, $client2server, $server2client);
$client_rc = _decode($Client_SSL, $server2client, $client2server);
last if $client_rc || $server_rc;
}
$server_rc = _decode($Server_SSL, $client2server, $server2client) if !defined $server_rc;
is 1, $server_rc, 'handshake complete (server)';
is 1, $client_rc, 'handshake complete (client)';
ok !length $client2server, 'client outbuf empty after handshake';
ok !length $server2client, 'server outbuf empty after handshake';
}
sub io {
my ($plaintext) = (!!$_[0]);
my $s = "Hello MatrixSSL!\0\n";
my $tmp = $s;
my $buf;
ok $Client_SSL->encode_to_outdata($s) > 0,
'encode_to_outdata (client)';
is $tmp, $s,
q{encode_to_outdata doesn't destroy input string};
is undef, _decode($Client_SSL, $server2client, $client2server);
ok length $client2server,
'got some outbuf (client)';
my $is_plaintext = $client2server =~ /\Q$s\E/;
is $is_plaintext, $plaintext,
'ssl'.($plaintext ? ' NOT ' : ' ').'encrypted';
is undef, _decode($Server_SSL, $client2server, $server2client, $buf);
is $buf, $s,
'decoded ok (server)';
ok !length $client2server,
'outbuf empty (client)';
ok !length $server2client,
'outbuf empty (server)';
}
sub fin {
undef $Server_SSL;
undef $Client_SSL;
undef $Server_Keys;
undef $Client_Keys;
ok 1, 'matrixSslClose';
}
###########
# Helpers #
###########
sub _decode {
my ($ssl) = @_; # other 3 params must be modified in place
while (length $_[1]) {
my $rc = $ssl->received_data($_[1], my $buf);
RC:
if ($rc == MATRIXSSL_REQUEST_SEND) { last }
elsif ($rc == MATRIXSSL_REQUEST_RECV) { next }
elsif ($rc == MATRIXSSL_HANDSHAKE_COMPLETE) { return 1 }
elsif ($rc == MATRIXSSL_RECEIVED_ALERT) { alert($buf); return -1 }
elsif ($rc == MATRIXSSL_APP_DATA) { $_[3].=$buf }
elsif ($rc == MATRIXSSL_SUCCESS) { last }
else { die error($rc)}
$rc = $ssl->processed_data($buf);
goto RC;
}
while (my $n = $ssl->get_outdata($_[2])) {
my $rc = $ssl->sent_data($n);
if ($rc == MATRIXSSL_REQUEST_SEND) { next }
elsif ($rc == MATRIXSSL_SUCCESS) { last }
elsif ($rc == MATRIXSSL_REQUEST_CLOSE) { return -1 }
elsif ($rc == MATRIXSSL_HANDSHAKE_COMPLETE) { return 1 }
else { die error($rc)}
}
return;
}
sub error {
my $rc = get_ssl_error($_[0]);
return sprintf "MatrixSSL error %d: %s\n", $rc, $rc;
}
sub alert {
my ($level, $descr) = get_ssl_alert($_[0]);
push @Alert, sprintf "MatrixSSL alert: level %d: %s, desc %d: %s", $level, $level, $descr, $descr;
return;
}
Crypt::MatrixSSL3::Close();
( run in 1.276 second using v1.01-cache-2.11-cpan-13bb782fe5a )