Annotation of embedaddon/axTLS/samples/perl/axssl.pl, revision 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>