/* AlgorithmParametersSpi.java --- Algorithm Parameters SPI
   Copyright (C) 1999, 2004  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.io.IOException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidParameterSpecException;

/**
 * AlgorithmParametersSpi is the Service Provider Interface
 * for the Algorithm Parameters class. This class is used
 * to manage the algorithm parameters.
 *
 * @since 1.2
 * @author Mark Benvenuto
 */
public abstract class AlgorithmParametersSpi
{
  /**
   * Creates a new instance of AlgorithmParametersSpi
   */
  public AlgorithmParametersSpi()
  {
  }

  /**
   * Initializes the engine with the specified
   * AlgorithmParameterSpec class.
   *
   * @param paramSpec A AlgorithmParameterSpec to initialize with
   *
   * @throws InvalidParameterSpecException For an inapporiate
   * ParameterSpec class
   */
  protected abstract void engineInit(AlgorithmParameterSpec paramSpec)
    throws InvalidParameterSpecException;

  /**
   * Initializes the engine with the specified
   * parameters stored in the byte array and decodes them
   * according to the ASN.1 specification. If the ASN.1
   * specification exists then it succeeds or else it throws
   * IOException.
   *
   * @param params Parameters to initialize with
   *
   * @throws IOException Decoding Error
   */
  protected abstract void engineInit(byte[]params) throws IOException;

  /**
   * Initializes the engine with the specified
   * parameters stored in the byte array and decodes them
   * according to the specified decoding specification.
   * If format is null, then it is decoded using the ASN.1
   * specification if it exists or else it throws
   * IOException.
   *
   * @param params Parameters to initialize with
   * @param format Name of decoding format to use
   *
   * @throws IOException Decoding Error
   */
  protected abstract void engineInit(byte[]params, String format)
    throws IOException;


  /**
   * Returns a specification of this AlgorithmParameters object.
   * paramSpec identifies the class to return the AlgortihmParameters
   * in.
   *
   * @param paramSpec Class to return AlgorithmParameters in
   *
   * @return the parameter specification
   *
   * @throws InvalidParameterSpecException if the paramSpec is an
   * invalid parameter class
   */
  protected abstract <T extends AlgorithmParameterSpec>
  T engineGetParameterSpec(Class<T> paramSpec)
    throws InvalidParameterSpecException;


  /**
   * Returns the parameters in the default encoding format.
   * The primary encoding format is ASN.1 format if it exists
   * for the specified type.
   *
   * @return byte array representing the parameters
   */
  protected abstract byte[] engineGetEncoded() throws IOException;


  /**
   * Returns the parameters in the specified encoding format.
   * If <code>format</code> is <code>null</code> then the
   * primary encoding format is used, the ASN.1 format,
   * if it exists for the specified type.
   *
   * @return byte array representing the parameters
   */
  protected abstract byte[] engineGetEncoded(String format)
    throws IOException;

  /**
   * Returns a string describing the parameters in the
   * AlgorithmParametersSpi class.
   *
   * @return A string representing the format of the parameters.
   */
  protected abstract String engineToString();
}
