< prev index next >

src/java.base/share/classes/sun/security/ssl/Utilities.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -23,22 +23,25 @@
  * questions.
  */
 
 package sun.security.ssl;
 
-import javax.net.ssl.*;
+import java.math.BigInteger;
 import java.util.*;
+import java.util.regex.Pattern;
+import javax.net.ssl.*;
 import sun.net.util.IPAddressUtil;
+import sun.security.action.GetPropertyAction;
 
 /**
  * A utility class to share the static methods.
  */
 final class Utilities {
-    /**
-     * hex digits
-     */
     static final char[] hexDigits = "0123456789ABCDEF".toCharArray();
+    private static final String indent = "  ";
+    private static final Pattern lineBreakPatern =
+                Pattern.compile("\\r\\n|\\n|\\r");
 
     /**
      * Puts {@code hostname} into the {@code serverNames} list.
      * <P>
      * If the {@code serverNames} does not look like a legal FQDN, it will

@@ -64,13 +67,13 @@
         boolean reset = false;
         for (int i = 0; i < size; i++) {
             SNIServerName serverName = sniList.get(i);
             if (serverName.getType() == StandardConstants.SNI_HOST_NAME) {
                 sniList.set(i, sniHostName);
-                if (Debug.isOn("ssl")) {
-                    System.out.println(Thread.currentThread().getName() +
-                        ", the previous server name in SNI (" + serverName +
+                if (SSLLogger.isOn && SSLLogger.isOn("ssl")) {
+                     SSLLogger.fine(
+                        "the previous server name in SNI (" + serverName +
                         ") was replaced with (" + sniHostName + ")");
                 }
                 reset = true;
                 break;
             }

@@ -105,16 +108,128 @@
 
             try {
                 sniHostName = new SNIHostName(hostname);
             } catch (IllegalArgumentException iae) {
                 // don't bother to handle illegal host_name
-                if (Debug.isOn("ssl")) {
-                    System.out.println(Thread.currentThread().getName() +
-                        ", \"" + hostname + "\" " +
+                if (SSLLogger.isOn && SSLLogger.isOn("ssl")) {
+                     SSLLogger.fine(hostname + "\" " +
                         "is not a legal HostName for  server name indication");
                 }
             }
         }
 
         return sniHostName;
     }
+
+    /**
+     * Return the value of the boolean System property propName.
+     *
+     * Note use of privileged action. Do NOT make accessible to applications.
+     */
+    static boolean getBooleanProperty(String propName, boolean defaultValue) {
+        // if set, require value of either true or false
+        String b = GetPropertyAction.privilegedGetProperty(propName);
+        if (b == null) {
+            return defaultValue;
+        } else if (b.equalsIgnoreCase("false")) {
+            return false;
+        } else if (b.equalsIgnoreCase("true")) {
+            return true;
+        } else {
+            throw new RuntimeException("Value of " + propName
+                + " must either be 'true' or 'false'");
+        }
+    }
+
+    static String indent(String source) {
+        return Utilities.indent(source, indent);
+    }
+
+    static String indent(String source, String prefix) {
+        StringBuilder builder = new StringBuilder();
+        if (source == null) {
+             builder.append("\n" + prefix + "<blank message>");
+        } else {
+            String[] lines = lineBreakPatern.split(source);
+            boolean isFirst = true;
+            for (String line : lines) {
+                if (isFirst) {
+                    isFirst = false;
+                } else {
+                    builder.append("\n");
+                }
+                builder.append(prefix).append(line);
+            }
+        }
+
+        return builder.toString();
+    }
+
+    static String toHexString(byte b) {
+        return String.valueOf(hexDigits[(b >> 4) & 0x0F]) +
+                String.valueOf(hexDigits[b & 0x0F]);
+    }
+
+    static String byte16HexString(int id) {
+        return "0x" +
+                hexDigits[(id >> 12) & 0x0F] + hexDigits[(id >> 8) & 0x0F] +
+                hexDigits[(id >> 4) & 0x0F] + hexDigits[id & 0x0F];
+    }
+
+    static String toHexString(byte[] bytes) {
+        if (bytes == null || bytes.length == 0) {
+            return "";
+        }
+
+        StringBuilder builder = new StringBuilder(bytes.length * 3);
+        boolean isFirst = true;
+        for (byte b : bytes) {
+            if (isFirst) {
+                isFirst = false;
+            } else {
+                builder.append(' ');
+            }
+
+            builder.append(hexDigits[(b >> 4) & 0x0F]);
+            builder.append(hexDigits[b & 0x0F]);
+        }
+        return builder.toString();
+    }
+
+    static String toHexString(long lv) {
+        StringBuilder builder = new StringBuilder(128);
+
+        boolean isFirst = true;
+        do {
+            if (isFirst) {
+                isFirst = false;
+            } else {
+                builder.append(' ');
+            }
+
+            builder.append(hexDigits[(int)(lv & 0x0F)]);
+            lv >>>= 4;
+            builder.append(hexDigits[(int)(lv & 0x0F)]);
+            lv >>>= 4;
+        } while (lv != 0);
+        builder.reverse();
+
+        return builder.toString();
+    }
+
+    /**
+     * Utility method to convert a BigInteger to a byte array in unsigned
+     * format as needed in the handshake messages. BigInteger uses
+     * 2's complement format, i.e. it prepends an extra zero if the MSB
+     * is set. We remove that.
+     */
+    static byte[] toByteArray(BigInteger bi) {
+        byte[] b = bi.toByteArray();
+        if ((b.length > 1) && (b[0] == 0)) {
+            int n = b.length - 1;
+            byte[] newarray = new byte[n];
+            System.arraycopy(b, 1, newarray, 0, n);
+            b = newarray;
+        }
+        return b;
+    }
 }
< prev index next >