Annotation of embedaddon/axTLS/samples/csharp/axssl.cs, revision 1.1

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

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