Add axTLS sourcecode
[project/luci.git] / libs / 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