mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			317 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			317 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Java
		
	
	
	
/* SignatureSpi.java --- Signature Service Provider Interface
 | 
						|
   Copyright (C) 1999, 2003, Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is 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, 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; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, 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 java.security;
 | 
						|
 | 
						|
import java.nio.ByteBuffer;
 | 
						|
import java.security.spec.AlgorithmParameterSpec;
 | 
						|
 | 
						|
/**
 | 
						|
 * <code>SignatureSpi</code> defines the Service Provider Interface (SPI) for
 | 
						|
 * the {@link Signature} class. The signature class provides an interface to a
 | 
						|
 * digital signature algorithm. Digital signatures are used for authentication
 | 
						|
 * and integrity of data.
 | 
						|
 *
 | 
						|
 * @author Mark Benvenuto (ivymccough@worldnet.att.net)
 | 
						|
 * @since 1.2
 | 
						|
 * @see Signature
 | 
						|
 */
 | 
						|
public abstract class SignatureSpi
 | 
						|
{
 | 
						|
  /** Source of randomness. */
 | 
						|
  protected SecureRandom appRandom;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Creates a new instance of <code>SignatureSpi</code>.
 | 
						|
   */
 | 
						|
  public SignatureSpi()
 | 
						|
  {
 | 
						|
    appRandom = null;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Initializes this instance with the public key for verification purposes.
 | 
						|
   *
 | 
						|
   * @param publicKey
 | 
						|
   *          the public key to verify with.
 | 
						|
   * @throws InvalidKeyException
 | 
						|
   *           if the key is invalid.
 | 
						|
   */
 | 
						|
  protected abstract void engineInitVerify(PublicKey publicKey)
 | 
						|
    throws InvalidKeyException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Initializes this instance with the private key for signing purposes.
 | 
						|
   *
 | 
						|
   * @param privateKey
 | 
						|
   *          the private key to sign with.
 | 
						|
   * @throws InvalidKeyException
 | 
						|
   *           if the key is invalid.
 | 
						|
   */
 | 
						|
  protected abstract void engineInitSign(PrivateKey privateKey)
 | 
						|
    throws InvalidKeyException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Initializes this instance with the private key and source of randomness for
 | 
						|
   * signing purposes.
 | 
						|
   *
 | 
						|
   * <p>This method cannot be abstract for backward compatibility reasons.</p>
 | 
						|
   *
 | 
						|
   * @param privateKey
 | 
						|
   *          the private key to sign with.
 | 
						|
   * @param random
 | 
						|
   *          the {@link SecureRandom} to use.
 | 
						|
   * @throws InvalidKeyException
 | 
						|
   *           if the key is invalid.
 | 
						|
   * @since 1.2
 | 
						|
   */
 | 
						|
  protected void engineInitSign(PrivateKey privateKey, SecureRandom random)
 | 
						|
    throws InvalidKeyException
 | 
						|
  {
 | 
						|
    appRandom = random;
 | 
						|
    engineInitSign(privateKey);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Updates the data to be signed or verified with the specified byte.
 | 
						|
   *
 | 
						|
   * @param b
 | 
						|
   *          byte to update with.
 | 
						|
   * @throws SignatureException
 | 
						|
   *           if the engine is not properly initialized.
 | 
						|
   */
 | 
						|
  protected abstract void engineUpdate(byte b) throws SignatureException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Updates the data to be signed or verified with the specified bytes.
 | 
						|
   *
 | 
						|
   * @param b
 | 
						|
   *          the array of bytes to use.
 | 
						|
   * @param off
 | 
						|
   *          the offset to start at in the array.
 | 
						|
   * @param len
 | 
						|
   *          the number of the bytes to use from the array.
 | 
						|
   * @throws SignatureException
 | 
						|
   *           if the engine is not properly initialized.
 | 
						|
   */
 | 
						|
  protected abstract void engineUpdate(byte[] b, int off, int len)
 | 
						|
    throws SignatureException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Update this signature with the {@link java.nio.Buffer#remaining()}
 | 
						|
   * bytes of the given buffer.
 | 
						|
   *
 | 
						|
   * @param input The input buffer.
 | 
						|
   * @throws IllegalStateException if the engine is not properly initialized.
 | 
						|
   */
 | 
						|
  protected void engineUpdate(ByteBuffer input)
 | 
						|
  {
 | 
						|
    byte[] buf = new byte[4096];
 | 
						|
    while (input.hasRemaining())
 | 
						|
      {
 | 
						|
        int l = Math.min(input.remaining(), buf.length);
 | 
						|
        input.get(buf, 0, l);
 | 
						|
        try
 | 
						|
          {
 | 
						|
            engineUpdate(buf, 0, l);
 | 
						|
          }
 | 
						|
        catch (SignatureException se)
 | 
						|
          {
 | 
						|
            throw new IllegalStateException(se);
 | 
						|
          }
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the signature bytes of all the data fed to this instance. The
 | 
						|
   * format of the output depends on the underlying signature algorithm.
 | 
						|
   *
 | 
						|
   * @return the signature bytes.
 | 
						|
   * @throws SignatureException
 | 
						|
   *           if the engine is not properly initialized.
 | 
						|
   */
 | 
						|
  protected abstract byte[] engineSign() throws SignatureException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Generates signature bytes of all the data fed to this instance and stores
 | 
						|
   * the result in the designated array. The format of the output depends on
 | 
						|
   * the underlying signature algorithm.
 | 
						|
   *
 | 
						|
   * <p>This method cannot be abstract for backward compatibility reasons.
 | 
						|
   * After calling this method, the signature is reset to its initial state and
 | 
						|
   * can be used to generate additional signatures.</p>
 | 
						|
   *
 | 
						|
   * <p><b>IMPLEMENTATION NOTE:</b>: Neither this method nor the GNU provider
 | 
						|
   * will return partial digests. If <code>len</code> is less than the
 | 
						|
   * signature length, this method will throw a {@link SignatureException}. If
 | 
						|
   * it is greater than or equal then it is ignored.</p>
 | 
						|
   *
 | 
						|
   * @param outbuf
 | 
						|
   *          the array of bytes to store the result in.
 | 
						|
   * @param offset
 | 
						|
   *          the offset to start at in the array.
 | 
						|
   * @param len
 | 
						|
   *          the number of the bytes to use in the array.
 | 
						|
   * @return the real number of bytes used.
 | 
						|
   * @throws SignatureException
 | 
						|
   *           if the engine is not properly initialized.
 | 
						|
   * @since 1.2
 | 
						|
   */
 | 
						|
  protected int engineSign(byte[] outbuf, int offset, int len)
 | 
						|
    throws SignatureException
 | 
						|
  {
 | 
						|
    byte[] tmp = engineSign();
 | 
						|
    if (tmp.length > len)
 | 
						|
      throw new SignatureException("Invalid Length");
 | 
						|
 | 
						|
    System.arraycopy(outbuf, offset, tmp, 0, tmp.length);
 | 
						|
    return tmp.length;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Verifies a designated signature.
 | 
						|
   *
 | 
						|
   * @param sigBytes
 | 
						|
   *          the signature bytes to verify.
 | 
						|
   * @return <code>true</code> if verified, <code>false</code> otherwise.
 | 
						|
   * @throws SignatureException
 | 
						|
   *           if the engine is not properly initialized or if it is the wrong
 | 
						|
   *           signature.
 | 
						|
   */
 | 
						|
  protected abstract boolean engineVerify(byte[] sigBytes)
 | 
						|
    throws SignatureException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Convenience method which calls the method with the same name and one
 | 
						|
   * argument after copying the designated bytes into a temporary byte array.
 | 
						|
   * Subclasses may override this method for performance reasons.
 | 
						|
   *
 | 
						|
   * @param sigBytes
 | 
						|
   *          the array of bytes to use.
 | 
						|
   * @param offset
 | 
						|
   *          the offset to start from in the array of bytes.
 | 
						|
   * @param length
 | 
						|
   *          the number of bytes to use, starting at offset.
 | 
						|
   * @return <code>true</code> if verified, <code>false</code> otherwise.
 | 
						|
   * @throws SignatureException
 | 
						|
   *           if the engine is not properly initialized.
 | 
						|
   */
 | 
						|
  protected boolean engineVerify(byte[] sigBytes, int offset, int length)
 | 
						|
    throws SignatureException
 | 
						|
  {
 | 
						|
    byte[] tmp = new byte[length];
 | 
						|
    System.arraycopy(sigBytes, offset, tmp, 0, length);
 | 
						|
    return engineVerify(tmp);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Sets the specified algorithm parameter to the specified value.
 | 
						|
   *
 | 
						|
   * @param param
 | 
						|
   *          the parameter name.
 | 
						|
   * @param value
 | 
						|
   *          the parameter value.
 | 
						|
   * @throws InvalidParameterException
 | 
						|
   *           if the parameter invalid, the parameter is already set and
 | 
						|
   *           cannot be changed, a security exception occured, etc.
 | 
						|
   * @deprecated use the other setParameter.
 | 
						|
   */
 | 
						|
  protected abstract void engineSetParameter(String param, Object value)
 | 
						|
    throws InvalidParameterException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Sets the signature engine with the specified {@link AlgorithmParameterSpec}.
 | 
						|
   *
 | 
						|
   * <p>This method cannot be abstract for backward compatibility reasons. By
 | 
						|
   * default it always throws {@link UnsupportedOperationException} unless
 | 
						|
   * overridden.</p>
 | 
						|
   *
 | 
						|
   * @param params
 | 
						|
   *          the parameters.
 | 
						|
   * @throws InvalidParameterException
 | 
						|
   *           if the parameter is invalid, the parameter is already set and
 | 
						|
   *           cannot be changed, a security exception occured, etc.
 | 
						|
   */
 | 
						|
  protected void engineSetParameter(AlgorithmParameterSpec params)
 | 
						|
    throws InvalidAlgorithmParameterException
 | 
						|
  {
 | 
						|
    throw new UnsupportedOperationException();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * The default implementaion of this method always throws a
 | 
						|
   * {@link UnsupportedOperationException}. It MUST be overridden by concrete
 | 
						|
   * implementations to return the appropriate {@link AlgorithmParameters} for
 | 
						|
   * this signature engine (or <code>null</code> when that engine does not use
 | 
						|
   * any parameters.
 | 
						|
   *
 | 
						|
   * @return the parameters used with this signature engine, or
 | 
						|
   *         <code>null</code> if it does not use any parameters.
 | 
						|
   * @throws UnsupportedOperationException
 | 
						|
   *           always.
 | 
						|
   */
 | 
						|
  protected AlgorithmParameters engineGetParameters()
 | 
						|
  {
 | 
						|
    throw new UnsupportedOperationException();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the value for the specified algorithm parameter.
 | 
						|
   *
 | 
						|
   * @param param
 | 
						|
   *          the parameter name.
 | 
						|
   * @return the parameter value.
 | 
						|
   * @throws InvalidParameterException
 | 
						|
   *           if the parameter is invalid.
 | 
						|
   * @deprecated use the other getParameter
 | 
						|
   */
 | 
						|
  protected abstract Object engineGetParameter(String param)
 | 
						|
    throws InvalidParameterException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns a clone of this instance.
 | 
						|
   *
 | 
						|
   * @return a clone of this instance.
 | 
						|
   * @throws CloneNotSupportedException
 | 
						|
   *           if the implementation does not support cloning.
 | 
						|
   */
 | 
						|
  public Object clone() throws CloneNotSupportedException
 | 
						|
  {
 | 
						|
    return super.clone();
 | 
						|
  }
 | 
						|
}
 |