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>