src/java.base/share/classes/sun/security/ssl/ClientKeyExchange.java
changeset 50768 68fa3d4026ea
parent 47216 71c04702a3d5
child 53064 103ed9569fc8
--- a/src/java.base/share/classes/sun/security/ssl/ClientKeyExchange.java	Mon Jun 25 21:22:16 2018 +0300
+++ b/src/java.base/share/classes/sun/security/ssl/ClientKeyExchange.java	Mon Jun 25 13:41:39 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -25,36 +25,89 @@
 
 package sun.security.ssl;
 
-import javax.crypto.SecretKey;
 import java.io.IOException;
-import java.io.PrintStream;
-import java.security.Principal;
+import java.nio.ByteBuffer;
+import java.util.Map;
+import sun.security.ssl.SSLHandshake.HandshakeMessage;
 
 /**
- * Models a non-certificate based ClientKeyExchange
+ * Pack of the "ClientKeyExchange" handshake message.
  */
-public abstract class ClientKeyExchange extends HandshakeMessage {
+final class ClientKeyExchange {
+    static final SSLConsumer handshakeConsumer =
+            new ClientKeyExchangeConsumer();
+    static final HandshakeProducer handshakeProducer =
+            new ClientKeyExchangeProducer();
+
+
+    /**
+     * The "ClientKeyExchange" handshake message producer.
+     */
+    private static final
+            class ClientKeyExchangeProducer implements HandshakeProducer {
+        // Prevent instantiation of this class.
+        private ClientKeyExchangeProducer() {
+            // blank
+        }
 
-    public ClientKeyExchange() {
+        @Override
+        public byte[] produce(ConnectionContext context,
+                HandshakeMessage message) throws IOException {
+            // The producing happens in client side only.
+            ClientHandshakeContext chc = (ClientHandshakeContext)context;
+            SSLKeyExchange ke = SSLKeyExchange.valueOf(
+                        chc.negotiatedCipherSuite.keyExchange,
+                        chc.negotiatedProtocol);
+            if (ke != null) {
+                for (Map.Entry<Byte, HandshakeProducer> hp :
+                        ke.getHandshakeProducers(chc)) {
+                    if (hp.getKey() == SSLHandshake.CLIENT_KEY_EXCHANGE.id) {
+                        return hp.getValue().produce(context, message);
+                    }
+                }
+            }
+
+            // not consumer defined.
+            chc.conContext.fatal(Alert.UNEXPECTED_MESSAGE,
+                        "Unexpected ClientKeyExchange handshake message.");
+            return null;    // make the compiler happe
+        }
     }
 
-    @Override
-    int messageType() {
-        return ht_client_key_exchange;
-    }
-
-    @Override
-    public abstract int messageLength();
+    /**
+     * The "ClientKeyExchange" handshake message consumer.
+     */
+    private static final
+            class ClientKeyExchangeConsumer implements SSLConsumer {
+        // Prevent instantiation of this class.
+        private ClientKeyExchangeConsumer() {
+            // blank
+        }
 
-    @Override
-    public abstract void send(HandshakeOutStream s) throws IOException;
-
-    @Override
-    public abstract void print(PrintStream s) throws IOException;
+        @Override
+        public void consume(ConnectionContext context,
+                ByteBuffer message) throws IOException {
+            // The consuming happens in server side only.
+            ServerHandshakeContext shc = (ServerHandshakeContext)context;
+            // clean up this consumer
+            shc.handshakeConsumers.remove(SSLHandshake.CLIENT_KEY_EXCHANGE.id);
+            SSLKeyExchange ke = SSLKeyExchange.valueOf(
+                    shc.negotiatedCipherSuite.keyExchange,
+                    shc.negotiatedProtocol);
+            if (ke != null) {
+                for (Map.Entry<Byte, SSLConsumer> hc :
+                        ke.getHandshakeConsumers(shc)) {
+                    if (hc.getKey() == SSLHandshake.CLIENT_KEY_EXCHANGE.id) {
+                        hc.getValue().consume(context, message);
+                        return;
+                    }
+                }
+            }
 
-    public abstract SecretKey clientKeyExchange();
+            // not consumer defined.
+            shc.conContext.fatal(Alert.UNEXPECTED_MESSAGE,
+                        "Unexpected ClientKeyExchange handshake message.");
+        }
+    }
+}
 
-    public abstract Principal getPeerPrincipal();
-
-    public abstract Principal getLocalPrincipal();
-}