luci-app-mwan3: add dependecy to size option
[project/luci.git] / libs / luci-lib-nixio / axTLS / samples / vbnet / axssl.vb
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