src/java.base/share/classes/sun/security/ssl/SessionId.java
branchJDK-8145252-TLS13-branch
changeset 56542 56aaa6cb3693
parent 47216 71c04702a3d5
child 55336 c2398053ee90
--- a/src/java.base/share/classes/sun/security/ssl/SessionId.java	Fri May 11 14:55:56 2018 -0700
+++ b/src/java.base/share/classes/sun/security/ssl/SessionId.java	Fri May 11 15:53:12 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -23,105 +23,83 @@
  * questions.
  */
 
-
 package sun.security.ssl;
 
 import java.security.SecureRandom;
+import java.util.Arrays;
 import javax.net.ssl.SSLProtocolException;
 
 /**
- * Encapsulates an SSL session ID.  SSL Session IDs are not reused by
- * servers during the lifetime of any sessions it created.  Sessions may
- * be used by many connections, either concurrently (for example, two
- * connections to a web server at the same time) or sequentially (over as
- * long a time period as is allowed by a given server).
+ * Encapsulates an SSL session ID.
  *
  * @author Satish Dharmaraj
  * @author David Brownell
  */
-final
-class SessionId
-{
-    static int MAX_LENGTH = 32;
-    private byte[] sessionId;          // max 32 bytes
+final class SessionId {
+    private static final int MAX_LENGTH = 32;
+    private final byte[] sessionId;          // max 32 bytes
 
-    /** Constructs a new session ID ... perhaps for a rejoinable session */
-    SessionId (boolean isRejoinable, SecureRandom generator)
-    {
-        if (isRejoinable)
-            // this will be unique, it's a timestamp plus much randomness
-            sessionId = new RandomCookie (generator).random_bytes;
-        else
-            sessionId = new byte [0];
+    // Constructs a new session ID ... perhaps for a rejoinable session
+    SessionId(boolean isRejoinable, SecureRandom generator) {
+        if (isRejoinable && (generator != null)) {
+            sessionId = new RandomCookie(generator).randomBytes;
+        } else {
+            sessionId = new byte[0];
+        }
+    }
+
+    // Constructs a session ID from a byte array (max size 32 bytes)
+    SessionId(byte[] sessionId) {
+        this.sessionId = sessionId.clone();
     }
 
-    /** Constructs a session ID from a byte array (max size 32 bytes) */
-    SessionId (byte[] sessionId)
-        { this.sessionId = sessionId; }
-
-    /** Returns the length of the ID, in bytes */
-    int length ()
-        { return sessionId.length; }
-
-    /** Returns the bytes in the ID.  May be an empty array.  */
-    byte[] getId ()
-    {
-        return sessionId.clone ();
+    // Returns the length of the ID, in bytes
+    int length() {
+        return sessionId.length;
     }
 
-    /** Returns the ID as a string */
-    @Override
-    public String toString ()
-    {
-        int             len = sessionId.length;
-        StringBuilder    sb = new StringBuilder (10 + 2 * len);
+    // Returns the bytes in the ID.  May be an empty array.
+    byte[] getId() {
+        return sessionId.clone();
+    }
 
-        sb.append("{");
-        for (int i = 0; i < len; i++) {
-            sb.append(0x0ff & sessionId[i]);
-            if (i != (len - 1))
-                sb.append (", ");
+    // Returns the ID as a string
+    @Override
+    public String toString() {
+        if (sessionId.length == 0) {
+            return "";
         }
-        sb.append("}");
-        return sb.toString ();
+
+        return Utilities.toHexString(sessionId);
     }
 
 
-    /** Returns a value which is the same for session IDs which are equal */
+    // Returns a value which is the same for session IDs which are equal
     @Override
-    public int hashCode ()
-    {
-        int     retval = 0;
-
-        for (int i = 0; i < sessionId.length; i++)
-            retval += sessionId [i];
-        return retval;
+    public int hashCode() {
+        return Arrays.hashCode(sessionId);
     }
 
-    /** Returns true if the parameter is the same session ID */
+    // Returns true if the parameter is the same session ID
     @Override
-    public boolean equals (Object obj)
-    {
-        if (!(obj instanceof SessionId))
-            return false;
+    public boolean equals (Object obj) {
+        if (obj == this) {
+            return true;
+        }
 
-        SessionId s = (SessionId) obj;
-        byte[] b = s.getId ();
+        if (obj instanceof SessionId) {
+            SessionId that = (SessionId)obj;
+            return Arrays.equals(this.sessionId, that.sessionId);
+        }
 
-        if (b.length != sessionId.length)
-            return false;
-        for (int i = 0; i < sessionId.length; i++) {
-            if (b [i] != sessionId [i])
-                return false;
-        }
-        return true;
+        return false;
     }
 
     /**
      * Checks the length of the session ID to make sure it sits within
      * the range called out in the specification
      */
-    void checkLength(ProtocolVersion pv) throws SSLProtocolException {
+    void checkLength(int protocolVersion) throws SSLProtocolException {
         // As of today all versions of TLS have a 32-byte maximum length.
         // In the future we can do more here to support protocol versions
         // that may have longer max lengths.
@@ -130,5 +108,4 @@
                     sessionId.length + " bytes)");
         }
     }
-
 }