File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / axTLS / samples / perl / axssl.pl
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Sep 28 11:55:55 2012 UTC (12 years, 6 months ago) by misho
Branches: v1_4_8, MAIN
CVS tags: datecs, HEAD
axTLS

    1: #!/usr/bin/perl -w
    2: #
    3: # Copyright (c) 2007, Cameron Rich
    4: #
    5: # All rights reserved.
    6: #
    7: # Redistribution and use in source and binary forms, with or without
    8: # modification, are permitted provided that the following conditions are met:
    9: #
   10: # * Redistributions of source code must retain the above copyright notice,
   11: #   this list of conditions and the following disclaimer.
   12: # * Redistributions in binary form must reproduce the above copyright
   13: #   notice, this list of conditions and the following disclaimer in the
   14: #   documentation and/or other materials provided with the distribution.
   15: # * Neither the name of the axTLS project nor the names of its
   16: #   contributors may be used to endorse or promote products derived
   17: #   from this software without specific prior written permission.
   18: #
   19: # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   20: # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   21: # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
   22: # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   23: # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   24: # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
   25: # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   26: # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
   27: # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   28: # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   29: # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   30: #
   31: 
   32: #
   33: # Demonstrate the use of the axTLS library in Perl with a set of 
   34: # command-line parameters similar to openssl. In fact, openssl clients 
   35: # should be able to communicate with axTLS servers and visa-versa.
   36: #
   37: # This code has various bits enabled depending on the configuration. To enable
   38: # the most interesting version, compile with the 'full mode' enabled.
   39: #
   40: # To see what options you have, run the following:
   41: # > [perl] axssl s_server -?
   42: # > [perl] axssl s_client -?
   43: #
   44: # The axtls/axtlsp shared libraries must be in the same directory or be found 
   45: # by the OS. axtlsp.pm must be in this directory or be in @INC.
   46: #
   47: # Under Win32, ActivePerl was used (see
   48: # http://www.activestate.com/Products/ActivePerl/?mp=1)
   49: #
   50: use axtlsp;
   51: use IO::Socket;
   52: 
   53: # To get access to Win32 file descriptor stuff
   54: my $is_win32 = 0;
   55: 
   56: if ($^O eq "MSWin32")
   57: {
   58:     eval("use Win32API::File 0.08 qw( :ALL )");
   59:     $is_win32 = 1;
   60: }
   61: 
   62: use strict;
   63: 
   64: #
   65: # Win32 has some problems with socket handles
   66: #
   67: sub get_native_sock
   68: {
   69:     my ($sock) = @_;
   70:     return $is_win32 ? FdGetOsFHandle($sock) : $sock;
   71: }
   72: 
   73: # print version?
   74: if ($#ARGV == 0 && $ARGV[0] eq "version")
   75: {
   76:     printf("axssl.pl ".axtlsp::ssl_version()."\n");
   77:     exit 0;
   78: }
   79: 
   80: #
   81: # Main entry point. Doesn't do much except works out whether we are a client
   82: # or a server.
   83: #
   84: print_options($#ARGV > -1 ? $ARGV[0] : "")
   85:         if ($#ARGV < 0 || ($ARGV[0] ne "s_server" && $ARGV[0] ne "s_client"));
   86: 
   87: 
   88: # Cygwin/Win32 issue - flush our output continuously
   89: select STDOUT;
   90: local $|=1;
   91: 
   92: my $build_mode = axtlsp::ssl_get_config($axtlsp::SSL_BUILD_MODE);
   93: $ARGV[0] eq "s_server" ? do_server($build_mode) : do_client($build_mode);
   94: 
   95: #
   96: # Implement the SSL server logic. 
   97: #
   98: sub do_server
   99: {
  100:     my ($build_mode) = @_;
  101:     my $i = 1;
  102:     my $port = 4433;
  103:     my $options = $axtlsp::SSL_DISPLAY_CERTS;
  104:     my $quiet = 0;
  105:     my $password = undef;
  106:     my $private_key_file = undef;
  107:     my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET);
  108:     my $ca_cert_size = axtlsp::ssl_get_config(
  109:                         $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET);
  110:     my @cert;
  111:     my @ca_cert;
  112: 
  113:     while ($i <= $#ARGV)
  114:     {
  115:         if ($ARGV[$i] eq  "-accept")
  116:         {
  117:             print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
  118:             $port = $ARGV[++$i];
  119:         }
  120:         elsif ($ARGV[$i] eq "-quiet")
  121:         {
  122:             $quiet = 1;
  123:             $options &= ~$axtlsp::SSL_DISPLAY_CERTS;
  124:         }
  125:         elsif ($build_mode >= $axtlsp::SSL_BUILD_SERVER_ONLY)
  126:         {
  127:             if ($ARGV[$i] eq "-cert")
  128:             {
  129:                 print_server_options($build_mode, $ARGV[$i]) 
  130:                                     if $i >= $#ARGV || $#cert >= $cert_size-1;
  131: 
  132:                 push @cert,  $ARGV[++$i];
  133:             }
  134:             elsif ($ARGV[$i] eq "-key")
  135:             {
  136:                 print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
  137:                 $private_key_file = $ARGV[++$i];
  138:                 $options |= $axtlsp::SSL_NO_DEFAULT_KEY;
  139:             }
  140:             elsif ($ARGV[$i] eq "-pass")
  141:             {
  142:                 print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
  143:                 $password = $ARGV[++$i];
  144:             }
  145:             elsif ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_VERIFICATION)
  146:             {
  147:                 if ($ARGV[$i] eq "-verify")
  148:                 {
  149:                     $options |= $axtlsp::SSL_CLIENT_AUTHENTICATION;
  150:                 }
  151:                 elsif ($ARGV[$i] eq "-CAfile")
  152:                 {
  153:                     print_server_options($build_mode, $ARGV[$i])  
  154:                                 if $i >= $#ARGV || $#ca_cert >= $ca_cert_size-1;
  155:                     push @ca_cert, $ARGV[++$i];
  156:                 }
  157:                 elsif ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE)
  158:                 {
  159:                     if ($ARGV[$i] eq "-debug")
  160:                     {
  161:                         $options |= $axtlsp::SSL_DISPLAY_BYTES;
  162:                     }
  163:                     elsif ($ARGV[$i] eq "-state")
  164:                     {
  165:                         $options |= $axtlsp::SSL_DISPLAY_STATES;
  166:                     }
  167:                     elsif ($ARGV[$i] eq "-show-rsa")
  168:                     {
  169:                         $options |= $axtlsp::SSL_DISPLAY_RSA;
  170:                     }
  171:                     else
  172:                     {
  173:                         print_server_options($build_mode, $ARGV[$i]);
  174:                     }
  175:                 }
  176:                 else
  177:                 {
  178:                     print_server_options($build_mode, $ARGV[$i]);
  179:                 }
  180:             }
  181:             else 
  182:             {
  183:                 print_server_options($build_mode, $ARGV[$i]);
  184:             }
  185:         }
  186:         else 
  187:         {
  188:             print_server_options($build_mode, $ARGV[$i]);
  189:         }
  190: 
  191:         $i++;
  192:     }
  193: 
  194:     # Create socket for incoming connections
  195:     my $server_sock = IO::Socket::INET->new(Proto => 'tcp',
  196:                               LocalPort => $port,
  197:                               Listen => 1,
  198:                               Reuse => 1) or die $!;
  199: 
  200:     ###########################################################################
  201:     # This is where the interesting stuff happens. Up until now we've
  202:     # just been setting up sockets etc. Now we do the SSL handshake.
  203:     ###########################################################################
  204:     my $ssl_ctx = axtlsp::ssl_ctx_new($options, $axtlsp::SSL_DEFAULT_SVR_SESS);
  205:     die "Error: Server context is invalid" if not defined $ssl_ctx;
  206: 
  207:     if (defined $private_key_file)
  208:     {
  209:         my $obj_type = $axtlsp::SSL_OBJ_RSA_KEY;
  210: 
  211:         $obj_type = $axtlsp::SSL_OBJ_PKCS8 if $private_key_file =~ /.p8$/;
  212:         $obj_type = $axtlsp::SSL_OBJ_PKCS12 if $private_key_file =~ /.p12$/;
  213: 
  214:         die "Private key '$private_key_file' is undefined." if 
  215:                 axtlsp::ssl_obj_load($ssl_ctx, $obj_type,
  216:                         $private_key_file, $password);
  217:     }
  218: 
  219:     foreach (@cert)
  220:     {
  221:         die "Certificate '$_' is undefined." 
  222:             if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CERT, 
  223:                     $_, undef) != $axtlsp::SSL_OK;
  224:     }
  225: 
  226:     foreach (@ca_cert)
  227:     {
  228:         die "Certificate '$_' is undefined." 
  229:             if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CACERT, 
  230:                     $_, undef) != $axtlsp::SSL_OK;
  231:     }
  232: 
  233:     for (;;)
  234:     {
  235:         printf("ACCEPT\n") if not $quiet;
  236:         my $client_sock = $server_sock->accept;
  237:         my $native_sock = get_native_sock($client_sock->fileno);
  238: 
  239:         # This doesn't work in Win32 - need to get file descriptor from socket.
  240:         my $ssl = axtlsp::ssl_server_new($ssl_ctx, $native_sock);
  241: 
  242:         # do the actual SSL handshake
  243:         my $res;
  244:         my $buf;
  245:         my $connected = 0;
  246: 
  247:         while (1)
  248:         {
  249:             ($res, $buf) = axtlsp::ssl_read($ssl, undef);
  250:             last if $res < $axtlsp::SSL_OK;
  251: 
  252:             if ($res == $axtlsp::SSL_OK) # connection established and ok
  253:             {
  254:                 if (axtlsp::ssl_handshake_status($ssl) == $axtlsp::SSL_OK)
  255:                 {
  256:                     if (!$quiet && !$connected)
  257:                     {
  258:                         display_session_id($ssl);
  259:                         display_cipher($ssl);
  260:                     }
  261: 
  262:                     $connected = 1;
  263:                 }
  264:             }
  265: 
  266:             if ($res > $axtlsp::SSL_OK)
  267:             {
  268:                 printf($$buf);
  269:             }
  270:             elsif ($res < $axtlsp::SSL_OK)
  271:             {
  272:                 axtlsp::ssl_display_error($res) if not $quiet;
  273:                 last;
  274:             } 
  275:         }
  276: 
  277:         # client was disconnected or the handshake failed.
  278:         printf("CONNECTION CLOSED\n") if not $quiet;
  279:         axtlsp::ssl_free($ssl);
  280:         $client_sock->close;
  281:     }
  282: 
  283:     axtlsp::ssl_ctx_free($ssl_ctx);
  284: }
  285: 
  286: #
  287: # Implement the SSL client logic.
  288: #
  289: sub do_client
  290: {
  291:     my ($build_mode) = @_;
  292:     my $i = 1;
  293:     my $port = 4433;
  294:     my $options = $axtlsp::SSL_SERVER_VERIFY_LATER|$axtlsp::SSL_DISPLAY_CERTS;
  295:     my $private_key_file = undef;
  296:     my $reconnect = 0;
  297:     my $quiet = 0;
  298:     my $password = undef;
  299:     my @session_id;
  300:     my $host = "127.0.0.1";
  301:     my @cert;
  302:     my @ca_cert;
  303:     my $cert_size = axtlsp::ssl_get_config(
  304:             $axtlsp::SSL_MAX_CERT_CFG_OFFSET);
  305:     my $ca_cert_size = axtlsp::ssl_get_config(
  306:             $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET);
  307: 
  308:     while ($i <= $#ARGV)
  309:     {
  310:         if ($ARGV[$i] eq "-connect")
  311:         {
  312:             print_client_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
  313:             ($host, $port) = split(':', $ARGV[++$i]);
  314:         }
  315:         elsif ($ARGV[$i] eq "-cert")
  316:         {
  317:             print_client_options($build_mode, $ARGV[$i]) 
  318:                 if $i >= $#ARGV || $#cert >= $cert_size-1;
  319: 
  320:             push @cert, $ARGV[++$i];
  321:         }
  322:         elsif ($ARGV[$i] eq "-key")
  323:         {
  324:             print_client_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
  325:             $private_key_file = $ARGV[++$i];
  326:             $options |= $axtlsp::SSL_NO_DEFAULT_KEY;
  327:         }
  328:         elsif ($ARGV[$i] eq "-CAfile")
  329:         {
  330:             print_client_options($build_mode, $ARGV[$i]) 
  331:                 if $i >= $#ARGV || $#ca_cert >= $ca_cert_size-1;
  332: 
  333:             push @ca_cert, $ARGV[++$i];
  334:         }
  335:         elsif ($ARGV[$i] eq "-verify")
  336:         {
  337:             $options &= ~$axtlsp::SSL_SERVER_VERIFY_LATER;
  338:         }
  339:         elsif ($ARGV[$i] eq "-reconnect")
  340:         {
  341:             $reconnect = 4;
  342:         }
  343:         elsif ($ARGV[$i] eq "-quiet")
  344:         {
  345:             $quiet = 1;
  346:             $options &= ~$axtlsp::SSL_DISPLAY_CERTS;
  347:         }
  348:         elsif ($ARGV[$i] eq "-pass")
  349:         {
  350:             print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
  351:             $password = $ARGV[++$i];
  352:         }
  353:         elsif ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE)
  354:         {
  355:             if ($ARGV[$i] eq "-debug")
  356:             {
  357:                 $options |= $axtlsp::SSL_DISPLAY_BYTES;
  358:             }
  359:             elsif ($ARGV[$i] eq "-state")
  360:             {
  361:                 $options |= $axtlsp::SSL_DISPLAY_STATES;
  362:             }
  363:             elsif ($ARGV[$i] eq "-show-rsa")
  364:             {
  365:                 $options |= $axtlsp::SSL_DISPLAY_RSA;
  366:             }
  367:             else    # don't know what this is
  368:             {
  369:                 print_client_options($build_mode, $ARGV[$i]);
  370:             }
  371:         }
  372:         else    # don't know what this is
  373:         {
  374:             print_client_options($build_mode, $ARGV[$i]);
  375:         }
  376: 
  377:         $i++;
  378:     }
  379: 
  380:     my $client_sock = new IO::Socket::INET (
  381:                         PeerAddr => $host, PeerPort => $port, Proto => 'tcp')
  382:                     || die ("no socket: $!");
  383:     my $ssl;
  384:     my $res;
  385:     my $native_sock = get_native_sock($client_sock->fileno);
  386: 
  387:     printf("CONNECTED\n") if not $quiet;
  388: 
  389:     ###########################################################################
  390:     # This is where the interesting stuff happens. Up until now we've
  391:     # just been setting up sockets etc. Now we do the SSL handshake.
  392:     ###########################################################################
  393:     my $ssl_ctx = axtlsp::ssl_ctx_new($options, $axtlsp::SSL_DEFAULT_CLNT_SESS);
  394:     die "Error: Client context is invalid" if not defined $ssl_ctx;
  395: 
  396:     if (defined $private_key_file)
  397:     {
  398:         my $obj_type = $axtlsp::SSL_OBJ_RSA_KEY;
  399: 
  400:         $obj_type = $axtlsp::SSL_OBJ_PKCS8 if $private_key_file =~ /.p8$/;
  401:         $obj_type = $axtlsp::SSL_OBJ_PKCS12 if $private_key_file =~ /.p12$/;
  402: 
  403:         die "Private key '$private_key_file' is undefined." if 
  404:                 axtlsp::ssl_obj_load($ssl_ctx, $obj_type,
  405:                         $private_key_file, $password);
  406:     }
  407: 
  408:     foreach (@cert)
  409:     {
  410:         die "Certificate '$_' is undefined." 
  411:             if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CERT, 
  412:                     $_, undef) != $axtlsp::SSL_OK;
  413:     }
  414: 
  415:     foreach (@ca_cert)
  416:     {
  417:         die "Certificate '$_' is undefined." 
  418:             if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CACERT, 
  419:                     $_, undef) != $axtlsp::SSL_OK;
  420:     }
  421: 
  422:     # Try session resumption?
  423:     if ($reconnect)
  424:     {
  425:         my $session_id = undef;
  426:         my $sess_id_size = 0;
  427: 
  428:         while ($reconnect--)
  429:         {
  430:             $ssl = axtlsp::ssl_client_new($ssl_ctx, $native_sock, 
  431:                             $session_id, $sess_id_size);
  432: 
  433:             $res = axtlsp::ssl_handshake_status($ssl);
  434:             if ($res != $axtlsp::SSL_OK)
  435:             {
  436:                 axtlsp::ssl_display_error($res) if !$quiet;
  437:                 axtlsp::ssl_free($ssl);
  438:                 exit 1;
  439:             }
  440: 
  441:             display_session_id($ssl);
  442:             $session_id = axtlsp::ssl_get_session_id($ssl);
  443: 
  444:             if ($reconnect)
  445:             {
  446:                 axtlsp::ssl_free($ssl);
  447:                 $client_sock->close;
  448:                 $client_sock = new IO::Socket::INET (
  449:                         PeerAddr => $host, PeerPort => $port, Proto => 'tcp')
  450:                     || die ("no socket: $!");
  451: 
  452:             }
  453:         }
  454:     }
  455:     else
  456:     {
  457:         $ssl = axtlsp::ssl_client_new($ssl_ctx, $native_sock, undef, 0);
  458:     }
  459: 
  460:     # check the return status
  461:     $res = axtlsp::ssl_handshake_status($ssl);
  462:     if ($res != $axtlsp::SSL_OK)
  463:     {
  464:         axtlsp::ssl_display_error($res) if not $quiet;
  465:         exit 1;
  466:     }
  467: 
  468:     if (!$quiet)
  469:     {
  470:         my $common_name = axtlsp::ssl_get_cert_dn($ssl, 
  471:                     $axtlsp::SSL_X509_CERT_COMMON_NAME);
  472: 
  473:         printf("Common Name:\t\t\t%s\n", $common_name) if defined $common_name;
  474:         display_session_id($ssl);
  475:         display_cipher($ssl);
  476:     }
  477: 
  478:     while (<STDIN>)
  479:     {
  480:         my $cstring = pack("a*x", $_);   # add null terminator
  481:         $res = axtlsp::ssl_write($ssl, \$cstring, length($cstring));
  482:         if ($res < $axtlsp::SSL_OK)
  483:         {
  484:             axtlsp::ssl_display_error($res) if not $quiet;
  485:             last;
  486:         }
  487:     }
  488: 
  489:     axtlsp::ssl_ctx_free($ssl_ctx);
  490:     $client_sock->close;
  491: }
  492: 
  493: #
  494: # We've had some sort of command-line error. Print out the basic options.
  495: #
  496: sub print_options
  497: {
  498:     my ($option) = @_;
  499:     printf("axssl: Error: '%s' is an invalid command.\n", $option);
  500:     printf("usage: axssl [s_server|s_client|version] [args ...]\n");
  501:     exit 1;
  502: }
  503: 
  504: #
  505: # We've had some sort of command-line error. Print out the server options.
  506: #
  507: sub print_server_options
  508: {
  509:     my ($build_mode, $option) = @_;
  510:     my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET);
  511:     my $ca_cert_size = axtlsp::ssl_get_config(
  512:             $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET);
  513: 
  514:     printf("unknown option %s\n", $option);
  515:     printf("usage: s_server [args ...]\n");
  516:     printf(" -accept arg\t- port to accept on (default is 4433)\n");
  517:     printf(" -quiet\t\t- No server output\n");
  518: 
  519:     if ($build_mode >= $axtlsp::SSL_BUILD_SERVER_ONLY)
  520:     {
  521:         printf(" -cert arg\t- certificate file to add (in addition to default)".
  522:                                         " to chain -\n".
  523:           "\t\t  Can repeat up to %d times\n", $cert_size);
  524:         printf(" -key arg\t- Private key file to use - default DER format\n");
  525:         printf(" -pass\t\t- private key file pass phrase source\n");
  526:     }
  527: 
  528:     if ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_VERIFICATION)
  529:     {
  530:         printf(" -verify\t- turn on peer certificate verification\n");
  531:         printf(" -CAfile arg\t- Certificate authority - default DER format\n");
  532:         printf("\t\t  Can repeat up to %d times\n", $ca_cert_size);
  533:     }
  534: 
  535:     if ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE)
  536:     {
  537:         printf(" -debug\t\t- Print more output\n");
  538:         printf(" -state\t\t- Show state messages\n");
  539:         printf(" -show-rsa\t- Show RSA state\n");
  540:     }
  541: 
  542:     exit 1;
  543: }
  544: 
  545: #
  546: # We've had some sort of command-line error. Print out the client options.
  547: #
  548: sub print_client_options
  549: {
  550:     my ($build_mode, $option) = @_;
  551:     my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET);
  552:     my $ca_cert_size = axtlsp::ssl_get_config(
  553:             $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET);
  554: 
  555:     printf("unknown option %s\n", $option);
  556: 
  557:     if ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_CLIENT)
  558:     {
  559:         printf("usage: s_client [args ...]\n");
  560:         printf(" -connect host:port - who to connect to (default ".
  561:                 "is localhost:4433)\n");
  562:         printf(" -verify\t- turn on peer certificate verification\n");
  563:         printf(" -cert arg\t- certificate file to use - default DER format\n");
  564:         printf(" -key arg\t- Private key file to use - default DER format\n");
  565:         printf("\t\t  Can repeat up to %d times\n", $cert_size);
  566:         printf(" -CAfile arg\t- Certificate authority - default DER format\n");
  567:         printf("\t\t  Can repeat up to %d times\n", $ca_cert_size);
  568:         printf(" -quiet\t\t- No client output\n");
  569:         printf(" -pass\t\t- private key file pass phrase source\n");
  570:         printf(" -reconnect\t- Drop and re-make the connection ".
  571:                 "with the same Session-ID\n");
  572: 
  573:         if ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE)
  574:         {
  575:             printf(" -debug\t\t- Print more output\n");
  576:             printf(" -state\t\t- Show state messages\n");
  577:             printf(" -show-rsa\t- Show RSA state\n");
  578:         }
  579:     }
  580:     else
  581:     {
  582:         printf("Change configuration to allow this feature\n");
  583:     }
  584: 
  585:     exit 1;
  586: }
  587: 
  588: #
  589: # Display what cipher we are using 
  590: #
  591: sub display_cipher
  592: {
  593:     my ($ssl) = @_;
  594:     printf("CIPHER is ");
  595:     my $cipher_id = axtlsp::ssl_get_cipher_id($ssl);
  596: 
  597:     if ($cipher_id == $axtlsp::SSL_AES128_SHA)
  598:     {
  599:         printf("AES128-SHA");
  600:     }
  601:     elsif ($cipher_id == $axtlsp::SSL_AES256_SHA)
  602:     {
  603:         printf("AES256-SHA");
  604:     }
  605:     elsif ($axtlsp::SSL_RC4_128_SHA)
  606:     {
  607:         printf("RC4-SHA");
  608:     }
  609:     elsif ($axtlsp::SSL_RC4_128_MD5)
  610:     {
  611:         printf("RC4-MD5");
  612:     }
  613:     else 
  614:     {
  615:         printf("Unknown - %d", $cipher_id);
  616:     }
  617: 
  618:     printf("\n");
  619: }
  620: 
  621: #
  622: # Display what session id we have.
  623: #
  624: sub display_session_id
  625: {    
  626:     my ($ssl) = @_;
  627:     my $session_id = axtlsp::ssl_get_session_id($ssl);
  628:     if (length($$session_id) > 0)
  629:     {
  630:         printf("-----BEGIN SSL SESSION PARAMETERS-----\n");
  631:         printf(unpack("H*", $$session_id));
  632:         printf("\n-----END SSL SESSION PARAMETERS-----\n");
  633:     }
  634: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>