Annotation of embedaddon/axTLS/samples/perl/axssl.pl, revision 1.1.1.1

1.1       misho       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>