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>
* java/lang/ClassLoader.java (resolveClass0): Transform

View File

@ -1,5 +1,5 @@
/* 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.
@ -53,7 +53,6 @@ public class SecureRandom extends Random
//Serialized Field
long counter = 0; //Serialized
MessageDigest digest = null;
Provider provider = null;
byte[] randomBytes = null; //Always null
int randomBytesUsed = 0;
@ -83,41 +82,29 @@ public class SecureRandom extends Random
Enumeration e;
for (i = 0; i < p.length; i++)
{
e = p[i].propertyNames();
while (e.hasMoreElements())
{
key = (String) e.nextElement();
if (key.startsWith("SecureRandom."))
if ((classname = p[i].getProperty(key)) != null)
break;
e = p[i].propertyNames();
while (e.hasMoreElements())
{
key = (String) e.nextElement();
if (key.startsWith("SECURERANDOM."))
{
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)
// throw new NoSuchAlgorithmException();
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");
}
// Nothing found. Fall back to SHA1PRNG
secureRandomSpi = new gnu.java.security.provider.SHA1PRNG();
}
/**
@ -167,40 +154,17 @@ public class SecureRandom extends Random
NoSuchAlgorithmException
{
Provider p[] = Security.getProviders();
//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++)
for (int i = 0; i < p.length; i++)
{
if ((classname = p[i].getProperty(key.toString())) != null)
break;
}
if (classname == null)
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");
try
{
return getInstance(algorithm, p[i]);
}
catch (NoSuchAlgorithmException ignored) { }
}
// None found.
throw new NoSuchAlgorithmException(algorithm);
}
/**
@ -222,33 +186,91 @@ public class SecureRandom extends Random
Provider p = Security.getProvider(provider);
if (p == null)
throw new NoSuchProviderException();
return getInstance(algorithm, p);
}
//Format of Key: SecureRandom.algName
StringBuffer key = new StringBuffer("SecureRandom.");
key.append(algorithm);
/**
Returns an instance of a SecureRandom. It creates the class for
the specified algorithm from the given provider.
String classname = p.getProperty(key.toString());
if (classname == null)
throw new NoSuchAlgorithmException();
@param algorithm The SecureRandom algorithm to create.
@param provider The provider to get the instance from.
try
{
return new SecureRandom((SecureRandomSpi) Class.forName(classname).
newInstance(), p);
}
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");
}
@throws NoSuchAlgorithmException If the algorithm cannot be found, or
if the class cannot be instantiated.
*/
public static SecureRandom getInstance(String algorithm,
Provider provider) throws
NoSuchAlgorithmException
{
return getInstance(algorithm, provider, true);
}
/**
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;
String name;
while ((name = secprops.getProperty("security.provider." + i++)) !=
while ((name = secprops.getProperty("security.provider." + i)) !=
null)
{
Exception exception = null;
@ -97,7 +97,6 @@ public final class Security extends Object
try
{
providers.addElement(Class.forName(name).newInstance());
i++;
}
catch (ClassNotFoundException x)
{
@ -114,6 +113,7 @@ public final class Security extends Object
if (exception != null)
System.err.println ("Error loading security provider " + name
+ ": " + exception);
i++;
}
}
catch (FileNotFoundException ignored)