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

    1: '
    2: ' Copyright (c) 2007, Cameron Rich
    3: '
    4: ' All rights reserved.
    5: '
    6: ' Redistribution and use in source and binary forms, with or without
    7: ' modification, are permitted provided that the following conditions are met:
    8: '
    9: ' * Redistributions of source code must retain the above copyright notice,
   10: '   this list of conditions and the following disclaimer.
   11: ' * Redistributions in binary form must reproduce the above copyright
   12: '   notice, this list of conditions and the following disclaimer in the
   13: '   documentation and/or other materials provided with the distribution.
   14: ' * Neither the name of the axTLS project nor the names of its
   15: '   contributors may be used to endorse or promote products derived
   16: '   from this software without specific prior written permission.
   17: '
   18: ' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   19: ' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   20: ' LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
   21: ' A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   22: ' CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   23: ' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
   24: ' TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   25: ' DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
   26: ' OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   27: ' NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   28: ' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   29: '
   30: 
   31: '
   32: ' Demonstrate the use of the axTLS library in VB.NET with a set of 
   33: ' command-line parameters similar to openssl. In fact, openssl clients 
   34: ' should be able to communicate with axTLS servers and visa-versa.
   35: '
   36: ' This code has various bits enabled depending on the configuration. To enable
   37: ' the most interesting version, compile with the 'full mode' enabled.
   38: '
   39: ' To see what options you have, run the following:
   40: ' > axssl.vbnet.exe s_server -?
   41: ' > axssl.vbnet.exe s_client -?
   42: '
   43: ' The axtls shared library must be in the same directory or be found 
   44: ' by the OS.
   45: '
   46: 
   47: Imports System
   48: Imports System.Net
   49: Imports System.Net.Sockets
   50: Imports Microsoft.VisualBasic
   51: Imports axTLSvb
   52: 
   53: Public Class axssl
   54:     ' 
   55:     ' do_server()
   56:     '
   57:     Public Sub do_server(ByVal build_mode As Integer, _
   58:                                         ByVal args() As String)
   59:         Dim i As Integer = 1
   60:         Dim port As Integer = 4433
   61:         Dim options As Integer = axtls.SSL_DISPLAY_CERTS
   62:         Dim quiet As Boolean = False
   63:         Dim password As String = Nothing
   64:         Dim private_key_file As String = Nothing
   65: 
   66:         ' organise the cert/ca_cert lists 
   67:         Dim cert_size As Integer = SSLUtil.MaxCerts()
   68:         Dim ca_cert_size As Integer = SSLUtil.MaxCACerts()
   69:         Dim cert(cert_size) As String
   70:         Dim ca_cert(ca_cert_size) As String
   71:         Dim cert_index As Integer = 0
   72:         Dim ca_cert_index As Integer = 0
   73: 
   74:         While i < args.Length
   75:             If args(i) = "-accept" Then
   76:                 If i >= args.Length-1
   77:                     print_server_options(build_mode, args(i))
   78:                 End If
   79: 
   80:                 i += 1
   81:                 port = Int32.Parse(args(i))
   82:             ElseIf args(i) = "-quiet"
   83:                 quiet = True
   84:                 options = options And Not axtls.SSL_DISPLAY_CERTS
   85:             ElseIf build_mode >= axtls.SSL_BUILD_SERVER_ONLY
   86:                 If args(i) = "-cert"
   87:                     If i >= args.Length-1 Or cert_index >= cert_size
   88:                         print_server_options(build_mode, args(i))
   89:                     End If
   90: 
   91:                     i += 1
   92:                     cert(cert_index) = args(i)
   93:                     cert_index += 1
   94:                 ElseIf args(i) = "-key"
   95:                     If i >= args.Length-1
   96:                         print_server_options(build_mode, args(i))
   97:                     End If
   98: 
   99:                     i += 1
  100:                     private_key_file = args(i)
  101:                     options = options Or axtls.SSL_NO_DEFAULT_KEY
  102:                 ElseIf args(i) = "-pass"
  103:                     If i >= args.Length-1
  104:                         print_server_options(build_mode, args(i))
  105:                     End If
  106: 
  107:                     i += 1
  108:                     password = args(i)
  109:                 ElseIf build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION
  110:                     If args(i) = "-verify" Then
  111:                         options = options Or axtls.SSL_CLIENT_AUTHENTICATION
  112:                     ElseIf args(i) = "-CAfile"
  113:                         If i >= args.Length-1 Or _
  114:                                     ca_cert_index >= ca_cert_size Then
  115:                             print_server_options(build_mode, args(i))
  116:                         End If
  117: 
  118:                         i += 1
  119:                         ca_cert(ca_cert_index) = args(i)
  120:                         ca_cert_index += 1
  121:                     ElseIf build_mode = axtls.SSL_BUILD_FULL_MODE
  122:                         If args(i) = "-debug" Then
  123:                             options = options Or axtls.SSL_DISPLAY_BYTES
  124:                         ElseIf args(i) = "-state"
  125:                             options = options Or axtls.SSL_DISPLAY_STATES
  126:                         ElseIf args(i) = "-show-rsa"
  127:                             options = options Or axtls.SSL_DISPLAY_RSA
  128:                         Else
  129:                             print_server_options(build_mode, args(i))
  130:                         End If
  131:                     Else
  132:                         print_server_options(build_mode, args(i))
  133:                     End If
  134:                 Else
  135:                     print_server_options(build_mode, args(i))
  136:                 End If
  137:             End If
  138: 
  139:             i += 1
  140:         End While
  141: 
  142:         ' Create socket for incoming connections
  143:         Dim ep As IPEndPoint = New IPEndPoint(IPAddress.Any, port)
  144:         Dim server_sock As TcpListener = New TcpListener(ep)
  145:         server_sock.Start()      
  146: 
  147:         '*********************************************************************
  148:         ' This is where the interesting stuff happens. Up until now we've
  149:         ' just been setting up sockets etc. Now we do the SSL handshake.
  150:         '*********************************************************************/
  151:         Dim ssl_ctx As SSLServer = New SSLServer(options, _
  152:                 axtls.SSL_DEFAULT_SVR_SESS)
  153: 
  154:         If ssl_ctx Is Nothing Then
  155:             Console.Error.WriteLine("Error: Server context is invalid")
  156:             Environment.Exit(1)
  157:         End If
  158: 
  159:         If private_key_file <> Nothing Then
  160:             Dim obj_type As Integer = axtls.SSL_OBJ_RSA_KEY
  161: 
  162:             If private_key_file.EndsWith(".p8") Then
  163:                 obj_type = axtls.SSL_OBJ_PKCS8
  164:             Else If (private_key_file.EndsWith(".p12"))
  165:                 obj_type = axtls.SSL_OBJ_PKCS12
  166:             End If
  167: 
  168:             If ssl_ctx.ObjLoad(obj_type, private_key_file, _
  169:                                             password) <> axtls.SSL_OK Then
  170:                 Console.Error.WriteLine("Error: Private key '" & _
  171:                         private_key_file & "' is undefined.")
  172:                 Environment.Exit(1)
  173:             End If
  174:         End If
  175: 
  176:         For i = 0 To cert_index-1
  177:             If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT, _
  178:                             cert(i), Nothing) <> axtls.SSL_OK Then
  179:                 Console.WriteLine("Certificate '" & cert(i) & _
  180:                         "' is undefined.")
  181:                 Environment.Exit(1)
  182:             End If
  183:         Next
  184: 
  185:         For i = 0 To ca_cert_index-1
  186:             If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT, _
  187:                             ca_cert(i), Nothing) <> axtls.SSL_OK Then
  188:                 Console.WriteLine("Certificate '" & ca_cert(i) & _
  189:                         "' is undefined.")
  190:                 Environment.Exit(1)
  191:             End If
  192:         Next
  193: 
  194:         Dim buf As Byte() = Nothing
  195:         Dim res As Integer
  196:         Dim ssl As SSL
  197: 
  198:         While 1
  199:             If Not quiet Then
  200:                 Console.WriteLine("ACCEPT")
  201:             End If
  202: 
  203:             Dim client_sock As Socket = server_sock.AcceptSocket()
  204: 
  205:             ssl = ssl_ctx.Connect(client_sock)
  206: 
  207:             ' do the actual SSL handshake 
  208:             While 1
  209:                 res = ssl_ctx.Read(ssl, buf)
  210:                 If  res <> axtls.SSL_OK Then
  211:                     Exit While
  212:                 End If
  213: 
  214:                 ' check when the connection has been established 
  215:                 If ssl.HandshakeStatus() = axtls.SSL_OK
  216:                     Exit While
  217:                 End If
  218: 
  219:                 ' could do something else here 
  220:             End While
  221: 
  222:             If res = axtls.SSL_OK Then  ' connection established and ok
  223:                 If Not quiet
  224:                     display_session_id(ssl)
  225:                     display_cipher(ssl)
  226:                 End If
  227: 
  228:                 ' now read (and display) whatever the client sends us
  229:                 While 1
  230:                     ' keep reading until we get something interesting 
  231:                     While 1
  232:                         res = ssl_ctx.Read(ssl, buf)
  233:                         If res <> axtls.SSL_OK Then
  234:                             Exit While
  235:                         End If
  236: 
  237:                         ' could do something else here
  238:                     End While
  239: 
  240:                     If res < axtls.SSL_OK
  241:                         If Not quiet
  242:                             Console.WriteLine("CONNECTION CLOSED")
  243:                         End If
  244: 
  245:                         Exit While
  246:                     End If
  247: 
  248:                     ' convert to String 
  249:                     Dim str(res) As Char
  250:                     For i = 0 To res-1
  251:                         str(i) = Chr(buf(i))
  252:                     Next
  253: 
  254:                     Console.Write(str)
  255:                 End While
  256:             ElseIf Not quiet
  257:                 SSLUtil.DisplayError(res)
  258:             End If
  259: 
  260:             ' client was disconnected or the handshake failed. */
  261:             ssl.Dispose()
  262:             client_sock.Close()
  263:         End While
  264: 
  265:         ssl_ctx.Dispose()
  266:     End Sub
  267: 
  268:     ' 
  269:     ' do_client()
  270:     '
  271:     Public Sub do_client(ByVal build_mode As Integer, _
  272:                                     ByVal args() As String)
  273: 
  274:         If build_mode < axtls.SSL_BUILD_ENABLE_CLIENT Then
  275:             print_client_options(build_mode, args(1))
  276:         End If
  277: 
  278:         Dim i As Integer = 1
  279:         Dim res As Integer
  280:         Dim port As Integer = 4433
  281:         Dim quiet As Boolean = False
  282:         Dim password As String = Nothing
  283:         Dim reconnect As Integer = 0
  284:         Dim private_key_file As String = Nothing
  285:         Dim hostname As String = "127.0.0.1"
  286: 
  287:         ' organise the cert/ca_cert lists
  288:         Dim ssl As SSL = Nothing
  289:         Dim cert_size As Integer = SSLUtil.MaxCerts()
  290:         Dim ca_cert_size As Integer = SSLUtil.MaxCACerts()
  291:         Dim cert(cert_size) As String
  292:         Dim ca_cert(ca_cert_size) As String
  293:         Dim cert_index As Integer = 0
  294:         Dim ca_cert_index As Integer = 0
  295: 
  296:         Dim options As Integer = _
  297:                     axtls.SSL_SERVER_VERIFY_LATER Or axtls.SSL_DISPLAY_CERTS
  298:         Dim session_id As Byte() = Nothing
  299: 
  300:         While i < args.Length
  301:             If args(i) = "-connect" Then
  302:                 Dim host_port As String
  303: 
  304:                 If i >= args.Length-1
  305:                     print_client_options(build_mode, args(i))
  306:                 End If
  307: 
  308:                 i += 1
  309:                 host_port = args(i)
  310: 
  311:                 Dim index_colon As Integer = host_port.IndexOf(":"C)
  312:                 If index_colon < 0 Then 
  313:                     print_client_options(build_mode, args(i))
  314:                 End If
  315: 
  316:                 hostname = New String(host_port.ToCharArray(), _
  317:                         0, index_colon)
  318:                 port = Int32.Parse(New String(host_port.ToCharArray(), _
  319:                             index_colon+1, host_port.Length-index_colon-1))
  320:             ElseIf args(i) = "-cert"
  321:                 If i >= args.Length-1 Or cert_index >= cert_size Then
  322:                     print_client_options(build_mode, args(i))
  323:                 End If
  324: 
  325:                 i += 1
  326:                 cert(cert_index) = args(i)
  327:                 cert_index += 1
  328:             ElseIf args(i) = "-key"
  329:                 If i >= args.Length-1
  330:                     print_client_options(build_mode, args(i))
  331:                 End If
  332: 
  333:                 i += 1
  334:                 private_key_file = args(i)
  335:                 options = options Or axtls.SSL_NO_DEFAULT_KEY
  336:             ElseIf args(i) = "-CAfile"
  337:                 If i >= args.Length-1 Or ca_cert_index >= ca_cert_size
  338:                     print_client_options(build_mode, args(i))
  339:                 End If
  340: 
  341:                 i += 1
  342:                 ca_cert(ca_cert_index) = args(i)
  343:                 ca_cert_index += 1
  344:             ElseIf args(i) = "-verify"
  345:                 options = options And Not axtls.SSL_SERVER_VERIFY_LATER
  346:             ElseIf args(i) = "-reconnect"
  347:                 reconnect = 4
  348:             ElseIf args(i) = "-quiet"
  349:                 quiet = True
  350:                 options = options And  Not axtls.SSL_DISPLAY_CERTS
  351:             ElseIf args(i) = "-pass"
  352:                 If i >= args.Length-1
  353:                     print_client_options(build_mode, args(i))
  354:                 End If
  355: 
  356:                 i += 1
  357:                 password = args(i)
  358:             ElseIf build_mode = axtls.SSL_BUILD_FULL_MODE
  359:                 If args(i) = "-debug" Then
  360:                     options = options Or axtls.SSL_DISPLAY_BYTES
  361:                 ElseIf args(i) = "-state"
  362:                     options = options Or axtls.SSL_DISPLAY_STATES
  363:                 ElseIf args(i) = "-show-rsa"
  364:                     options = options Or axtls.SSL_DISPLAY_RSA
  365:                 Else
  366:                     print_client_options(build_mode, args(i))
  367:                 End If
  368:             Else    ' don't know what this is 
  369:                 print_client_options(build_mode, args(i))
  370:             End If
  371: 
  372:             i += 1
  373:         End While
  374: 
  375:         'Dim hostInfo As IPHostEntry = Dns.Resolve(hostname)
  376:         Dim hostInfo As IPHostEntry = Dns.GetHostEntry(hostname)
  377:         Dim  addresses As IPAddress() = hostInfo.AddressList
  378:         Dim ep As IPEndPoint = New IPEndPoint(addresses(0), port) 
  379:         Dim client_sock As Socket = New Socket(AddressFamily.InterNetwork, _
  380:                 SocketType.Stream, ProtocolType.Tcp)
  381:         client_sock.Connect(ep)
  382: 
  383:         If Not client_sock.Connected Then
  384:             Console.WriteLine("could not connect")
  385:             Environment.Exit(1)
  386:         End If
  387: 
  388:         If Not quiet Then
  389:             Console.WriteLine("CONNECTED")
  390:         End If
  391: 
  392:         '*********************************************************************
  393:         ' This is where the interesting stuff happens. Up until now we've
  394:         ' just been setting up sockets etc. Now we do the SSL handshake.
  395:         '*********************************************************************/
  396:         Dim ssl_ctx As SSLClient = New SSLClient(options, _
  397:                 axtls.SSL_DEFAULT_CLNT_SESS)
  398: 
  399:         If ssl_ctx Is Nothing Then
  400:             Console.Error.WriteLine("Error: Client context is invalid")
  401:             Environment.Exit(1)
  402:         End If
  403: 
  404:         If private_key_file <> Nothing Then
  405:             Dim obj_type As Integer = axtls.SSL_OBJ_RSA_KEY
  406: 
  407:             If private_key_file.EndsWith(".p8") Then
  408:                 obj_type = axtls.SSL_OBJ_PKCS8
  409:             Else If (private_key_file.EndsWith(".p12"))
  410:                 obj_type = axtls.SSL_OBJ_PKCS12
  411:             End If
  412: 
  413:             If ssl_ctx.ObjLoad(obj_type, private_key_file, _
  414:                                             password) <> axtls.SSL_OK Then
  415:                 Console.Error.WriteLine("Error: Private key '" & _
  416:                         private_key_file & "' is undefined.")
  417:                 Environment.Exit(1)
  418:             End If
  419:         End If
  420: 
  421:         For i = 0 To cert_index-1
  422:             If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT, _
  423:                             cert(i), Nothing) <> axtls.SSL_OK Then
  424:                 Console.WriteLine("Certificate '" & cert(i) & _
  425:                         "' is undefined.")
  426:                 Environment.Exit(1)
  427:             End If
  428:         Next
  429: 
  430:         For i = 0 To ca_cert_index-1
  431:             If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT, _
  432:                             ca_cert(i), Nothing) <> axtls.SSL_OK Then
  433:                 Console.WriteLine("Certificate '" & ca_cert(i) & _
  434:                         "' is undefined.")
  435:                 Environment.Exit(1)
  436:             End If
  437:         Next
  438: 
  439:         ' Try session resumption?
  440:         If reconnect > 0 Then
  441:             While reconnect > 0
  442:                 reconnect -= 1
  443:                 ssl = ssl_ctx.Connect(client_sock, session_id)
  444: 
  445:                 res = ssl.HandshakeStatus()
  446:                 If res <> axtls.SSL_OK Then
  447:                     If Not quiet Then
  448:                         SSLUtil.DisplayError(res)
  449:                     End If
  450: 
  451:                     ssl.Dispose()
  452:                     Environment.Exit(1)
  453:                 End If
  454: 
  455:                 display_session_id(ssl)
  456:                 session_id = ssl.GetSessionId()
  457: 
  458:                 If reconnect > 0 Then
  459:                     ssl.Dispose()
  460:                     client_sock.Close()
  461:                     
  462:                     ' and reconnect
  463:                     client_sock = New Socket(AddressFamily.InterNetwork, _
  464:                         SocketType.Stream, ProtocolType.Tcp)
  465:                     client_sock.Connect(ep)
  466:                 End If
  467:             End While
  468:         Else
  469:             ssl = ssl_ctx.Connect(client_sock, Nothing)
  470:         End If
  471: 
  472:         ' check the return status 
  473:         res = ssl.HandshakeStatus()
  474:         If res <> axtls.SSL_OK Then
  475:             If Not quiet Then
  476:                 SSLUtil.DisplayError(res)
  477:             End If
  478: 
  479:             Environment.Exit(1)
  480:         End If
  481: 
  482:         If Not quiet Then
  483:             Dim common_name As String = _
  484:                 ssl.GetCertificateDN(axtls.SSL_X509_CERT_COMMON_NAME)
  485: 
  486:             If common_name <> Nothing
  487:                 Console.WriteLine("Common Name:" & _
  488:                         ControlChars.Tab & ControlChars.Tab & _
  489:                         ControlChars.Tab & common_name)
  490:             End If
  491: 
  492:             display_session_id(ssl)
  493:             display_cipher(ssl)
  494:         End If
  495: 
  496:         While (1)
  497:             Dim user_input As String = Console.ReadLine()
  498: 
  499:             If user_input = Nothing Then
  500:                 Exit While
  501:             End If
  502: 
  503:             Dim buf(user_input.Length+1) As Byte
  504:             buf(buf.Length-2) = Asc(ControlChars.Lf) ' add the carriage return
  505:             buf(buf.Length-1) = 0                    ' null terminate 
  506: 
  507:             For i = 0 To user_input.Length-1
  508:                 buf(i) = Asc(user_input.Chars(i))
  509:             Next
  510: 
  511:             res = ssl_ctx.Write(ssl, buf, buf.Length)
  512:             If res < axtls.SSL_OK Then
  513:                 If Not quiet Then
  514:                     SSLUtil.DisplayError(res)
  515:                 End If
  516: 
  517:                 Exit While
  518:             End If
  519:         End While
  520: 
  521:         ssl_ctx.Dispose()
  522:     End Sub
  523: 
  524:     '
  525:     ' Display what cipher we are using
  526:     '
  527:     Private Sub display_cipher(ByVal ssl As SSL)
  528:         Console.Write("CIPHER is ")
  529: 
  530:         Select ssl.GetCipherId()
  531:             Case axtls.SSL_AES128_SHA
  532:                 Console.WriteLine("AES128-SHA")
  533: 
  534:             Case axtls.SSL_AES256_SHA
  535:                 Console.WriteLine("AES256-SHA")
  536: 
  537:             Case axtls.SSL_RC4_128_SHA
  538:                 Console.WriteLine("RC4-SHA")
  539: 
  540:             Case axtls.SSL_RC4_128_MD5
  541:                 Console.WriteLine("RC4-MD5")
  542: 
  543:             Case Else
  544:                 Console.WriteLine("Unknown - " & ssl.GetCipherId())
  545:         End Select
  546:     End Sub
  547: 
  548:     '
  549:     ' Display what session id we have.
  550:     '
  551:     Private Sub display_session_id(ByVal ssl As SSL)
  552:         Dim session_id As Byte() = ssl.GetSessionId()
  553: 
  554:         If session_id.Length > 0 Then
  555:             Console.WriteLine("-----BEGIN SSL SESSION PARAMETERS-----")
  556:             Dim b As Byte
  557:             For Each b In session_id
  558:                 Console.Write("{0:x02}", b)
  559:             Next
  560: 
  561:             Console.WriteLine()
  562:             Console.WriteLine("-----END SSL SESSION PARAMETERS-----")
  563:         End If
  564:     End Sub
  565: 
  566:     ' 
  567:     ' We've had some sort of command-line error. Print out the basic options.
  568:     '
  569:     Public Sub print_options(ByVal options As String)
  570:         Console.WriteLine("axssl: Error: '" & options & _
  571:                 "' is an invalid command.")
  572:         Console.WriteLine("usage: axssl.vbnet [s_server|s_client|" & _
  573:                 "version] [args ...]")
  574:         Environment.Exit(1)
  575:     End Sub
  576: 
  577:     ' 
  578:     ' We've had some sort of command-line error. Print out the server options.
  579:     '
  580:     Private Sub print_server_options(ByVal build_mode As Integer, _
  581:                                     ByVal options As String)
  582:         Dim cert_size As Integer = SSLUtil.MaxCerts()
  583:         Dim ca_cert_size As Integer = SSLUtil.MaxCACerts()
  584: 
  585:         Console.WriteLine("unknown option " & options)
  586:         Console.WriteLine("usage: s_server [args ...]")
  587:         Console.WriteLine(" -accept arg" & ControlChars.Tab & _
  588:                 "- port to accept on (default is 4433)")
  589:         Console.WriteLine(" -quiet" & ControlChars.Tab & ControlChars.Tab & _
  590:                 "- No server output")
  591:         If build_mode >= axtls.SSL_BUILD_SERVER_ONLY 
  592:             Console.WriteLine(" -cert arg" & ControlChars.Tab & _
  593:                "- certificate file to add (in addition to default) to chain -")
  594:             Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _
  595:                     "  Can repeat up to " & cert_size & " times")
  596:             Console.WriteLine(" -key arg" & ControlChars.Tab & _
  597:                         "- Private key file to use")
  598:             Console.WriteLine(" -pass" & ControlChars.Tab & ControlChars.Tab & _
  599:                     "- private key file pass phrase source")
  600:         End If
  601: 
  602:         If build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION
  603:             Console.WriteLine(" -verify" & ControlChars.Tab & _
  604:                     "- turn on peer certificate verification")
  605:             Console.WriteLine(" -CAfile arg" & ControlChars.Tab & _
  606:                     "- Certificate authority")
  607:             Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _
  608:                     "  Can repeat up to " & ca_cert_size & " times")
  609:         End If
  610: 
  611:         If build_mode = axtls.SSL_BUILD_FULL_MODE
  612:             Console.WriteLine(" -debug" & _
  613:                     ControlChars.Tab & ControlChars.Tab & _
  614:                     "- Print more output")
  615:             Console.WriteLine(" -state" & _
  616:                     ControlChars.Tab & ControlChars.Tab & _
  617:                     "- Show state messages")
  618:             Console.WriteLine(" -show-rsa" & _
  619:                     ControlChars.Tab & "- Show RSA state")
  620:         End If
  621: 
  622:         Environment.Exit(1)
  623:     End Sub
  624: 
  625:     '
  626:     ' We've had some sort of command-line error. Print out the client options.
  627:     '
  628:     Private Sub print_client_options(ByVal build_mode As Integer, _
  629:                                                 ByVal options As String)
  630:         Dim cert_size As Integer = SSLUtil.MaxCerts()
  631:         Dim ca_cert_size As Integer = SSLUtil.MaxCACerts()
  632: 
  633:         Console.WriteLine("unknown option " & options)
  634: 
  635:         If build_mode >= axtls.SSL_BUILD_ENABLE_CLIENT Then
  636:             Console.WriteLine("usage: s_client [args ...]")
  637:             Console.WriteLine(" -connect host:port - who to connect to " & _
  638:                     "(default is localhost:4433)")
  639:             Console.WriteLine(" -verify" & ControlChars.Tab & _
  640:                     "- turn on peer certificate verification")
  641:             Console.WriteLine(" -cert arg" & ControlChars.Tab & _
  642:                     "- certificate file to use")
  643:             Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _
  644:                     "  Can repeat up to " & cert_size & " times")
  645:             Console.WriteLine(" -key arg" & ControlChars.Tab & _
  646:                     "- Private key file to use")
  647:             Console.WriteLine(" -CAfile arg" & ControlChars.Tab & _
  648:                     "- Certificate authority")
  649:             Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _
  650:                     "  Can repeat up to " & ca_cert_size & " times")
  651:             Console.WriteLine(" -quiet" & _
  652:                     ControlChars.Tab & ControlChars.Tab & "- No client output")
  653:             Console.WriteLine(" -pass" & ControlChars.Tab & _
  654:                     ControlChars.Tab & _
  655:                     "- private key file pass phrase source")
  656:             Console.WriteLine(" -reconnect" & ControlChars.Tab & _
  657:                     "- Drop and re-make the " & _
  658:                     "connection with the same Session-ID")
  659: 
  660:             If build_mode = axtls.SSL_BUILD_FULL_MODE Then
  661:                 Console.WriteLine(" -debug" & _
  662:                         ControlChars.Tab & ControlChars.Tab & _
  663:                         "- Print more output")
  664:                 Console.WriteLine(" -state" & _
  665:                         ControlChars.Tab & ControlChars.Tab & _
  666:                         "- Show state messages")
  667:                 Console.WriteLine(" -show-rsa" & ControlChars.Tab & _
  668:                         "- Show RSA state")
  669:             End If
  670:         Else 
  671:             Console.WriteLine("Change configuration to allow this feature")
  672:         End If
  673: 
  674:         Environment.Exit(1)
  675:     End Sub
  676: 
  677: End Class
  678: 
  679: Public Module MyMain
  680:     Function Main(ByVal args() As String) As Integer
  681:         Dim runner As axssl = New axssl()
  682: 
  683:         If args.Length = 1 And args(0) = "version" Then
  684:            Console.WriteLine("axssl.vbnet " & SSLUtil.Version())
  685:             Environment.Exit(0)
  686:         End If
  687: 
  688:         If args.Length < 1 
  689:             runner.print_options("")
  690:         ElseIf args(0) <> "s_server" And args(0) <> "s_client"
  691:             runner.print_options(args(0))
  692:         End If
  693: 
  694:         Dim build_mode As Integer = SSLUtil.BuildMode()
  695: 
  696:         If args(0) = "s_server" Then
  697:             runner.do_server(build_mode, args)
  698:         Else
  699:             runner.do_client(build_mode, args)
  700:         End If
  701:     End Function
  702: End Module

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