Annotation of embedaddon/axTLS/samples/java/axssl.java, 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 Java 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:  * This code has various bits enabled depending on the configuration. To enable
        !            36:  * the most interesting version, compile with the 'full mode' enabled.
        !            37:  *
        !            38:  * To see what options you have, run the following:
        !            39:  * > java -jar axtls.jar s_server -?
        !            40:  * > java -jar axtls.jar s_client -?
        !            41:  *
        !            42:  * The axtls/axtlsj shared libraries must be in the same directory or be found 
        !            43:  * by the OS.
        !            44:  */
        !            45: 
        !            46: import java.io.*;
        !            47: import java.util.*;
        !            48: import java.net.*;
        !            49: import axTLSj.*;
        !            50: 
        !            51: public class axssl
        !            52: {
        !            53:    /*
        !            54:      * Main()
        !            55:      */
        !            56:     public static void main(String[] args)
        !            57:     {
        !            58:         if (args.length == 1 && args[0].equals("version"))
        !            59:         {
        !            60:             System.out.println("axtls.jar " + SSLUtil.version());
        !            61:             System.exit(0);
        !            62:         }
        !            63: 
        !            64:         axssl runner = new axssl();
        !            65: 
        !            66:         try
        !            67:         {
        !            68:             if (args.length < 1 || 
        !            69:                     (!args[0].equals("s_server") &&
        !            70:                      !args[0].equals("s_client")))
        !            71:             {
        !            72:                 runner.print_options(args.length > 0 ? args[0] : "");
        !            73:             }
        !            74: 
        !            75:             int build_mode = SSLUtil.buildMode();
        !            76: 
        !            77:             if (args[0].equals("s_server"))
        !            78:                 runner.do_server(build_mode, args);
        !            79:             else 
        !            80:                 runner.do_client(build_mode, args);
        !            81:         }
        !            82:         catch (Exception e) 
        !            83:         {
        !            84:             System.out.println(e);
        !            85:         }
        !            86:     }
        !            87: 
        !            88:     /*
        !            89:      * do_server()
        !            90:      */
        !            91:     private void do_server(int build_mode, String[] args)
        !            92:                     throws Exception
        !            93:     {
        !            94:         int i = 1;
        !            95:         int port = 4433;
        !            96:         int options = axtlsj.SSL_DISPLAY_CERTS;
        !            97:         boolean quiet = false;
        !            98:         String password = null;
        !            99:         String private_key_file = null;
        !           100: 
        !           101:         /* organise the cert/ca_cert lists */
        !           102:         int cert_size = SSLUtil.maxCerts();
        !           103:         int ca_cert_size = SSLUtil.maxCACerts();
        !           104:         String[] cert = new String[cert_size];
        !           105:         String[] ca_cert = new String[ca_cert_size];
        !           106:         int cert_index = 0;
        !           107:         int ca_cert_index = 0;
        !           108: 
        !           109:         while (i < args.length)
        !           110:         {
        !           111:             if (args[i].equals("-accept"))
        !           112:             {
        !           113:                 if (i >= args.length-1)
        !           114:                 {
        !           115:                     print_server_options(build_mode, args[i]);
        !           116:                 }
        !           117: 
        !           118:                 port = Integer.parseInt(args[++i]);
        !           119:             }
        !           120:             else if (args[i].equals("-quiet"))
        !           121:             {
        !           122:                 quiet = true;
        !           123:                 options &= ~(int)axtlsj.SSL_DISPLAY_CERTS;
        !           124:             }
        !           125:             else if (build_mode >= axtlsj.SSL_BUILD_SERVER_ONLY)
        !           126:             {
        !           127:                 if (args[i].equals("-cert"))
        !           128:                 {
        !           129:                     if (i >= args.length-1 || cert_index >= cert_size)
        !           130:                     {
        !           131:                         print_server_options(build_mode, args[i]);
        !           132:                     }
        !           133: 
        !           134:                     cert[cert_index++] = args[++i];
        !           135:                 }
        !           136:                 else if (args[i].equals("-key"))
        !           137:                 {
        !           138:                     if (i >= args.length-1)
        !           139:                     {
        !           140:                         print_server_options(build_mode, args[i]);
        !           141:                     }
        !           142: 
        !           143:                     private_key_file = args[++i];
        !           144:                     options |= axtlsj.SSL_NO_DEFAULT_KEY;
        !           145:                 }
        !           146:                 else if (args[i].equals("-pass"))
        !           147:                 {
        !           148:                     if (i >= args.length-1)
        !           149:                     {
        !           150:                         print_server_options(build_mode, args[i]);
        !           151:                     }
        !           152: 
        !           153:                     password = args[++i];
        !           154:                 }
        !           155:                 else if (build_mode >= axtlsj.SSL_BUILD_ENABLE_VERIFICATION)
        !           156:                 {
        !           157:                     if (args[i].equals("-verify"))
        !           158:                     {
        !           159:                         options |= axtlsj.SSL_CLIENT_AUTHENTICATION;
        !           160:                     }
        !           161:                     else if (args[i].equals("-CAfile"))
        !           162:                     {
        !           163:                         if (i >= args.length-1 || ca_cert_index >= ca_cert_size)
        !           164:                         {
        !           165:                             print_server_options(build_mode, args[i]);
        !           166:                         }
        !           167: 
        !           168:                         ca_cert[ca_cert_index++] = args[++i];
        !           169:                     }
        !           170:                     else if (build_mode == axtlsj.SSL_BUILD_FULL_MODE)
        !           171:                     {
        !           172:                         if (args[i].equals("-debug"))
        !           173:                         {
        !           174:                             options |= axtlsj.SSL_DISPLAY_BYTES;
        !           175:                         }
        !           176:                         else if (args[i].equals("-state"))
        !           177:                         {
        !           178:                             options |= axtlsj.SSL_DISPLAY_STATES;
        !           179:                         }
        !           180:                         else if (args[i].equals("-show-rsa"))
        !           181:                         {
        !           182:                             options |= axtlsj.SSL_DISPLAY_RSA;
        !           183:                         }
        !           184:                         else
        !           185:                             print_server_options(build_mode, args[i]);
        !           186:                     }
        !           187:                     else
        !           188:                         print_server_options(build_mode, args[i]);
        !           189:                 }
        !           190:                 else 
        !           191:                     print_server_options(build_mode, args[i]);
        !           192:             }
        !           193:             else 
        !           194:                 print_server_options(build_mode, args[i]);
        !           195: 
        !           196:             i++;
        !           197:         }
        !           198: 
        !           199:         /* Create socket for incoming connections */
        !           200:         ServerSocket server_sock = new ServerSocket(port);
        !           201: 
        !           202:         /**********************************************************************
        !           203:          * This is where the interesting stuff happens. Up until now we've
        !           204:          * just been setting up sockets etc. Now we do the SSL handshake.
        !           205:          **********************************************************************/
        !           206:         SSLServer ssl_ctx = new SSLServer(options, 
        !           207:                                     axtlsj.SSL_DEFAULT_SVR_SESS);
        !           208: 
        !           209:         if (ssl_ctx == null)
        !           210:             throw new Exception("Error: Server context is invalid");
        !           211: 
        !           212:         if (private_key_file != null)
        !           213:         {
        !           214:             int obj_type =  axtlsj.SSL_OBJ_RSA_KEY;
        !           215: 
        !           216:             if (private_key_file.endsWith(".p8"))
        !           217:                 obj_type = axtlsj.SSL_OBJ_PKCS8;
        !           218:             else if (private_key_file.endsWith(".p12"))
        !           219:                 obj_type = axtlsj.SSL_OBJ_PKCS12;
        !           220: 
        !           221:             if (ssl_ctx.objLoad(obj_type, 
        !           222:                             private_key_file, password) != axtlsj.SSL_OK)
        !           223:             {
        !           224:                 throw new Exception("Error: Private key '" + private_key_file + 
        !           225:                         "' is undefined.");
        !           226:             }
        !           227:         }
        !           228: 
        !           229:         for (i = 0; i < cert_index; i++)
        !           230:         {
        !           231:             if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CERT, 
        !           232:                                         cert[i], null) != axtlsj.SSL_OK)
        !           233:             {
        !           234:                 throw new Exception("Certificate '" + cert[i] + 
        !           235:                         "' is undefined.");
        !           236:             }
        !           237:         }
        !           238: 
        !           239:         for (i = 0; i < ca_cert_index; i++)
        !           240:         {
        !           241:             if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CACERT, 
        !           242:                                         ca_cert[i], null) != axtlsj.SSL_OK)
        !           243:             {
        !           244:                 throw new Exception("Certificate '" + ca_cert[i] + 
        !           245:                         "' is undefined.");
        !           246:             }
        !           247:         }
        !           248: 
        !           249:         int res;
        !           250:         SSLReadHolder rh = new SSLReadHolder();
        !           251: 
        !           252:         for (;;)
        !           253:         {
        !           254:             if (!quiet)
        !           255:             {
        !           256:                 System.out.println("ACCEPT");
        !           257:             }
        !           258: 
        !           259:             Socket client_sock = server_sock.accept();
        !           260: 
        !           261:             SSL ssl = ssl_ctx.connect(client_sock);
        !           262: 
        !           263:             while ((res = ssl_ctx.read(ssl, rh)) == axtlsj.SSL_OK)
        !           264:             {
        !           265:                 /* check when the connection has been established */
        !           266:                 if (ssl.handshakeStatus() == axtlsj.SSL_OK)
        !           267:                     break;
        !           268: 
        !           269:                 /* could do something else here */
        !           270:             }
        !           271: 
        !           272:             if (res == axtlsj.SSL_OK) /* connection established and ok */
        !           273:             {
        !           274:                 if (!quiet)
        !           275:                 {
        !           276:                     display_session_id(ssl);
        !           277:                     display_cipher(ssl);
        !           278:                 }
        !           279: 
        !           280:                 /* now read (and display) whatever the client sends us */
        !           281:                 for (;;)
        !           282:                 {
        !           283:                     /* keep reading until we get something interesting */
        !           284:                     while ((res = ssl_ctx.read(ssl, rh)) == axtlsj.SSL_OK)
        !           285:                     {
        !           286:                         /* could do something else here */
        !           287:                     }
        !           288: 
        !           289:                     if (res < axtlsj.SSL_OK)
        !           290:                     {
        !           291:                         if (!quiet)
        !           292:                         {
        !           293:                             System.out.println("CONNECTION CLOSED");
        !           294:                         }
        !           295: 
        !           296:                         break;
        !           297:                     }
        !           298: 
        !           299:                     /* convert to String */
        !           300:                     byte[] buf = rh.getData();
        !           301:                     char[] str = new char[res];
        !           302: 
        !           303:                     for (i = 0; i < res; i++)
        !           304:                     {
        !           305:                         str[i] = (char)buf[i];
        !           306:                     }
        !           307: 
        !           308:                     System.out.print(str);
        !           309:                 }
        !           310:             }
        !           311:             else if (!quiet)
        !           312:             {
        !           313:                 SSLUtil.displayError(res);
        !           314:             }
        !           315: 
        !           316:             /* client was disconnected or the handshake failed. */
        !           317:             ssl.dispose();
        !           318:             client_sock.close();
        !           319:         }
        !           320: 
        !           321:         /* ssl_ctx.dispose(); */
        !           322:     }
        !           323: 
        !           324:     /*
        !           325:      * do_client()
        !           326:      */
        !           327:     private void do_client(int build_mode, String[] args)
        !           328:                     throws Exception
        !           329:     {
        !           330:         if (build_mode < axtlsj.SSL_BUILD_ENABLE_CLIENT)
        !           331:             print_client_options(build_mode, args[1]);
        !           332: 
        !           333:         int i = 1, res;
        !           334:         int port = 4433;
        !           335:         boolean quiet = false;
        !           336:         String password = null;
        !           337:         int reconnect = 0;
        !           338:         String private_key_file = null;
        !           339:         String hostname = "127.0.0.1";
        !           340: 
        !           341:         /* organise the cert/ca_cert lists */
        !           342:         int cert_index = 0;
        !           343:         int ca_cert_index = 0;
        !           344:         int cert_size = SSLUtil.maxCerts();
        !           345:         int ca_cert_size = SSLUtil.maxCACerts();
        !           346:         String[] cert = new String[cert_size];
        !           347:         String[] ca_cert = new String[ca_cert_size];
        !           348: 
        !           349:         int options = axtlsj.SSL_SERVER_VERIFY_LATER|axtlsj.SSL_DISPLAY_CERTS;
        !           350:         byte[] session_id = null;
        !           351: 
        !           352:         while (i < args.length)
        !           353:         {
        !           354:             if (args[i].equals("-connect"))
        !           355:             {
        !           356:                 String host_port;
        !           357: 
        !           358:                 if (i >= args.length-1)
        !           359:                 {
        !           360:                     print_client_options(build_mode, args[i]);
        !           361:                 }
        !           362: 
        !           363:                 host_port = args[++i];
        !           364:                 int index_colon;
        !           365: 
        !           366:                 if ((index_colon = host_port.indexOf(':')) < 0)
        !           367:                     print_client_options(build_mode, args[i]);
        !           368: 
        !           369:                 hostname = new String(host_port.toCharArray(), 
        !           370:                         0, index_colon);
        !           371:                 port = Integer.parseInt(new String(host_port.toCharArray(), 
        !           372:                             index_colon+1, host_port.length()-index_colon-1));
        !           373:             }
        !           374:             else if (args[i].equals("-cert"))
        !           375:             {
        !           376:                 if (i >= args.length-1 || cert_index >= cert_size)
        !           377:                 {
        !           378:                     print_client_options(build_mode, args[i]);
        !           379:                 }
        !           380: 
        !           381:                 cert[cert_index++] = args[++i];
        !           382:             }
        !           383:             else if (args[i].equals("-CAfile"))
        !           384:             {
        !           385:                 if (i >= args.length-1 || ca_cert_index >= ca_cert_size)
        !           386:                 {
        !           387:                     print_client_options(build_mode, args[i]);
        !           388:                 }
        !           389: 
        !           390:                 ca_cert[ca_cert_index++] = args[++i];
        !           391:             }
        !           392:             else if (args[i].equals("-key"))
        !           393:             {
        !           394:                 if (i >= args.length-1)
        !           395:                 {
        !           396:                     print_client_options(build_mode, args[i]);
        !           397:                 }
        !           398: 
        !           399:                 private_key_file = args[++i];
        !           400:                 options |= axtlsj.SSL_NO_DEFAULT_KEY;
        !           401:             }
        !           402:             else if (args[i].equals("-verify"))
        !           403:             {
        !           404:                 options &= ~(int)axtlsj.SSL_SERVER_VERIFY_LATER;
        !           405:             }
        !           406:             else if (args[i].equals("-reconnect"))
        !           407:             {
        !           408:                 reconnect = 4;
        !           409:             }
        !           410:             else if (args[i].equals("-quiet"))
        !           411:             {
        !           412:                 quiet = true;
        !           413:                 options &= ~(int)axtlsj.SSL_DISPLAY_CERTS;
        !           414:             }
        !           415:             else if (args[i].equals("-pass"))
        !           416:             {
        !           417:                 if (i >= args.length-1)
        !           418:                 {
        !           419:                     print_server_options(build_mode, args[i]);
        !           420:                 }
        !           421: 
        !           422:                 password = args[++i];
        !           423:             }
        !           424:             else if (build_mode == axtlsj.SSL_BUILD_FULL_MODE)
        !           425:             {
        !           426:                 if (args[i].equals("-debug"))
        !           427:                 {
        !           428:                     options |= axtlsj.SSL_DISPLAY_BYTES;
        !           429:                 }
        !           430:                 else if (args[i].equals("-state"))
        !           431:                 {
        !           432:                     options |= axtlsj.SSL_DISPLAY_STATES;
        !           433:                 }
        !           434:                 else if (args[i].equals("-show-rsa"))
        !           435:                 {
        !           436:                     options |= axtlsj.SSL_DISPLAY_RSA;
        !           437:                 }
        !           438:                 else
        !           439:                     print_client_options(build_mode, args[i]);
        !           440:             }
        !           441:             else    /* don't know what this is */
        !           442:                 print_client_options(build_mode, args[i]);
        !           443: 
        !           444:             i++;
        !           445:         }
        !           446: 
        !           447:         Socket client_sock = new Socket(hostname, port);
        !           448: 
        !           449:         if (!client_sock.isConnected())
        !           450:         {
        !           451:             System.out.println("could not connect");
        !           452:             throw new Exception();
        !           453:         }
        !           454: 
        !           455:         if (!quiet)
        !           456:         {
        !           457:             System.out.println("CONNECTED");
        !           458:         }
        !           459: 
        !           460:         /**********************************************************************
        !           461:          * This is where the interesting stuff happens. Up until now we've
        !           462:          * just been setting up sockets etc. Now we do the SSL handshake.
        !           463:          **********************************************************************/
        !           464:         SSLClient ssl_ctx = new SSLClient(options, 
        !           465:                                     axtlsj.SSL_DEFAULT_CLNT_SESS);
        !           466: 
        !           467:         if (ssl_ctx == null)
        !           468:         {
        !           469:             throw new Exception("Error: Client context is invalid");
        !           470:         }
        !           471: 
        !           472:         if (private_key_file != null)
        !           473:         {
        !           474:             int obj_type =  axtlsj.SSL_OBJ_RSA_KEY;
        !           475: 
        !           476:             if (private_key_file.endsWith(".p8"))
        !           477:                 obj_type = axtlsj.SSL_OBJ_PKCS8;
        !           478:             else if (private_key_file.endsWith(".p12"))
        !           479:                 obj_type = axtlsj.SSL_OBJ_PKCS12;
        !           480: 
        !           481:             if (ssl_ctx.objLoad(obj_type, 
        !           482:                             private_key_file, password) != axtlsj.SSL_OK)
        !           483:             {
        !           484:                 throw new Exception("Error: Private key '" + private_key_file + 
        !           485:                         "' is undefined.");
        !           486:             }
        !           487:         }
        !           488: 
        !           489:         for (i = 0; i < cert_index; i++)
        !           490:         {
        !           491:             if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CERT, 
        !           492:                                         cert[i], null) != axtlsj.SSL_OK)
        !           493:             {
        !           494:                 throw new Exception("Certificate '" + cert[i] + 
        !           495:                         "' is undefined.");
        !           496:             }
        !           497:         }
        !           498: 
        !           499:         for (i = 0; i < ca_cert_index; i++)
        !           500:         {
        !           501:             if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CACERT, 
        !           502:                                         ca_cert[i], null) != axtlsj.SSL_OK)
        !           503:             {
        !           504:                 throw new Exception("Certificate '" + ca_cert[i] + 
        !           505:                         "' is undefined.");
        !           506:             }
        !           507:         }
        !           508: 
        !           509:         SSL ssl = null;
        !           510: 
        !           511:         /* Try session resumption? */
        !           512:         if (reconnect > 0)
        !           513:         {
        !           514:             while (reconnect-- > 0)
        !           515:             {
        !           516:                 ssl = ssl_ctx.connect(client_sock, session_id);
        !           517: 
        !           518:                 if ((res = ssl.handshakeStatus()) != axtlsj.SSL_OK)
        !           519:                 {
        !           520:                     if (!quiet)
        !           521:                     {
        !           522:                         SSLUtil.displayError(res);
        !           523:                     }
        !           524: 
        !           525:                     ssl.dispose();
        !           526:                     throw new Exception();
        !           527:                 }
        !           528: 
        !           529:                 display_session_id(ssl);
        !           530:                 session_id = ssl.getSessionId();
        !           531: 
        !           532:                 if (reconnect > 0)
        !           533:                 {
        !           534:                     ssl.dispose();
        !           535:                     client_sock.close();
        !           536:                     
        !           537:                     /* and reconnect */
        !           538:                     client_sock = new Socket(hostname, port);
        !           539:                 }
        !           540:             }
        !           541:         }
        !           542:         else
        !           543:         {
        !           544:             ssl = ssl_ctx.connect(client_sock, null);
        !           545:         }
        !           546: 
        !           547:         /* check the return status */
        !           548:         if ((res = ssl.handshakeStatus()) != axtlsj.SSL_OK)
        !           549:         {
        !           550:             if (!quiet)
        !           551:             {
        !           552:                 SSLUtil.displayError(res);
        !           553:             }
        !           554: 
        !           555:             throw new Exception();
        !           556:         }
        !           557: 
        !           558:         if (!quiet)
        !           559:         {
        !           560:             String common_name =
        !           561:                 ssl.getCertificateDN(axtlsj.SSL_X509_CERT_COMMON_NAME);
        !           562: 
        !           563:             if (common_name != null)
        !           564:             {
        !           565:                 System.out.println("Common Name:\t\t\t" + common_name);
        !           566:             }
        !           567: 
        !           568:             display_session_id(ssl);
        !           569:             display_cipher(ssl);
        !           570:         }
        !           571: 
        !           572:         BufferedReader in = new BufferedReader(
        !           573:                 new InputStreamReader(System.in));
        !           574: 
        !           575:         for (;;)
        !           576:         {
        !           577:             String user_input = in.readLine();
        !           578: 
        !           579:             if (user_input == null)
        !           580:                 break;
        !           581: 
        !           582:             byte[] buf = new byte[user_input.length()+2];
        !           583:             buf[buf.length-2] = (byte)'\n';     /* add the carriage return */
        !           584:             buf[buf.length-1] = 0;              /* null terminate */
        !           585: 
        !           586:             for (i = 0; i < buf.length-2; i++)
        !           587:             {
        !           588:                 buf[i] = (byte)user_input.charAt(i);
        !           589:             }
        !           590: 
        !           591:             if ((res = ssl_ctx.write(ssl, buf)) < axtlsj.SSL_OK)
        !           592:             {
        !           593:                 if (!quiet)
        !           594:                 {
        !           595:                     SSLUtil.displayError(res);
        !           596:                 }
        !           597: 
        !           598:                 break;
        !           599:             }
        !           600:         }
        !           601: 
        !           602:         ssl_ctx.dispose();
        !           603:     }
        !           604: 
        !           605:     /**
        !           606:      * We've had some sort of command-line error. Print out the basic options.
        !           607:      */
        !           608:     private void print_options(String option)
        !           609:     {
        !           610:         System.out.println("axssl: Error: '" + option + 
        !           611:                 "' is an invalid command.");
        !           612:         System.out.println("usage: axtlsj.jar [s_server|s_client|version] " + 
        !           613:                 "[args ...]");
        !           614:         System.exit(1);
        !           615:     }
        !           616: 
        !           617:     /**
        !           618:      * We've had some sort of command-line error. Print out the server options.
        !           619:      */
        !           620:     private void print_server_options(int build_mode, String option)
        !           621:     {
        !           622:         int cert_size = SSLUtil.maxCerts();
        !           623:         int ca_cert_size = SSLUtil.maxCACerts();
        !           624: 
        !           625:         System.out.println("unknown option " + option);
        !           626:         System.out.println("usage: s_server [args ...]");
        !           627:         System.out.println(" -accept arg\t- port to accept on (default " + 
        !           628:                 "is 4433)");
        !           629:         System.out.println(" -quiet\t\t- No server output");
        !           630: 
        !           631:         if (build_mode >= axtlsj.SSL_BUILD_SERVER_ONLY)
        !           632:         {
        !           633:             System.out.println(" -cert arg\t- certificate file to add (in " + 
        !           634:                     "addition to default) to chain -");
        !           635:             System.out.println("\t\t  Can repeat up to " + cert_size + " times");
        !           636:             System.out.println(" -key arg\t- Private key file to use");
        !           637:             System.out.println(" -pass\t\t- private key file pass phrase source");
        !           638:         }
        !           639: 
        !           640:         if (build_mode >= axtlsj.SSL_BUILD_ENABLE_VERIFICATION)
        !           641:         {
        !           642:             System.out.println(" -verify\t- turn on peer certificate " +
        !           643:                     "verification");
        !           644:             System.out.println(" -CAfile arg\t- Certificate authority. ");
        !           645:             System.out.println("\t\t  Can repeat up to " + 
        !           646:                     ca_cert_size + " times");
        !           647:         }
        !           648: 
        !           649:         if (build_mode == axtlsj.SSL_BUILD_FULL_MODE)
        !           650:         {
        !           651:             System.out.println(" -debug\t\t- Print more output");
        !           652:             System.out.println(" -state\t\t- Show state messages");
        !           653:             System.out.println(" -show-rsa\t- Show RSA state");
        !           654:         }
        !           655: 
        !           656:         System.exit(1);
        !           657:     }
        !           658: 
        !           659:     /**
        !           660:      * We've had some sort of command-line error. Print out the client options.
        !           661:      */
        !           662:     private void print_client_options(int build_mode, String option)
        !           663:     {
        !           664:         int cert_size = SSLUtil.maxCerts();
        !           665:         int ca_cert_size = SSLUtil.maxCACerts();
        !           666: 
        !           667:         System.out.println("unknown option " + option);
        !           668: 
        !           669:         if (build_mode >= axtlsj.SSL_BUILD_ENABLE_CLIENT)
        !           670:         {
        !           671:             System.out.println("usage: s_client [args ...]");
        !           672:             System.out.println(" -connect host:port - who to connect to " + 
        !           673:                     "(default is localhost:4433)");
        !           674:             System.out.println(" -verify\t- turn on peer certificate " + 
        !           675:                     "verification");
        !           676:             System.out.println(" -cert arg\t- certificate file to use");
        !           677:             System.out.println(" -key arg\t- Private key file to use");
        !           678:             System.out.println("\t\t  Can repeat up to " + cert_size + 
        !           679:                     " times");
        !           680:             System.out.println(" -CAfile arg\t- Certificate authority.");
        !           681:             System.out.println("\t\t  Can repeat up to " + ca_cert_size + 
        !           682:                     " times");
        !           683:             System.out.println(" -quiet\t\t- No client output");
        !           684:             System.out.println(" -pass\t\t- private key file pass " + 
        !           685:                         "phrase source");
        !           686:             System.out.println(" -reconnect\t- Drop and re-make the " +
        !           687:                     "connection with the same Session-ID");
        !           688: 
        !           689:             if (build_mode == axtlsj.SSL_BUILD_FULL_MODE)
        !           690:             {
        !           691:                 System.out.println(" -debug\t\t- Print more output");
        !           692:                 System.out.println(" -state\t\t- Show state messages");
        !           693:                 System.out.println(" -show-rsa\t- Show RSA state");
        !           694:             }
        !           695:         }
        !           696:         else 
        !           697:         {
        !           698:             System.out.println("Change configuration to allow this feature");
        !           699:         }
        !           700: 
        !           701:         System.exit(1);
        !           702:     }
        !           703: 
        !           704:     /**
        !           705:      * Display what cipher we are using 
        !           706:      */
        !           707:     private void display_cipher(SSL ssl)
        !           708:     {
        !           709:         System.out.print("CIPHER is ");
        !           710: 
        !           711:         byte ciph_id = ssl.getCipherId();
        !           712: 
        !           713:         if (ciph_id == axtlsj.SSL_AES128_SHA)
        !           714:             System.out.println("AES128-SHA");
        !           715:         else if (ciph_id == axtlsj.SSL_AES256_SHA)
        !           716:             System.out.println("AES256-SHA");
        !           717:         else if (ciph_id == axtlsj.SSL_RC4_128_SHA)
        !           718:             System.out.println("RC4-SHA");
        !           719:         else if (ciph_id == axtlsj.SSL_RC4_128_MD5)
        !           720:             System.out.println("RC4-MD5");
        !           721:         else
        !           722:             System.out.println("Unknown - " + ssl.getCipherId());
        !           723:     }
        !           724: 
        !           725:     public char toHexChar(int i)
        !           726:     {
        !           727:         if ((0 <= i) && (i <= 9 ))
        !           728:             return (char)('0' + i);
        !           729:         else
        !           730:             return (char)('a' + (i-10));
        !           731:     }
        !           732: 
        !           733:     public void bytesToHex(byte[] data) 
        !           734:     {
        !           735:         StringBuffer buf = new StringBuffer();
        !           736:         for (int i = 0; i < data.length; i++ ) 
        !           737:         {
        !           738:             buf.append(toHexChar((data[i]>>>4)&0x0F));
        !           739:             buf.append(toHexChar(data[i]&0x0F));
        !           740:         }
        !           741: 
        !           742:         System.out.println(buf);
        !           743:     }
        !           744: 
        !           745: 
        !           746:     /**
        !           747:      * Display what session id we have.
        !           748:      */
        !           749:     private void display_session_id(SSL ssl)
        !           750:     {    
        !           751:         byte[] session_id = ssl.getSessionId();
        !           752: 
        !           753:         if (session_id.length > 0)
        !           754:         {
        !           755:             System.out.println("-----BEGIN SSL SESSION PARAMETERS-----");
        !           756:             bytesToHex(session_id);
        !           757:             System.out.println("-----END SSL SESSION PARAMETERS-----");
        !           758:         }
        !           759:     }
        !           760: }

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