Merged gcj-eclipse branch to trunk.
From-SVN: r120621
This commit is contained in:
@@ -0,0 +1 @@
|
||||
Configuration.java
|
||||
@@ -79,158 +79,170 @@ public final class Engine
|
||||
/** This class cannot be instantiated. */
|
||||
private Engine() { }
|
||||
|
||||
// Class method.
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the implementation for <i>algorithm</i> for service
|
||||
* <i>service</i> from <i>provider</i>. The service is e.g.
|
||||
* "Signature", and the algorithm "DSA".
|
||||
*
|
||||
* @param service The service name.
|
||||
* Return the implementation for <i>algorithm</i> for service <i>service</i>
|
||||
* from <i>provider</i>. The service is e.g. "Signature", and the algorithm
|
||||
* "DSA".
|
||||
*
|
||||
* @param service The service name.
|
||||
* @param algorithm The name of the algorithm to get.
|
||||
* @param provider The provider to get the implementation from.
|
||||
* @return The engine class for the specified algorithm; the object
|
||||
* returned is typically a subclass of the SPI class for that
|
||||
* service, but callers should check that this is so.
|
||||
* @throws NoSuchAlgorithmException If the implementation cannot be
|
||||
* found or cannot be instantiated.
|
||||
* @throws InvocationTargetException If the SPI class's constructor
|
||||
* throws an exception.
|
||||
* @throws IllegalArgumentException If any of the three arguments are null.
|
||||
* @param provider The provider to get the implementation from.
|
||||
* @return The engine class for the specified algorithm; the object returned
|
||||
* is typically a subclass of the SPI class for that service, but
|
||||
* callers should check that this is so.
|
||||
* @throws NoSuchAlgorithmException If the implementation cannot be found or
|
||||
* cannot be instantiated.
|
||||
* @throws InvocationTargetException If the SPI class's constructor throws an
|
||||
* exception.
|
||||
* @throws IllegalArgumentException If any of the three arguments is null.
|
||||
*/
|
||||
public static Object getInstance(String service, String algorithm,
|
||||
Provider provider)
|
||||
throws InvocationTargetException, NoSuchAlgorithmException
|
||||
throws InvocationTargetException, NoSuchAlgorithmException
|
||||
{
|
||||
return getInstance(service, algorithm, provider, NO_ARGS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the implementation for <i>algorithm</i> for service
|
||||
* <i>service</i> from <i>provider</i>, passing <i>initArgs</i> to the
|
||||
* SPI class's constructor (which cannot be null; pass a zero-length
|
||||
* array if the SPI takes no arguments). The service is e.g.
|
||||
* "Signature", and the algorithm "DSA".
|
||||
*
|
||||
* @param service The service name.
|
||||
* Return the implementation for <i>algorithm</i> for service <i>service</i>
|
||||
* from <i>provider</i>, passing <i>initArgs</i> to the SPI class's
|
||||
* constructor (which cannot be null; pass a zero-length array if the SPI
|
||||
* takes no arguments). The service is e.g. "Signature", and the algorithm
|
||||
* "DSA".
|
||||
*
|
||||
* @param service The service name.
|
||||
* @param algorithm The name of the algorithm to get.
|
||||
* @param provider The provider to get the implementation from.
|
||||
* @param initArgs The arguments to pass to the SPI class's
|
||||
* constructor (cannot be null).
|
||||
* @return The engine class for the specified algorithm; the object
|
||||
* returned is typically a subclass of the SPI class for that
|
||||
* service, but callers should check that this is so.
|
||||
* @throws NoSuchAlgorithmException If the implementation cannot be
|
||||
* found or cannot be instantiated.
|
||||
* @throws InvocationTargetException If the SPI class's constructor
|
||||
* throws an exception.
|
||||
* @throws IllegalArgumentException If any of the four arguments are null.
|
||||
* @param provider The provider to get the implementation from.
|
||||
* @param initArgs The arguments to pass to the SPI class's constructor
|
||||
* (cannot be null).
|
||||
* @return The engine class for the specified algorithm; the object returned
|
||||
* is typically a subclass of the SPI class for that service, but
|
||||
* callers should check that this is so.
|
||||
* @throws NoSuchAlgorithmException If the implementation cannot be found or
|
||||
* cannot be instantiated.
|
||||
* @throws InvocationTargetException If the SPI class's constructor throws an
|
||||
* exception.
|
||||
* @throws IllegalArgumentException If any of the four arguments is
|
||||
* <code>null</code> or if either <code>service</code>, or
|
||||
* <code>algorithm</code> is an empty string.
|
||||
*/
|
||||
public static Object getInstance(String service, String algorithm,
|
||||
Provider provider, Object[] initArgs)
|
||||
throws InvocationTargetException, NoSuchAlgorithmException
|
||||
throws InvocationTargetException, NoSuchAlgorithmException
|
||||
{
|
||||
if (service != null)
|
||||
service = service.trim();
|
||||
if (service == null)
|
||||
throw new IllegalArgumentException("service MUST NOT be null");
|
||||
service = service.trim();
|
||||
if (service.length() == 0)
|
||||
throw new IllegalArgumentException("service MUST NOT be empty");
|
||||
if (algorithm == null)
|
||||
throw new IllegalArgumentException("algorithm MUST NOT be null");
|
||||
algorithm = algorithm.trim();
|
||||
if (algorithm.length() == 0)
|
||||
throw new IllegalArgumentException("algorithm MUST NOT be empty");
|
||||
if (provider == null)
|
||||
throw new IllegalArgumentException("provider MUST NOT be null");
|
||||
if (initArgs == null)
|
||||
throw new IllegalArgumentException("Constructor's parameters MUST NOT be null");
|
||||
|
||||
if (algorithm != null)
|
||||
algorithm = algorithm.trim();
|
||||
|
||||
if (service == null || service.length() == 0
|
||||
|| algorithm == null || algorithm.length() == 0
|
||||
|| provider == null || initArgs == null)
|
||||
throw new IllegalArgumentException();
|
||||
|
||||
|
||||
Enumeration enumer = provider.propertyNames();
|
||||
String key;
|
||||
String alias;
|
||||
int count = 0;
|
||||
boolean algorithmFound = false;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
while (enumer.hasMoreElements())
|
||||
{
|
||||
key = (String) enumer.nextElement();
|
||||
|
||||
if (key.equalsIgnoreCase(service + "." + algorithm))
|
||||
{
|
||||
// remove the service portion from the key
|
||||
algorithm = key.substring(service.length() + 1);
|
||||
|
||||
algorithmFound = true;
|
||||
break;
|
||||
|
||||
}
|
||||
else if (key.equalsIgnoreCase(ALG_ALIAS + service + "." + algorithm))
|
||||
{
|
||||
|
||||
alias = (String) provider.getProperty(key);
|
||||
|
||||
if (! algorithm.equalsIgnoreCase(alias)) // does not refer to itself
|
||||
{
|
||||
algorithm = alias;
|
||||
if (count++ > MAX_ALIASES)
|
||||
throw new NoSuchAlgorithmException("too many aliases");
|
||||
|
||||
{
|
||||
sb.append("Algorithm [").append(algorithm)
|
||||
.append("] of type [").append(service)
|
||||
.append("] from provider [").append(provider)
|
||||
.append("] has too many aliases");
|
||||
throw new NoSuchAlgorithmException(sb.toString());
|
||||
}
|
||||
// need to reset enumeration to now look for the alias
|
||||
enumer = provider.propertyNames();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (! algorithmFound)
|
||||
{
|
||||
throw new NoSuchAlgorithmException(algorithm);
|
||||
sb.append("Algorithm [").append(algorithm).append("] of type [")
|
||||
.append(service).append("] from provider [")
|
||||
.append(provider).append("] is not found");
|
||||
throw new NoSuchAlgorithmException(sb.toString());
|
||||
}
|
||||
|
||||
|
||||
// Find and instantiate the implementation.
|
||||
|
||||
// Find and instantiate the implementation
|
||||
Class clazz = null;
|
||||
ClassLoader loader = provider.getClass().getClassLoader();
|
||||
Constructor constructor = null;
|
||||
String error = algorithm;
|
||||
|
||||
String className = provider.getProperty(service + "." + algorithm);
|
||||
sb.append("Class [").append(className).append("] for algorithm [")
|
||||
.append(algorithm).append("] of type [").append(service)
|
||||
.append("] from provider [").append(provider).append("] ");
|
||||
Throwable cause = null;
|
||||
try
|
||||
{
|
||||
if (loader != null)
|
||||
clazz = loader.loadClass(provider.getProperty(service+"."+algorithm));
|
||||
clazz = loader.loadClass(className);
|
||||
else
|
||||
clazz = Class.forName(provider.getProperty(service+"."+algorithm));
|
||||
clazz = Class.forName(className);
|
||||
constructor = getCompatibleConstructor(clazz, initArgs);
|
||||
return constructor.newInstance(initArgs);
|
||||
}
|
||||
catch (ClassNotFoundException cnfe)
|
||||
catch (ClassNotFoundException x)
|
||||
{
|
||||
error = "class not found: " + algorithm;
|
||||
sb.append("cannot not be found");
|
||||
cause = x;
|
||||
}
|
||||
catch (IllegalAccessException iae)
|
||||
catch (IllegalAccessException x)
|
||||
{
|
||||
error = "illegal access: " + iae.getMessage();
|
||||
sb.append("cannot be accessed");
|
||||
cause = x;
|
||||
}
|
||||
catch (InstantiationException ie)
|
||||
catch (InstantiationException x)
|
||||
{
|
||||
error = "instantiation exception: " + ie.getMessage();
|
||||
sb.append("cannot be instantiated");
|
||||
cause = x;
|
||||
}
|
||||
catch (ExceptionInInitializerError eiie)
|
||||
catch (ExceptionInInitializerError x)
|
||||
{
|
||||
error = "exception in initializer: " + eiie.getMessage();
|
||||
sb.append("cannot be initialized");
|
||||
cause = x;
|
||||
}
|
||||
catch (SecurityException se)
|
||||
catch (SecurityException x)
|
||||
{
|
||||
error = "security exception: " + se.getMessage();
|
||||
sb.append("caused a security violation");
|
||||
cause = x;
|
||||
}
|
||||
catch (NoSuchMethodException nsme)
|
||||
catch (NoSuchMethodException x)
|
||||
{
|
||||
error = "no appropriate constructor found";
|
||||
sb.append("does not have/expose an appropriate constructor");
|
||||
cause = x;
|
||||
}
|
||||
|
||||
throw new NoSuchAlgorithmException(error);
|
||||
NoSuchAlgorithmException x = new NoSuchAlgorithmException(sb.toString());
|
||||
x.initCause(cause);
|
||||
throw x;
|
||||
}
|
||||
|
||||
// Own methods.
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Find a constructor in the given class that can take the specified
|
||||
* argument list, allowing any of which to be null.
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/* Requires.java -- mark methods as requiring permission.
|
||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is a part of GNU Classpath.
|
||||
|
||||
GNU Classpath is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or (at
|
||||
your option) any later version.
|
||||
|
||||
GNU Classpath 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 for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Classpath; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
|
||||
Linking this library statically or dynamically with other modules is
|
||||
making a combined work based on this library. Thus, the terms and
|
||||
conditions of the GNU General Public License cover the whole
|
||||
combination.
|
||||
|
||||
As a special exception, the copyright holders of this library give you
|
||||
permission to link this library with independent modules to produce an
|
||||
executable, regardless of the license terms of these independent
|
||||
modules, and to copy and distribute the resulting executable under
|
||||
terms of your choice, provided that you also meet, for each linked
|
||||
independent module, the terms and conditions of the license of that
|
||||
module. An independent module is a module which is not derived from
|
||||
or based on this library. If you modify this library, you may extend
|
||||
this exception to your version of the library, but you are not
|
||||
obligated to do so. If you do not wish to do so, delete this
|
||||
exception statement from your version. */
|
||||
|
||||
|
||||
package gnu.java.security;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.Target;
|
||||
import static java.lang.annotation.ElementType.METHOD;
|
||||
import static java.lang.annotation.RetentionPolicy.CLASS;
|
||||
import java.security.Permission;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @author Casey Marshall (csm@gnu.org)
|
||||
*/
|
||||
@Documented @Retention(CLASS) @Target(METHOD)
|
||||
public @interface Requires
|
||||
{
|
||||
Class<? extends Permission> permissionClass();
|
||||
String target();
|
||||
String action();
|
||||
}
|
||||
@@ -49,7 +49,7 @@ import java.security.PrivilegedAction;
|
||||
* String port = AccessController.doPrivileged(action);
|
||||
* </code>
|
||||
*/
|
||||
public class GetPropertyAction implements PrivilegedAction
|
||||
public class GetPropertyAction implements PrivilegedAction<String>
|
||||
{
|
||||
String name;
|
||||
String value = null;
|
||||
@@ -68,7 +68,7 @@ public class GetPropertyAction implements PrivilegedAction
|
||||
setParameters(propName, defaultValue);
|
||||
}
|
||||
|
||||
public Object run()
|
||||
public String run()
|
||||
{
|
||||
return System.getProperty(name, value);
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ import java.security.Security;
|
||||
* String passwd = AccessController.doPrivileged(action);
|
||||
* </code>
|
||||
*/
|
||||
public class GetSecurityPropertyAction implements PrivilegedAction
|
||||
public class GetSecurityPropertyAction implements PrivilegedAction<String>
|
||||
{
|
||||
private String name;
|
||||
private String value;
|
||||
@@ -83,7 +83,7 @@ public class GetSecurityPropertyAction implements PrivilegedAction
|
||||
return this;
|
||||
}
|
||||
|
||||
public Object run()
|
||||
public String run()
|
||||
{
|
||||
String val = Security.getProperty(name);
|
||||
if (val == null)
|
||||
|
||||
@@ -81,11 +81,11 @@ public class RSAKeyPairRawCodec
|
||||
* the <code>toByteArray()</code> method on the RSA parameter <code>e</code>.
|
||||
* </li>
|
||||
* </ol>
|
||||
*
|
||||
*
|
||||
* @param key the key to encode.
|
||||
* @return the <i>Raw</i> format encoding of the designated key.
|
||||
* @exception IllegalArgumentException if the designated key is not an RSA
|
||||
* one.
|
||||
* one.
|
||||
*/
|
||||
public byte[] encodePublicKey(PublicKey key)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
/* ByteBufferOutputStream.java -- output stream with a growable underlying
|
||||
byte buffer.
|
||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is a part of GNU Classpath.
|
||||
|
||||
GNU Classpath is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or (at
|
||||
your option) any later version.
|
||||
|
||||
GNU Classpath 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 for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Classpath; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
|
||||
Linking this library statically or dynamically with other modules is
|
||||
making a combined work based on this library. Thus, the terms and
|
||||
conditions of the GNU General Public License cover the whole
|
||||
combination.
|
||||
|
||||
As a special exception, the copyright holders of this library give you
|
||||
permission to link this library with independent modules to produce an
|
||||
executable, regardless of the license terms of these independent
|
||||
modules, and to copy and distribute the resulting executable under
|
||||
terms of your choice, provided that you also meet, for each linked
|
||||
independent module, the terms and conditions of the license of that
|
||||
module. An independent module is a module which is not derived from
|
||||
or based on this library. If you modify this library, you may extend
|
||||
this exception to your version of the library, but you are not
|
||||
obligated to do so. If you do not wish to do so, delete this
|
||||
exception statement from your version. */
|
||||
|
||||
|
||||
package gnu.java.security.util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
/**
|
||||
* An output stream that writes bytes to a ByteBuffer, which will be resized
|
||||
* if more space is needed.
|
||||
*
|
||||
* @author Casey Marshall (csm@gnu.org)
|
||||
*/
|
||||
public class ByteBufferOutputStream extends OutputStream
|
||||
{
|
||||
private ByteBuffer buffer;
|
||||
|
||||
public ByteBufferOutputStream()
|
||||
{
|
||||
this(256);
|
||||
}
|
||||
|
||||
public ByteBufferOutputStream(int initialCapacity)
|
||||
{
|
||||
buffer = ByteBuffer.allocate(initialCapacity);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.io.OutputStream#write(int)
|
||||
*/
|
||||
public @Override synchronized void write(int b) throws IOException
|
||||
{
|
||||
if (!buffer.hasRemaining())
|
||||
growBuffer();
|
||||
buffer.put((byte) b);
|
||||
}
|
||||
|
||||
public @Override synchronized void write(byte[] b, int offset, int length)
|
||||
{
|
||||
if (buffer.remaining() < length)
|
||||
growBuffer();
|
||||
buffer.put(b, offset, length);
|
||||
}
|
||||
|
||||
public @Override void write(byte[] b)
|
||||
{
|
||||
write(b, 0, b.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current state of the buffer. The returned buffer will have
|
||||
* its position set to zero, its capacity set to the current limit,
|
||||
* and its limit set to its capacity.
|
||||
*
|
||||
* @return The buffer.
|
||||
*/
|
||||
public ByteBuffer buffer()
|
||||
{
|
||||
return ((ByteBuffer) buffer.duplicate().flip()).slice();
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
return super.toString() + " [ buffer: " + buffer + " ]";
|
||||
}
|
||||
|
||||
private void growBuffer()
|
||||
{
|
||||
int newCapacity = buffer.capacity();
|
||||
if (newCapacity < 16384) // If the buffer isn't huge yet, double its size
|
||||
newCapacity = newCapacity << 1;
|
||||
else // Otherwize, increment by a bit.
|
||||
newCapacity += 4096;
|
||||
ByteBuffer newBuffer = ByteBuffer.allocate(newCapacity);
|
||||
buffer.flip();
|
||||
newBuffer.put(buffer);
|
||||
buffer = newBuffer;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user