151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.security.ssl; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.PrintStream; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.AccessController; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Locale; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.action.GetPropertyAction; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class has be shamefully lifted from sun.security.util.Debug 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Gary Ellison 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class Debug { 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private String prefix; 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static String args; 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static { 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski args = java.security.AccessController.doPrivileged( 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new GetPropertyAction("javax.net.debug", "")); 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski args = args.toLowerCase(Locale.ENGLISH); 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (args.equals("help")) { 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Help(); 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void Help() 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println(); 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("all turn on all debugging"); 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("ssl turn on ssl debugging"); 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println(); 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("The following can be used with ssl:"); 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\trecord enable per-record tracing"); 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\thandshake print each handshake message"); 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tkeygen print key generation data"); 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tsession print session activity"); 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tdefaultctx print default SSL initialization"); 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tsslctx print SSLContext tracing"); 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tsessioncache print session cache tracing"); 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tkeymanager print key manager tracing"); 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\ttrustmanager print trust manager tracing"); 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tpluggability print pluggability tracing"); 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println(); 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\thandshake debugging can be widened with:"); 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tdata hex dump of each handshake message"); 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tverbose verbose handshake message printing"); 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println(); 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\trecord debugging can be widened with:"); 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tplaintext hex dump of record plaintext"); 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("\tpacket print raw SSL/TLS packets"); 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println(); 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.exit(0); 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get a Debug object corresponding to whether or not the given 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * option is set. Set the prefix to be the same as option. 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static Debug getInstance(String option) 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getInstance(option, option); 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get a Debug object corresponding to whether or not the given 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * option is set. Set the prefix to be prefix. 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static Debug getInstance(String option, String prefix) 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isOn(option)) { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Debug d = new Debug(); 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski d.prefix = prefix; 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return d; 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * True if the property "javax.net.debug" contains the 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * string "option". 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean isOn(String option) 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (args == null) { 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int n = 0; 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski option = option.toLowerCase(Locale.ENGLISH); 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (args.indexOf("all") != -1) { 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if ((n = args.indexOf("ssl")) != -1) { 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (args.indexOf("sslctx", n) == -1) { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // don't enable data and plaintext options by default 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(option.equals("data") 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski || option.equals("packet") 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski || option.equals("plaintext"))) { 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (args.indexOf(option) != -1); 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * print a message to stderr that is prefixed with the prefix 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * created from the call to getInstance. 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void println(String message) 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println(prefix + ": "+message); 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * print a blank line to stderr that is prefixed with the prefix. 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void println() 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println(prefix + ":"); 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * print a message to stderr that is prefixed with the prefix. 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void println(String prefix, String message) 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println(prefix + ": "+message); 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void println(PrintStream s, String name, byte[] data) { 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s.print(name + ": { "); 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (data == null) { 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s.print("null"); 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < data.length; i++) { 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (i != 0) s.print(", "); 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s.print(data[i] & 0x0ff); 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s.println(" }"); 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the value of the boolean System property propName. 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Note use of doPrivileged(). Do make accessible to applications. 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static boolean getBooleanProperty(String propName, boolean defaultValue) { 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if set, require value of either true or false 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String b = AccessController.doPrivileged( 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new GetPropertyAction(propName)); 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (b == null) { 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return defaultValue; 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (b.equalsIgnoreCase("false")) { 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (b.equalsIgnoreCase("true")) { 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new RuntimeException("Value of " + propName 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + " must either be 'true' or 'false'"); 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static String toString(byte[] b) { 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sun.security.util.Debug.toString(b); 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 202