#!/usr/local/bin/perl
# minicli.pl - Sampo Kellomaki <sampo@iki.fi>

use Socket;
use Net::SSLeay;
Net::SSLeay::load_error_strings();
Net::SSLeay::SSLeay_add_ssl_algorithms();
Net::SSLeay::randomize();

$Net::SSLeay::trace = 3; # Super verbose debugging

($dest_serv, $port, $msg,  $prefciph) = @ARGV;      # Read command line
$port = getservbyname  ($port, 'tcp')   unless $port =~ /^\d+$/;
$dest_ip = gethostbyname ($dest_serv);
$dest_serv_params = sockaddr_in($port, $dest_ip);
$msg = "GET \n\r\n"						unless ("$msg");
$prefciph = "EDH-RSA-DES-CBC3-SHA"		unless ("$prefciph");

socket  (S, &AF_INET, &SOCK_STREAM, 0)  or die "socket: $!";
connect (S, $dest_serv_params)          or die "connect: $!";
select  (S); $| = 1; select (STDOUT);

# The network connection is now open, lets fire up SSL    

$ctx = Net::SSLeay::CTX_new() or die_now("Failed to create SSL_CTX $!");
$ssl = Net::SSLeay::new($ctx) or die_now("Failed to create SSL $!");
Net::SSLeay::set_fd($ssl, fileno(S));   # Must use fileno
Net::SSLeay::kssl_set_server($ssl, $dest_serv);

print "VRS kssl_show_kctx:\n";
Net::SSLeay::kssl_show_kctx($ssl);

$kctx = Net::SSLeay::kssl_get_kctx($ssl);
print "VRS kssl_ctx_show($kctx):\n";
Net::SSLeay::kssl_ctx_show($kctx);

  # Net::SSLeay::set_cipher_list($ssl, "KRB5-DES-CBC3-SHA");
#  for ($i=0; $i < 26; $i++)  {
#	  $sk = Net::SSLeay::get_cipher_list($ssl, $i);
#	  print "Net::SSLeay::get_cipher_list($i) = $sk\n";
#	  }
  # Net::SSLeay::CTX_set_cipher_list($ctx,'KRB5-DES-CBC3-SHA');
  # Net::SSLeay::CTX_set_cipher_list($ctx,'EDH-RSA-DES-CBC3-SHA');
  # Net::SSLeay::set_cipher_list($ssl, 'KRB5-DES-CBC3-MD5');
  Net::SSLeay::set_cipher_list($ssl, $prefciph);
  Net::SSLeay::CTX_set_cipher_list($ctx,$prefciph);
$res = Net::SSLeay::connect($ssl);
print "Cipher '" . Net::SSLeay::get_cipher($ssl) . "'\n";
## Net::SSLeay::kssl_ctx_setstring($kctx, KSSL_SERVER, $dest_serv);
## Net::SSLeay::kssl_ctx_setstring($kctx, 2, $dest_serv);

# Exchange data

$res = Net::SSLeay::write($ssl, $msg);  # Perl knows how long $msg is
shutdown S, 1;  # Half close --> No more output, sends EOF to server
$got = Net::SSLeay::read($ssl);         # Perl returns undef on failure
print $got;
print "\nFINISHED, CLOSING...\n\n";

Net::SSLeay::free ($ssl);               # Tear down connection
Net::SSLeay::CTX_free ($ctx);
close S;

__END__
