Annotation of embedaddon/axTLS/samples/csharp/axssl.cs, revision 1.1.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>