SecurityRandom (digest): Removed field.

2002-12-13  Casey Marshall  <rsdio@metastatic.org>
	    Mark Wielaard  <mark@klomp.org>

	* java/security/SecurityRandom (digest): Removed field.
	(SecureRandom): Check all providers for case-insensitive SecureRandom
	implementation. Don't ignore classname == null. Fallback to SHA1PRNG
	if necessary.
	(getInstance(String,Provider,boolean): New method.
	(getInstance(String)): Use new method.
	(getInstance(String,String)): Likewise.
	(getInstance(String,Provider)): Likewise.

2002-12-13  Casey Marshall  <rsdio@metastatic.org>

	* java/security/Security.java (loadProviders): Increment i only once.

Co-Authored-By: Mark Wielaard <mark@klomp.org>

From-SVN: r60099
This commit is contained in:
Casey Marshall 2002-12-13 14:21:07 +00:00 committed by Mark Wielaard
parent 697d8028c2
commit b4f145f326
3 changed files with 128 additions and 90 deletions

View File

@ -1,3 +1,19 @@
2002-12-13 Casey Marshall <rsdio@metastatic.org>
Mark Wielaard <mark@klomp.org>
* java/security/SecurityRandom (digest): Removed field.
(SecureRandom): Check all providers for case-insensitive SecureRandom
implementation. Don't ignore classname == null. Fallback to SHA1PRNG
if necessary.
(getInstance(String,Provider,boolean): New method.
(getInstance(String)): Use new method.
(getInstance(String,String)): Likewise.
(getInstance(String,Provider)): Likewise.
2002-12-13 Casey Marshall <rsdio@metastatic.org>
* java/security/Security.java (loadProviders): Increment i only once.
2002-12-12 Mark Wielaard <mark@klomp.org> 2002-12-12 Mark Wielaard <mark@klomp.org>
* java/lang/ClassLoader.java (resolveClass0): Transform * java/lang/ClassLoader.java (resolveClass0): Transform

View File

@ -1,5 +1,5 @@
/* SecureRandom.java --- Secure Random class implmentation /* SecureRandom.java --- Secure Random class implmentation
Copyright (C) 1999, 2001 Free Software Foundation, Inc. Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath. This file is part of GNU Classpath.
@ -53,7 +53,6 @@ public class SecureRandom extends Random
//Serialized Field //Serialized Field
long counter = 0; //Serialized long counter = 0; //Serialized
MessageDigest digest = null;
Provider provider = null; Provider provider = null;
byte[] randomBytes = null; //Always null byte[] randomBytes = null; //Always null
int randomBytesUsed = 0; int randomBytesUsed = 0;
@ -83,41 +82,29 @@ public class SecureRandom extends Random
Enumeration e; Enumeration e;
for (i = 0; i < p.length; i++) for (i = 0; i < p.length; i++)
{ {
e = p[i].propertyNames(); e = p[i].propertyNames();
while (e.hasMoreElements()) while (e.hasMoreElements())
{ {
key = (String) e.nextElement(); key = (String) e.nextElement();
if (key.startsWith("SecureRandom.")) if (key.startsWith("SECURERANDOM."))
if ((classname = p[i].getProperty(key)) != null) {
break; if ((classname = p[i].getProperty(key)) != null)
{
try
{
secureRandomSpi = (SecureRandomSpi) Class.
forName(classname).newInstance();
provider = p[i];
return;
}
catch (Throwable ignore) { }
}
}
} }
if (classname != null)
break;
} }
//if( classname == null) // Nothing found. Fall back to SHA1PRNG
// throw new NoSuchAlgorithmException(); secureRandomSpi = new gnu.java.security.provider.SHA1PRNG();
try
{
this.secureRandomSpi =
(SecureRandomSpi) Class.forName(classname).newInstance();
//s.algorithm = algorithm;
this.provider = p[i];
}
catch (ClassNotFoundException cnfe)
{
//throw new NoSuchAlgorithmException("Class not found");
}
catch (InstantiationException ie)
{
//throw new NoSuchAlgorithmException("Class instantiation failed");
}
catch (IllegalAccessException iae)
{
//throw new NoSuchAlgorithmException("Illegal Access");
}
} }
/** /**
@ -167,40 +154,17 @@ public class SecureRandom extends Random
NoSuchAlgorithmException NoSuchAlgorithmException
{ {
Provider p[] = Security.getProviders(); Provider p[] = Security.getProviders();
for (int i = 0; i < p.length; i++)
//Format of Key: SecureRandom.algname
StringBuffer key = new StringBuffer("SecureRandom.");
key.append(algorithm);
String classname = null;
int i;
for (i = 0; i < p.length; i++)
{ {
if ((classname = p[i].getProperty(key.toString())) != null) try
break; {
} return getInstance(algorithm, p[i]);
}
if (classname == null) catch (NoSuchAlgorithmException ignored) { }
throw new NoSuchAlgorithmException();
try
{
return new SecureRandom((SecureRandomSpi) Class.forName(classname).
newInstance(), p[i]);
}
catch (ClassNotFoundException cnfe)
{
throw new NoSuchAlgorithmException("Class not found");
}
catch (InstantiationException ie)
{
throw new NoSuchAlgorithmException("Class instantiation failed");
}
catch (IllegalAccessException iae)
{
throw new NoSuchAlgorithmException("Illegal Access");
} }
// None found.
throw new NoSuchAlgorithmException(algorithm);
} }
/** /**
@ -222,33 +186,91 @@ public class SecureRandom extends Random
Provider p = Security.getProvider(provider); Provider p = Security.getProvider(provider);
if (p == null) if (p == null)
throw new NoSuchProviderException(); throw new NoSuchProviderException();
return getInstance(algorithm, p);
}
//Format of Key: SecureRandom.algName /**
StringBuffer key = new StringBuffer("SecureRandom."); Returns an instance of a SecureRandom. It creates the class for
key.append(algorithm); the specified algorithm from the given provider.
String classname = p.getProperty(key.toString()); @param algorithm The SecureRandom algorithm to create.
if (classname == null) @param provider The provider to get the instance from.
throw new NoSuchAlgorithmException();
try @throws NoSuchAlgorithmException If the algorithm cannot be found, or
{ if the class cannot be instantiated.
return new SecureRandom((SecureRandomSpi) Class.forName(classname). */
newInstance(), p); public static SecureRandom getInstance(String algorithm,
} Provider provider) throws
catch (ClassNotFoundException cnfe) NoSuchAlgorithmException
{ {
throw new NoSuchAlgorithmException("Class not found"); return getInstance(algorithm, provider, true);
} }
catch (InstantiationException ie)
{
throw new NoSuchAlgorithmException("Class instantiation failed");
}
catch (IllegalAccessException iae)
{
throw new NoSuchAlgorithmException("Illegal Access");
}
/**
Creates the instance of SecureRandom, recursing to resolve aliases.
@param algorithm The SecureRandom algorithm to create.
@param provider The provider to get the implementation from.
@param recurse Whether or not to recurse to resolve aliases.
@throws NoSuchAlgorithmException If the algorithm cannot be found,
if there are too many aliases, or if the class cannot be
instantiated.
*/
private static SecureRandom getInstance(String algorithm,
Provider provider,
boolean recurse)
throws NoSuchAlgorithmException
{
String msg = algorithm;
for (Enumeration e = provider.propertyNames(); e.hasMoreElements(); )
{
// We could replace the boolean with an integer, incrementing it
// every
String key = (String) e.nextElement();
if (key.startsWith("SECURERANDOM.")
&& key.substring(13).equalsIgnoreCase(algorithm))
{
try
{
Class c = Class.forName(provider.getProperty(key));
return new SecureRandom((SecureRandomSpi) c.newInstance(),
provider);
}
catch (Throwable ignored) { }
}
else if (key.startsWith("ALG.ALIAS.SECURERANDOM.")
&& key.substring(23).equalsIgnoreCase(algorithm) && recurse)
{
try
{
// First see if this alias refers to a class in this
// provider.
return getInstance(provider.getProperty(key), provider, false);
}
catch (NoSuchAlgorithmException nsae)
{
Provider[] provs = Security.getProviders();
for (int i = 0; i < provs.length; i++)
{
if (provs[i] == provider)
continue;
// Now try other providers for the implementation
try
{
return getInstance(provider.getProperty(key),
provs[i], false);
}
catch (NoSuchAlgorithmException nsae2)
{
msg = nsae2.getMessage();
}
}
}
}
}
throw new NoSuchAlgorithmException(algorithm);
} }
/** /**

View File

@ -89,7 +89,7 @@ public final class Security extends Object
int i = 1; int i = 1;
String name; String name;
while ((name = secprops.getProperty("security.provider." + i++)) != while ((name = secprops.getProperty("security.provider." + i)) !=
null) null)
{ {
Exception exception = null; Exception exception = null;
@ -97,7 +97,6 @@ public final class Security extends Object
try try
{ {
providers.addElement(Class.forName(name).newInstance()); providers.addElement(Class.forName(name).newInstance());
i++;
} }
catch (ClassNotFoundException x) catch (ClassNotFoundException x)
{ {
@ -114,6 +113,7 @@ public final class Security extends Object
if (exception != null) if (exception != null)
System.err.println ("Error loading security provider " + name System.err.println ("Error loading security provider " + name
+ ": " + exception); + ": " + exception);
i++;
} }
} }
catch (FileNotFoundException ignored) catch (FileNotFoundException ignored)