Debian lenny version packages
[pkg-perl] / deb-src / libnet-ssleay-perl / libnet-ssleay-perl-1.35 / examples / sslecho.pl
1 #!/usr/bin/perl -w
2 # sslecho.pl - Echo server using SSL
3 #
4 # Copyright (c) 1996,1998 Sampo Kellomaki <sampo@iki.fi>, All Rights Reserved.
5 # Date:   27.6.1996, 8.6.1998
6 # 7.12.2001, added more support for client side certificate testing --Sampo
7 # $Id: sslecho.pl,v 1.2 2001/12/08 17:43:14 sampo Exp $
8 #
9 # Usage: ./sslecho.pl *port* *cert.pem* *key.pem*
10 #
11 # This server always binds to localhost as this is all that is needed
12 # for tests.
13
14 die "Usage: ./sslecho.pl *port* *cert.pem* *key.pem*\n" unless $#ARGV == 2;
15 ($port, $cert_pem, $key_pem) = @ARGV;
16 $our_ip = "\x7F\0\0\x01";
17
18 $trace = 2;
19 use Socket;
20 use Net::SSLeay qw(sslcat die_now die_if_ssl_error);
21 $Net::SSLeay::trace = 3; # Super verbose debugging
22
23 #
24 # Create the socket and open a connection
25 #
26
27 $our_serv_params = pack ('S n a4 x8', &AF_INET, $port, $our_ip);
28 socket (S, &AF_INET, &SOCK_STREAM, 0)  or die "socket: $!";
29 bind (S, $our_serv_params)             or die "bind:   $! (port=$port)";
30 listen (S, 5)                          or die "listen: $!";
31
32 #
33 # Prepare SSLeay
34 #
35
36 Net::SSLeay::load_error_strings();
37 Net::SSLeay::ERR_load_crypto_strings();
38 Net::SSLeay::SSLeay_add_ssl_algorithms();
39 Net::SSLeay::randomize();
40
41 print "sslecho: Creating SSL context...\n" if $trace>1;
42 $ctx = Net::SSLeay::CTX_new () or die_now("CTX_new ($ctx): $!\n");
43 print "sslecho: Setting cert and RSA key...\n" if $trace>1;
44 Net::SSLeay::CTX_set_cipher_list($ctx,'ALL');
45 Net::SSLeay::set_cert_and_key($ctx, $cert_pem, $key_pem) or die "key";
46
47 while (1) {
48     
49     print "sslecho $$: Accepting connections...\n" if $trace>1;
50     ($addr = accept (NS, S)) or die "accept: $!";
51     $old_out = select (NS); $| = 1; select ($old_out);  # Piping hot!
52     
53     if ($trace) {
54         ($af,$client_port,$client_ip) = unpack('S n a4 x8',$addr);
55         @inetaddr = unpack('C4',$client_ip);
56         print "$af connection from " . join ('.', @inetaddr)
57             . ":$client_port\n" if $trace;;
58     }
59     
60     #
61     # Do SSL negotiation stuff
62     #
63
64     print "sslecho: Creating SSL session (cxt=`$ctx')...\n" if $trace>1;
65     $ssl = Net::SSLeay::new($ctx) or die_now("ssl new ($ssl): $!");
66
67     print "sslecho: Setting fd (ctx $ctx, con $ssl)...\n" if $trace>1;
68     Net::SSLeay::set_fd($ssl, fileno(NS));
69
70     print "sslecho: Entering SSL negotiation phase...\n" if $trace>1;
71     
72     Net::SSLeay::accept($ssl);
73     die_if_ssl_error("ssl_echo: ssl accept: ($!)");
74     
75     print "sslecho: Cipher `" . Net::SSLeay::get_cipher($ssl)
76         . "'\n" if $trace;
77     
78     #
79     # Connected. Exchange some data.
80     #
81     
82     $got = Net::SSLeay::ssl_read_all($ssl) or die "$$: ssl read failed";
83     print "sslecho $$: got " . length($got) . " bytes\n" if $trace==2;
84     print "sslecho: Got `$got' (" . length ($got) . " chars)\n" if $trace>2;
85     $got = uc $got;
86     if ($got eq 'CLIENT-CERT-TEST') {
87         $got .= Net::SSLeay::dump_peer_certificate($ssl) . "END CERT\n";
88     }
89     Net::SSLeay::ssl_write_all($ssl, $got) or die "$$: ssl write failed";
90     $got = '';  # in case it was huge
91     
92     print "sslecho: Tearing down the connection.\n\n" if $trace>1;
93     
94     Net::SSLeay::free ($ssl);
95     close NS;
96 }
97 Net::SSLeay::CTX_free ($ctx);
98 close S;
99
100 __END__