From: <ls...@us...> - 2013-02-16 19:08:59
|
Revision: 5948 http://jnode.svn.sourceforge.net/jnode/?rev=5948&view=rev Author: lsantha Date: 2013-02-16 19:08:48 +0000 (Sat, 16 Feb 2013) Log Message: ----------- Integrating OpenJDK 6 build 27. Modified Paths: -------------- classlib6/core/src/openjdk/java/java/beans/XMLDecoder.java classlib6/core/src/openjdk/java/java/net/URL.java classlib6/core/src/openjdk/java/java/util/ServiceLoader.java classlib6/core/src/openjdk/java/java/util/concurrent/Executors.java classlib6/core/src/openjdk/java/java/util/logging/FileHandler.java classlib6/core/src/openjdk/java/java/util/logging/Handler.java classlib6/core/src/openjdk/java/java/util/logging/LogManager.java classlib6/core/src/openjdk/java/java/util/logging/Logger.java classlib6/core/src/openjdk/java/java/util/logging/MemoryHandler.java classlib6/core/src/openjdk/java/java/util/logging/StreamHandler.java classlib6/core/src/openjdk/javax/javax/management/modelmbean/DescriptorSupport.java classlib6/core/src/openjdk/javax/javax/management/remote/rmi/RMIConnectionImpl.java classlib6/core/src/openjdk/javax/javax/swing/text/DefaultFormatter.java classlib6/core/src/openjdk/sun/sun/misc/Service.java classlib6/core/src/openjdk/sun/sun/rmi/registry/RegistryImpl.java classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Cipher.java classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Key.java classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11RSACipher.java classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Signature.java classlib6/core/src/openjdk/sun/sun/security/provider/SecureRandom.java classlib6/core/src/openjdk/sun/sun/security/ssl/HandshakeInStream.java classlib6/core/src/openjdk/sun/sun/security/ssl/Handshaker.java classlib6/core/src/openjdk/sun/sun/security/ssl/RSAClientKeyExchange.java classlib6/core/src/openjdk/sun/sun/security/ssl/ServerHandshaker.java Added Paths: ----------- classlib6/core/src/openjdk/sun/sun/security/util/KeyLength.java classlib6/core/src/openjdk/sun/sun/security/util/Length.java classlib6/core/src/openjdk/sun/sun/text/resources/CollationData_zh_HK.java classlib6/core/src/openjdk/sun/sun/text/resources/FormatData_zh_HK.java Modified: classlib6/core/src/openjdk/java/java/beans/XMLDecoder.java =================================================================== --- classlib6/core/src/openjdk/java/java/beans/XMLDecoder.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/beans/XMLDecoder.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, 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 @@ -32,6 +32,10 @@ import java.lang.ref.Reference; import java.lang.ref.WeakReference; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.PrivilegedAction; + import org.xml.sax.SAXException; import javax.xml.parsers.SAXParserFactory; @@ -66,6 +70,7 @@ * @author Philip Milne */ public class XMLDecoder { + private final AccessControlContext acc = AccessController.getContext(); private InputStream in; private Object owner; private ExceptionListener exceptionListener; @@ -248,10 +253,15 @@ */ private ObjectHandler getHandler() { if ( handler == null ) { + if ((this.acc == null) && (null != System.getSecurityManager())) { + throw new SecurityException("AccessControlContext is not set"); + } + handler = AccessController.doPrivileged(new PrivilegedAction<ObjectHandler>() { + public ObjectHandler run() { + ObjectHandler handler = new ObjectHandler(XMLDecoder.this, getClassLoader()); SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser parser = factory.newSAXParser(); - handler = new ObjectHandler( this, getClassLoader() ); parser.parse( in, handler ); } catch ( ParserConfigurationException e ) { @@ -267,6 +277,9 @@ catch ( IOException ioe ) { getExceptionListener().exceptionThrown( ioe ); } + return handler; + } + }, this.acc); } return handler; } Modified: classlib6/core/src/openjdk/java/java/net/URL.java =================================================================== --- classlib6/core/src/openjdk/java/java/net/URL.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/net/URL.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2012, 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 @@ -28,6 +28,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.Hashtable; import java.util.StringTokenizer; import sun.security.util.SecurityConstants; @@ -1110,6 +1112,21 @@ static Hashtable handlers = new Hashtable(); private static Object streamHandlerLock = new Object(); + // special case the gopher protocol, disabled by default + private static final String GOPHER = "gopher"; + private static final String ENABLE_GOPHER_PROP = "jdk.net.registerGopherProtocol"; + private static final boolean enableGopher = AccessController.doPrivileged( + new PrivilegedAction<Boolean>() { + public Boolean run() { + String prop = System.getProperty(ENABLE_GOPHER_PROP); + return prop == null ? false : + (prop.equalsIgnoreCase("false") ? false : true); + } + }); + + // package name of the JDK implementation protocol handlers + private static final String JDK_PACKAGE_PREFIX = "sun.net.www.protocol"; + /** * Returns the Stream Handler. * @param protocol the protocol to use @@ -1141,7 +1158,7 @@ // REMIND: decide whether to allow the "null" class prefix // or not. - packagePrefixList += "sun.net.www.protocol"; + packagePrefixList += JDK_PACKAGE_PREFIX; StringTokenizer packagePrefixIter = new StringTokenizer(packagePrefixList, "|"); @@ -1151,6 +1168,15 @@ String packagePrefix = packagePrefixIter.nextToken().trim(); + + // do not try to instantiate the JDK gopher handler + // unless the system property had been explicitly set + if (protocol.equalsIgnoreCase(GOPHER) && + packagePrefix.equals(JDK_PACKAGE_PREFIX) && + !enableGopher) { + continue; + } + try { String clsName = packagePrefix + "." + protocol + ".Handler"; Modified: classlib6/core/src/openjdk/java/java/util/ServiceLoader.java =================================================================== --- classlib6/core/src/openjdk/java/java/util/ServiceLoader.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/util/ServiceLoader.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -358,14 +358,21 @@ } String cn = nextName; nextName = null; + Class<?> c = null; try { - S p = service.cast(Class.forName(cn, true, loader) - .newInstance()); - providers.put(cn, p); - return p; + c = Class.forName(cn, false, loader); } catch (ClassNotFoundException x) { fail(service, "Provider " + cn + " not found"); + } + if (!service.isAssignableFrom(c)) { + fail(service, + "Provider " + cn + " not a subtype"); + } + try { + S p = service.cast(c.newInstance()); + providers.put(cn, p); + return p; } catch (Throwable x) { fail(service, "Provider " + cn + " could not be instantiated: " + x, Modified: classlib6/core/src/openjdk/java/java/util/concurrent/Executors.java =================================================================== --- classlib6/core/src/openjdk/java/java/util/concurrent/Executors.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/util/concurrent/Executors.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -530,18 +530,17 @@ return AccessController.doPrivileged( new PrivilegedExceptionAction<T>() { public T run() throws Exception { - ClassLoader savedcl = null; Thread t = Thread.currentThread(); - try { ClassLoader cl = t.getContextClassLoader(); - if (ccl != cl) { + if (ccl == cl) { + return task.call(); + } else { t.setContextClassLoader(ccl); - savedcl = cl; - } + try { return task.call(); } finally { - if (savedcl != null) - t.setContextClassLoader(savedcl); + t.setContextClassLoader(cl); + } } } }, acc); Modified: classlib6/core/src/openjdk/java/java/util/logging/FileHandler.java =================================================================== --- classlib6/core/src/openjdk/java/java/util/logging/FileHandler.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/util/logging/FileHandler.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, 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 @@ -220,7 +220,7 @@ * @exception NullPointerException if pattern property is an empty String. */ public FileHandler() throws IOException, SecurityException { - checkAccess(); + checkPermission(); configure(); openFiles(); } @@ -246,7 +246,7 @@ if (pattern.length() < 1 ) { throw new IllegalArgumentException(); } - checkAccess(); + checkPermission(); configure(); this.pattern = pattern; this.limit = 0; @@ -278,7 +278,7 @@ if (pattern.length() < 1 ) { throw new IllegalArgumentException(); } - checkAccess(); + checkPermission(); configure(); this.pattern = pattern; this.limit = 0; @@ -315,7 +315,7 @@ if (limit < 0 || count < 1 || pattern.length() < 1) { throw new IllegalArgumentException(); } - checkAccess(); + checkPermission(); configure(); this.pattern = pattern; this.limit = limit; @@ -354,7 +354,7 @@ if (limit < 0 || count < 1 || pattern.length() < 1) { throw new IllegalArgumentException(); } - checkAccess(); + checkPermission(); configure(); this.pattern = pattern; this.limit = limit; @@ -367,7 +367,7 @@ // configured instance variables. private void openFiles() throws IOException { LogManager manager = LogManager.getLogManager(); - manager.checkAccess(); + manager.checkPermission(); if (count < 1) { throw new IllegalArgumentException("file count = " + count); } Modified: classlib6/core/src/openjdk/java/java/util/logging/Handler.java =================================================================== --- classlib6/core/src/openjdk/java/java/util/logging/Handler.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/util/logging/Handler.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, 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 @@ -111,7 +111,7 @@ * the caller does not have <tt>LoggingPermission("control")</tt>. */ public void setFormatter(Formatter newFormatter) throws SecurityException { - checkAccess(); + checkPermission(); // Check for a null pointer: newFormatter.getClass(); formatter = newFormatter; @@ -140,7 +140,7 @@ */ public void setEncoding(String encoding) throws SecurityException, java.io.UnsupportedEncodingException { - checkAccess(); + checkPermission(); if (encoding != null) { try { if(!java.nio.charset.Charset.isSupported(encoding)) { @@ -175,7 +175,7 @@ * the caller does not have <tt>LoggingPermission("control")</tt>. */ public void setFilter(Filter newFilter) throws SecurityException { - checkAccess(); + checkPermission(); filter = newFilter; } @@ -199,7 +199,7 @@ * the caller does not have <tt>LoggingPermission("control")</tt>. */ public void setErrorManager(ErrorManager em) { - checkAccess(); + checkPermission(); if (em == null) { throw new NullPointerException(); } @@ -213,7 +213,7 @@ * the caller does not have <tt>LoggingPermission("control")</tt>. */ public ErrorManager getErrorManager() { - checkAccess(); + checkPermission(); return errorManager; } @@ -253,7 +253,7 @@ if (newLevel == null) { throw new NullPointerException(); } - checkAccess(); + checkPermission(); logLevel = newLevel; } @@ -296,9 +296,9 @@ // If "sealed" is true, we check that the caller has // appropriate security privileges to update Handler // state and if not throw a SecurityException. - void checkAccess() throws SecurityException { + void checkPermission() throws SecurityException { if (sealed) { - manager.checkAccess(); + manager.checkPermission(); } } } Modified: classlib6/core/src/openjdk/java/java/util/logging/LogManager.java =================================================================== --- classlib6/core/src/openjdk/java/java/util/logging/LogManager.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/util/logging/LogManager.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, 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 @@ -303,7 +303,7 @@ if (l == null) { throw new NullPointerException(); } - checkAccess(); + checkPermission(); changes.addPropertyChangeListener(l); } @@ -322,7 +322,7 @@ * the caller does not have LoggingPermission("control"). */ public void removePropertyChangeListener(PropertyChangeListener l) throws SecurityException { - checkAccess(); + checkPermission(); changes.removePropertyChangeListener(l); } @@ -740,7 +740,7 @@ * @exception IOException if there are IO problems reading the configuration. */ public void readConfiguration() throws IOException, SecurityException { - checkAccess(); + checkPermission(); // if a configuration class is specified, load it and use it. String cname = System.getProperty("java.util.logging.config.class"); @@ -798,7 +798,7 @@ */ public void reset() throws SecurityException { - checkAccess(); + checkPermission(); synchronized (this) { props = new Properties(); // Since we are doing a reset we no longer want to initialize @@ -883,7 +883,7 @@ * @exception IOException if there are problems reading from the stream. */ public void readConfiguration(InputStream ins) throws IOException, SecurityException { - checkAccess(); + checkPermission(); reset(); // Load the properties @@ -1045,7 +1045,13 @@ } - private Permission ourPermission = new LoggingPermission("control", null); + private final Permission controlPermission = new LoggingPermission("control", null); + + void checkPermission() { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(controlPermission); + } /** * Check that the current context is trusted to modify the logging @@ -1058,11 +1064,7 @@ * the caller does not have LoggingPermission("control"). */ public void checkAccess() throws SecurityException { - SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - return; - } - sm.checkPermission(ourPermission); + checkPermission(); } // Nested class to represent a node in our tree of named loggers. Modified: classlib6/core/src/openjdk/java/java/util/logging/Logger.java =================================================================== --- classlib6/core/src/openjdk/java/java/util/logging/Logger.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/util/logging/Logger.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, 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 @@ -266,13 +266,13 @@ this.manager = manager; } - private void checkAccess() throws SecurityException { + private void checkPermission() throws SecurityException { if (!anonymous) { if (manager == null) { // Complete initialization of the global Logger. manager = LogManager.getLogManager(); } - manager.checkAccess(); + manager.checkPermission(); } } @@ -454,7 +454,7 @@ * the caller does not have LoggingPermission("control"). */ public synchronized void setFilter(Filter newFilter) throws SecurityException { - checkAccess(); + checkPermission(); filter = newFilter; } @@ -1145,7 +1145,7 @@ * the caller does not have LoggingPermission("control"). */ public void setLevel(Level newLevel) throws SecurityException { - checkAccess(); + checkPermission(); synchronized (treeLock) { levelObject = newLevel; updateEffectiveLevel(); @@ -1200,7 +1200,7 @@ public synchronized void addHandler(Handler handler) throws SecurityException { // Check for null handler handler.getClass(); - checkAccess(); + checkPermission(); if (handlers == null) { handlers = new ArrayList<Handler>(); } @@ -1217,7 +1217,7 @@ * the caller does not have LoggingPermission("control"). */ public synchronized void removeHandler(Handler handler) throws SecurityException { - checkAccess(); + checkPermission(); if (handler == null) { return; } @@ -1251,7 +1251,7 @@ * the caller does not have LoggingPermission("control"). */ public synchronized void setUseParentHandlers(boolean useParentHandlers) { - checkAccess(); + checkPermission(); this.useParentHandlers = useParentHandlers; } @@ -1388,7 +1388,7 @@ if (parent == null) { throw new NullPointerException(); } - manager.checkAccess(); + manager.checkPermission(); doSetParent(parent); } Modified: classlib6/core/src/openjdk/java/java/util/logging/MemoryHandler.java =================================================================== --- classlib6/core/src/openjdk/java/java/util/logging/MemoryHandler.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/util/logging/MemoryHandler.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, 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 @@ -238,7 +238,7 @@ throw new NullPointerException(); } LogManager manager = LogManager.getLogManager(); - checkAccess(); + checkPermission(); pushLevel = newLevel; } Modified: classlib6/core/src/openjdk/java/java/util/logging/StreamHandler.java =================================================================== --- classlib6/core/src/openjdk/java/java/util/logging/StreamHandler.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/java/java/util/logging/StreamHandler.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, 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 @@ -249,7 +249,7 @@ } private synchronized void flushAndClose() throws SecurityException { - checkAccess(); + checkPermission(); if (writer != null) { try { if (!doneHeader) { Modified: classlib6/core/src/openjdk/javax/javax/management/modelmbean/DescriptorSupport.java =================================================================== --- classlib6/core/src/openjdk/javax/javax/management/modelmbean/DescriptorSupport.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/javax/javax/management/modelmbean/DescriptorSupport.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, 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 @@ -1239,13 +1239,12 @@ return s.substring(1, s.length() - 1); } final String className = s.substring(1, slash); + final Constructor<?> constr; try { + ReflectUtil.checkPackageAccess(className); final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - if (contextClassLoader == null) { - ReflectUtil.checkPackageAccess(className); - } final Class<?> c = Class.forName(className, false, contextClassLoader); constr = c.getConstructor(new Class[] {String.class}); Modified: classlib6/core/src/openjdk/javax/javax/management/remote/rmi/RMIConnectionImpl.java =================================================================== --- classlib6/core/src/openjdk/javax/javax/management/remote/rmi/RMIConnectionImpl.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/javax/javax/management/remote/rmi/RMIConnectionImpl.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, 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 @@ -39,11 +39,17 @@ import java.rmi.MarshalledObject; import java.rmi.UnmarshalException; import java.rmi.server.Unreferenced; + import java.security.AccessControlContext; import java.security.AccessController; +import java.security.Permission; +import java.security.PermissionCollection; +import java.security.Permissions; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import java.security.ProtectionDomain; + import java.util.Arrays; import java.util.Collections; import java.util.Map; @@ -60,6 +66,7 @@ import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.MBeanRegistrationException; +import javax.management.MBeanPermission; import javax.management.MBeanServer; import javax.management.NotCompliantMBeanException; import javax.management.NotificationFilter; @@ -144,22 +151,46 @@ this.mbeanServer = rmiServer.getMBeanServer(); final ClassLoader dcl = defaultClassLoader; + this.classLoaderWithRepository = AccessController.doPrivileged( new PrivilegedAction<ClassLoaderWithRepository>() { public ClassLoaderWithRepository run() { return new ClassLoaderWithRepository( - getClassLoaderRepository(), + mbeanServer.getClassLoaderRepository(), dcl); } + }, + + withPermissions( new MBeanPermission("*", "getClassLoaderRepository"), + new RuntimePermission("createClassLoader")) + ); + this.defaultContextClassLoader = + AccessController.doPrivileged( + new PrivilegedAction<ClassLoader>() { + @Override + public ClassLoader run() { + return new CombinedClassLoader(Thread.currentThread().getContextClassLoader(), + dcl); + } }); - serverCommunicatorAdmin = new RMIServerCommunicatorAdmin(EnvHelp.getServerConnectionTimeout(env)); this.env = env; } + private static AccessControlContext withPermissions(Permission ... perms){ + Permissions col = new Permissions(); + + for (Permission thePerm : perms ) { + col.add(thePerm); + } + + final ProtectionDomain pd = new ProtectionDomain(null, col); + return new AccessControlContext( new ProtectionDomain[] { pd }); + } + private synchronized ServerNotifForwarder getServerNotifFwd() { // Lazily created when first use. Mainly when // addNotificationListener is first called. @@ -506,7 +537,7 @@ "connectionId=" + connectionId +" unwrapping query with defaultClassLoader."); - queryValue = unwrap(query, defaultClassLoader, QueryExp.class); + queryValue = unwrap(query, defaultContextClassLoader, QueryExp.class); try { final Object params[] = new Object[] { name, queryValue }; @@ -540,7 +571,7 @@ "connectionId=" + connectionId +" unwrapping query with defaultClassLoader."); - queryValue = unwrap(query, defaultClassLoader, QueryExp.class); + queryValue = unwrap(query, defaultContextClassLoader, QueryExp.class); try { final Object params[] = new Object[] { name, queryValue }; @@ -1314,16 +1345,6 @@ // private methods //------------------------------------------------------------------------ - private ClassLoaderRepository getClassLoaderRepository() { - return - AccessController.doPrivileged( - new PrivilegedAction<ClassLoaderRepository>() { - public ClassLoaderRepository run() { - return mbeanServer.getClassLoaderRepository(); - } - }); - } - private ClassLoader getClassLoader(final ObjectName name) throws InstanceNotFoundException { try { @@ -1333,7 +1354,9 @@ public ClassLoader run() throws InstanceNotFoundException { return mbeanServer.getClassLoader(name); } - }); + }, + withPermissions(new MBeanPermission("*", "getClassLoader")) + ); } catch (PrivilegedActionException pe) { throw (InstanceNotFoundException) extractException(pe); } @@ -1348,7 +1371,9 @@ public Object run() throws InstanceNotFoundException { return mbeanServer.getClassLoaderFor(name); } - }); + }, + withPermissions(new MBeanPermission("*", "getClassLoaderFor")) + ); } catch (PrivilegedActionException pe) { throw (InstanceNotFoundException) extractException(pe); } @@ -1575,7 +1600,8 @@ ClassLoader orderCL = AccessController.doPrivileged( new PrivilegedExceptionAction<ClassLoader>() { public ClassLoader run() throws Exception { - return new OrderClassLoaders(cl1, cl2); + return new CombinedClassLoader(Thread.currentThread().getContextClassLoader(), + new OrderClassLoaders(cl1, cl2)); } } ); @@ -1667,6 +1693,8 @@ private final ClassLoader defaultClassLoader; + private final ClassLoader defaultContextClassLoader; + private final ClassLoaderWithRepository classLoaderWithRepository; private boolean terminated = false; @@ -1751,4 +1779,43 @@ private static final ClassLogger logger = new ClassLogger("javax.management.remote.rmi", "RMIConnectionImpl"); + + private static final class CombinedClassLoader extends ClassLoader { + + private final static class ClassLoaderWrapper extends ClassLoader { + ClassLoaderWrapper(ClassLoader cl) { + super(cl); + } + + @Override + protected Class<?> loadClass(String name, boolean resolve) + throws ClassNotFoundException { + return super.loadClass(name, resolve); + } + }; + + final ClassLoaderWrapper defaultCL; + + private CombinedClassLoader(ClassLoader parent, ClassLoader defaultCL) { + super(parent); + this.defaultCL = new ClassLoaderWrapper(defaultCL); + } + + @Override + protected Class<?> loadClass(String name, boolean resolve) + throws ClassNotFoundException { + try { + super.loadClass(name, resolve); + } catch(Exception e) { + for(Throwable t = e; t != null; t = t.getCause()) { + if(t instanceof SecurityException) { + throw t==e?(SecurityException)t:new SecurityException(t.getMessage(), e); + } + } + } + final Class<?> cl = defaultCL.loadClass(name, resolve); + return cl; + } + + } } Modified: classlib6/core/src/openjdk/javax/javax/swing/text/DefaultFormatter.java =================================================================== --- classlib6/core/src/openjdk/javax/javax/swing/text/DefaultFormatter.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/javax/javax/swing/text/DefaultFormatter.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -24,6 +24,8 @@ */ package javax.swing.text; +import sun.reflect.misc.ConstructorUtil; + import java.io.Serializable; import java.lang.reflect.*; import java.text.ParseException; @@ -245,7 +247,7 @@ Constructor cons; try { - cons = vc.getConstructor(new Class[] { String.class }); + cons = ConstructorUtil.getConstructor(vc, new Class[]{String.class}); } catch (NoSuchMethodException nsme) { cons = null; Modified: classlib6/core/src/openjdk/sun/sun/misc/Service.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/misc/Service.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/misc/Service.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -284,12 +284,20 @@ } String cn = nextName; nextName = null; + Class<?> c = null; try { - return Class.forName(cn, true, loader).newInstance(); + c = Class.forName(cn, false, loader); } catch (ClassNotFoundException x) { fail(service, "Provider " + cn + " not found"); - } catch (Exception x) { + } + if (!service.isAssignableFrom(c)) { + fail(service, + "Provider " + cn + " not a subtype"); + } + try { + return service.cast(c.newInstance()); + } catch (Throwable x) { fail(service, "Provider " + cn + " could not be instantiated: " + x, x); Modified: classlib6/core/src/openjdk/sun/sun/rmi/registry/RegistryImpl.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/rmi/registry/RegistryImpl.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/rmi/registry/RegistryImpl.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, 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 @@ -405,7 +405,8 @@ */ perms.add(new SocketPermission("*", "connect,accept")); - perms.add(new RuntimePermission("accessClassInPackage.sun.*")); + perms.add(new RuntimePermission("accessClassInPackage.sun.jvmstat.*")); + perms.add(new RuntimePermission("accessClassInPackage.sun.jvm.hotspot.*")); perms.add(new FilePermission("<<ALL FILES>>", "read")); Modified: classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Cipher.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Cipher.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Cipher.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, 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 @@ -650,7 +650,7 @@ // see JCE spec protected int engineGetKeySize(Key key) throws InvalidKeyException { int n = P11SecretKeyFactory.convertKey - (token, key, keyAlgorithm).keyLength(); + (token, key, keyAlgorithm).length(); return n; } } Modified: classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Key.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Key.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Key.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, 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 @@ -46,6 +46,7 @@ import static sun.security.pkcs11.wrapper.PKCS11Constants.*; import sun.security.util.DerValue; +import sun.security.util.Length; /** * Key implementation classes. @@ -61,7 +62,7 @@ * @author Andreas Sterbenz * @since 1.5 */ -abstract class P11Key implements Key { +abstract class P11Key implements Key, Length { private final static String PUBLIC = "public"; private final static String PRIVATE = "private"; @@ -212,7 +213,11 @@ return s1; } - int keyLength() { + /** + * Return bit length of the key. + */ + @Override + public int length() { return keyLength; } Modified: classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11RSACipher.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11RSACipher.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11RSACipher.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, 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 @@ -201,7 +201,7 @@ } else { throw new InvalidKeyException("Unknown key type: " + p11Key); } - int n = (p11Key.keyLength() + 7) >> 3; + int n = (p11Key.length() + 7) >> 3; outputSize = n; buffer = new byte[n]; maxInputSize = encrypt ? (n - PKCS1_MIN_PADDING_LENGTH) : n; @@ -458,7 +458,7 @@ // see JCE spec protected int engineGetKeySize(Key key) throws InvalidKeyException { - int n = P11KeyFactory.convertKey(token, key, algorithm).keyLength(); + int n = P11KeyFactory.convertKey(token, key, algorithm).length(); return n; } } Modified: classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Signature.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Signature.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/pkcs11/P11Signature.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, 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 @@ -274,7 +274,7 @@ if (keyAlgorithm.equals("DSA")) { signature = new byte[40]; } else { - signature = new byte[(p11Key.keyLength() + 7) >> 3]; + signature = new byte[(p11Key.length() + 7) >> 3]; } if (type == T_UPDATE) { token.p11.C_VerifyFinal(session.id(), signature); @@ -359,7 +359,7 @@ if (keyAlgorithm.equals("RSA") && publicKey != p11Key) { int keyLen; if (publicKey instanceof P11Key) { - keyLen = ((P11Key) publicKey).keyLength(); + keyLen = ((P11Key) publicKey).length(); } else { keyLen = ((RSAKey) publicKey).getModulus().bitLength(); } @@ -620,7 +620,7 @@ private byte[] pkcs1Pad(byte[] data) { try { - int len = (p11Key.keyLength() + 7) >> 3; + int len = (p11Key.length() + 7) >> 3; RSAPadding padding = RSAPadding.getInstance (RSAPadding.PAD_BLOCKTYPE_1, len); byte[] padded = padding.pad(data); Modified: classlib6/core/src/openjdk/sun/sun/security/provider/SecureRandom.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/provider/SecureRandom.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/provider/SecureRandom.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, 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 @@ -56,12 +56,6 @@ private static final long serialVersionUID = 3581829991155417889L; - /** - * This static object will be seeded by SeedGenerator, and used - * to seed future instances of SecureRandom - */ - private static SecureRandom seeder; - private static final int DIGEST_SIZE = 20; private transient MessageDigest digest; private byte[] state; @@ -173,6 +167,28 @@ } /** + * This static object will be seeded by SeedGenerator, and used + * to seed future instances of SHA1PRNG SecureRandoms. + * + * Bloch, Effective Java Second Edition: Item 71 + */ + private static class SeederHolder { + + private static final SecureRandom seeder; + + static { + /* + * Call to SeedGenerator.generateSeed() to add additional + * seed material (likely from the Native implementation). + */ + seeder = new SecureRandom(SeedGenerator.getSystemEntropy()); + byte [] b = new byte[DIGEST_SIZE]; + SeedGenerator.generateSeed(b); + seeder.engineSetSeed(b); + } + } + + /** * Generates a user-specified number of random bytes. * * @param bytes the array to be filled in with random bytes. @@ -183,13 +199,8 @@ byte[] output = remainder; if (state == null) { - if (seeder == null) { - seeder = new SecureRandom(SeedGenerator.getSystemEntropy()); - seeder.engineSetSeed(engineGenerateSeed(DIGEST_SIZE)); - } - byte[] seed = new byte[DIGEST_SIZE]; - seeder.engineNextBytes(seed); + SeederHolder.seeder.engineNextBytes(seed); state = digest.digest(seed); } Modified: classlib6/core/src/openjdk/sun/sun/security/ssl/HandshakeInStream.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/ssl/HandshakeInStream.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/ssl/HandshakeInStream.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, 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 @@ -190,6 +190,7 @@ byte[] getBytes8() throws IOException { int len = getInt8(); + verifyLength(len); byte b[] = new byte[len]; read(b, 0, len); @@ -198,6 +199,7 @@ byte[] getBytes16() throws IOException { int len = getInt16(); + verifyLength(len); byte b[] = new byte[len]; read(b, 0, len); @@ -206,10 +208,19 @@ byte[] getBytes24() throws IOException { int len = getInt24(); + verifyLength(len); byte b[] = new byte[len]; read(b, 0, len); return b; } + // Is a length greater than available bytes in the record? + private void verifyLength(int len) throws SSLException { + if (len > available()) { + throw new SSLException( + "Not enough data to fill declared vector size"); + } + } + } Modified: classlib6/core/src/openjdk/sun/sun/security/ssl/Handshaker.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/ssl/Handshaker.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/ssl/Handshaker.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, 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 @@ -776,9 +776,9 @@ if (debug != null && Debug.isOn("handshake")) { System.out.println("RSA master secret generation error:"); e.printStackTrace(System.out); - System.out.println("Generating new random premaster secret"); } - preMasterSecret = RSAClientKeyExchange.generateDummySecret(protocolVersion); + preMasterSecret = + RSAClientKeyExchange.generateDummySecret(protocolVersion); // recursive call with new premaster secret return calculateMasterSecret(preMasterSecret, null); } @@ -821,9 +821,9 @@ System.out.println("RSA PreMasterSecret version error: expected" + protocolVersion + " or " + requestedVersion + ", decrypted: " + premasterVersion); - System.out.println("Generating new random premaster secret"); } - preMasterSecret = RSAClientKeyExchange.generateDummySecret(protocolVersion); + preMasterSecret = + RSAClientKeyExchange.generateDummySecret(protocolVersion); // recursive call with new premaster secret return calculateMasterSecret(preMasterSecret, null); } Modified: classlib6/core/src/openjdk/sun/sun/security/ssl/RSAClientKeyExchange.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/ssl/RSAClientKeyExchange.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/ssl/RSAClientKeyExchange.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, 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 @@ -36,6 +36,7 @@ import javax.net.ssl.*; import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; +import sun.security.util.KeyLength; /** * This is the client key exchange message (CLIENT --> SERVER) used with @@ -85,7 +86,8 @@ * it, using its RSA private key. Result is the same size as the * server's public key, and uses PKCS #1 block format 02. */ - RSAClientKeyExchange(ProtocolVersion protocolVersion, ProtocolVersion maxVersion, + RSAClientKeyExchange(ProtocolVersion protocolVersion, + ProtocolVersion maxVersion, SecureRandom generator, PublicKey publicKey) throws IOException { if (publicKey.getAlgorithm().equals("RSA") == false) { throw new SSLKeyException("Public key not of type RSA"); @@ -120,7 +122,8 @@ * Server gets the PKCS #1 (block format 02) data, decrypts * it with its private key. */ - RSAClientKeyExchange(ProtocolVersion currentVersion, HandshakeInStream input, + RSAClientKeyExchange(ProtocolVersion currentVersion, + ProtocolVersion maxVersion, HandshakeInStream input, int messageSize, PrivateKey privateKey) throws IOException { if (privateKey.getAlgorithm().equals("RSA") == false) { @@ -143,28 +146,119 @@ cipher.init(Cipher.UNWRAP_MODE, privateKey); preMaster = (SecretKey)cipher.unwrap(encrypted, "TlsRsaPremasterSecret", Cipher.SECRET_KEY); + + // polish the premaster secret + preMaster = polishPreMasterSecretKey( + currentVersion, maxVersion, preMaster, null); } catch (Exception e) { + // polish the premaster secret + preMaster = polishPreMasterSecretKey( + currentVersion, maxVersion, preMaster, e); + } + } + + /** + * To avoid vulnerabilities described by section 7.4.7.1, RFC 5246, + * treating incorrectly formatted message blocks and/or mismatched + * version numbers in a manner indistinguishable from correctly + * formatted RSA blocks. + * + * RFC 5246 describes the approach as : + * + * 1. Generate a string R of 46 random bytes + * + * 2. Decrypt the message to recover the plaintext M + * + * 3. If the PKCS#1 padding is not correct, or the length of message + * M is not exactly 48 bytes: + * pre_master_secret = ClientHello.client_version || R + * else If ClientHello.client_version <= TLS 1.0, and version + * number check is explicitly disabled: + * pre_master_secret = M + * else: + * pre_master_secret = ClientHello.client_version || M[2..47] + * + * Note that although TLS 1.2 is not supported in this release, we still + * want to make use of the above approach to provide better protection. + */ + private SecretKey polishPreMasterSecretKey( + ProtocolVersion currentVersion, ProtocolVersion clientHelloVersion, + SecretKey secretKey, Exception failoverException) { + + if (failoverException == null && secretKey != null) { + // check the length + byte[] encoded = secretKey.getEncoded(); + if (encoded == null) { // unable to get the encoded key + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "unable to get the plaintext of the premaster secret"); + } + + int keySize = KeyLength.getKeySize(secretKey); + if (keySize > 0 && keySize != 384) { // 384 = 48 * 8 + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "incorrect length of premaster secret: " + + (keySize/8)); + } + + return generateDummySecret(currentVersion); + } + + // The key size is exactly 48 bytes or not accessible. + // + // Conservatively, pass the checking to master secret + // calculation. + return secretKey; + } else if (encoded.length == 48) { + // check the version + if (clientHelloVersion.major == encoded[0] && + clientHelloVersion.minor == encoded[1]) { + + return secretKey; + } else if (clientHelloVersion.v <= ProtocolVersion.TLS10.v && + currentVersion.major == encoded[0] && + currentVersion.minor == encoded[1]) { /* - * Bogus decrypted ClientKeyExchange? If so, conjure a - * a random preMaster secret that will fail later during - * Finished message processing. This is a countermeasure against - * the "interactive RSA PKCS#1 encryption envelop attack" reported - * in June 1998. Preserving the executation path will - * mitigate timing attacks and force consistent error handling - * that will prevent an attacking client from differentiating - * different kinds of decrypted ClientKeyExchange bogosities. + * For compatibility, we maintain the behavior that the + * version in pre_master_secret can be the negotiated + * version for TLS v1.0 and SSL v3.0. */ + return secretKey; + } + if (debug != null && Debug.isOn("handshake")) { - System.out.println("Error decrypting premaster secret:"); - e.printStackTrace(System.out); - System.out.println("Generating random secret"); + System.out.println("Mismatching Protocol Versions, " + + "ClientHello.client_version is " + clientHelloVersion + + ", while PreMasterSecret.client_version is " + + ProtocolVersion.valueOf(encoded[0], encoded[1])); + } + return generateDummySecret(currentVersion); + } else { + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "incorrect length of premaster secret: " + + encoded.length); + } + return generateDummySecret(currentVersion); } - preMaster = generateDummySecret(currentVersion); } + + if (debug != null && Debug.isOn("handshake") && + failoverException != null) { + System.out.println("Error decrypting premaster secret:"); + failoverException.printStackTrace(System.out); + } + + return generateDummySecret(currentVersion); } // generate a premaster secret with the specified version number static SecretKey generateDummySecret(ProtocolVersion version) { + if (debug != null && Debug.isOn("handshake")) { + System.out.println("Generating a random fake premaster secret"); + } + try { KeyGenerator kg = JsseJce.getKeyGenerator("SunTlsRsaPremasterSecret"); Modified: classlib6/core/src/openjdk/sun/sun/security/ssl/ServerHandshaker.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/ssl/ServerHandshaker.java 2013-02-13 20:12:29 UTC (rev 5947) +++ classlib6/core/src/openjdk/sun/sun/security/ssl/ServerHandshaker.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, 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 @@ -190,8 +190,9 @@ * temporary one used for non-export or signing-only * certificates/keys. */ - RSAClientKeyExchange pms = new RSAClientKeyExchange - (protocolVersion, input, message_len, privateKey); + RSAClientKeyExchange pms = new RSAClientKeyExchange( + protocolVersion, clientRequestedVersion, + input, message_len, privateKey); preMasterSecret = this.clientKeyExchange(pms); break; case K_KRB5: Added: classlib6/core/src/openjdk/sun/sun/security/util/KeyLength.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/util/KeyLength.java (rev 0) +++ classlib6/core/src/openjdk/sun/sun/security/util/KeyLength.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2012, 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 + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.util; + +import java.security.Key; +import java.security.PrivilegedAction; +import java.security.AccessController; +import java.security.interfaces.ECKey; +import java.security.interfaces.RSAKey; +import java.security.interfaces.DSAKey; +import javax.crypto.SecretKey; +import javax.crypto.interfaces.DHKey; + +/** + * A utility class to get key length + */ +public final class KeyLength { + + /** + * Returns the key size of the given key object in bits. + * + * @param key the key object, cannot be null + * @return the key size of the given key object in bits, or -1 if the + * key size is not accessible + */ + final public static int getKeySize(Key key) { + int size = -1; + + if (key instanceof Length) { + try { + Length ruler = (Length)key; + size = ruler.length(); + } catch (UnsupportedOperationException usoe) { + // ignore the exception + } + + if (size >= 0) { + return size; + } + } + + // try to parse the length from key specification + if (key instanceof SecretKey) { + SecretKey sk = (SecretKey)key; + String format = sk.getFormat(); + if ("RAW".equals(format) && sk.getEncoded() != null) { + size = (sk.getEncoded().length * 8); + } // Otherwise, it may be a unextractable key of PKCS#11, or + // a key we are not able to handle. + } else if (key instanceof RSAKey) { + RSAKey pubk = (RSAKey)key; + size = pubk.getModulus().bitLength(); + } else if (key instanceof ECKey) { + ECKey pubk = (ECKey)key; + size = pubk.getParams().getOrder().bitLength(); + } else if (key instanceof DSAKey) { + DSAKey pubk = (DSAKey)key; + size = pubk.getParams().getP().bitLength(); + } else if (key instanceof DHKey) { + DHKey pubk = (DHKey)key; + size = pubk.getParams().getP().bitLength(); + } // Otherwise, it may be a unextractable key of PKCS#11, or + // a key we are not able to handle. + + return size; + } +} + Added: classlib6/core/src/openjdk/sun/sun/security/util/Length.java =================================================================== --- classlib6/core/src/openjdk/sun/sun/security/util/Length.java (rev 0) +++ classlib6/core/src/openjdk/sun/sun/security/util/Length.java 2013-02-16 19:08:48 UTC (rev 5948) @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012, 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 + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRA... [truncated message content] |