/* IKeyAgreementParty.java -- 
   Copyright (C) 2003, 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.javax.crypto.key;

import java.util.Map;

/**
 * The visible methods of an key agreement protocol participating party.
 */
public interface IKeyAgreementParty
{
  /**
   * Returns the canonical name of the key agreement protocol.
   * 
   * @return the canonical name of the key agreement protocol.
   */
  String name();

  /**
   * Sets up the instance to operate with specific attributes.
   * 
   * @param attributes a map of name-values used by concrete implementations.
   * @throws KeyAgreementException if an exception occurs during the setup.
   */
  void init(Map attributes) throws KeyAgreementException;

  /**
   * Processes an incoming message at one end, generating a message that will be
   * processed by the other party(ies).
   * 
   * @param in the incoming message.
   * @return an outgoing message, or <code>null</code> if this is an
   *         intermediary step that does not cause any output.
   * @throws KeyAgreementException if an exception occurs during the processing
   *           of the incoming message, or during the generation of the outgoing
   *           message.
   */
  OutgoingMessage processMessage(IncomingMessage in)
      throws KeyAgreementException;

  /**
   * Returns <code>true</code> if the party in the key agreement protocol
   * exchange has completed its part of the exchange. If this is the case an
   * {@link IllegalStateException} is thrown for any method invocation except
   * <code>init()</code> or <code>reset()</code>.
   * 
   * @return <code>true</code> if this party has completed its part of the key
   *         agreement protocol exchange; <code>false</code> otherwise.
   */
  boolean isComplete();

  /**
   * Returns the byte array containing the shared secret as generated by this
   * party.
   * 
   * @return the generated shared secret.
   * @throws KeyAgreementException if the key agreement is not yet initialised,
   *           or is initialised but the exchange is still in progress.
   */
  byte[] getSharedSecret() throws KeyAgreementException;

  /** Resets this instance for re-use with another set of attributes. */
  void reset();
}
