/* See LICENSE for licensing and NOTICE for copyright. */
package org.cryptacular.bean;

import org.cryptacular.CryptoException;
import org.cryptacular.StreamException;

/**
 * Strategy interface to support beans that produce hash outputs in various formats, e.g. raw bytes, hex output, etc.
 *
 * @param  <T>  Type of output (e.g. byte[], string) produced by hash bean.
 *
 * @author  Middleware Services
 */
public interface HashBean<T>
{

  /**
   * Hashes the given data.
   *
   * @param  data  Data to hash. Callers should expect support for at least the following types: <code>byte[]</code>,
   *               {@link CharSequence}, {@link java.io.InputStream}, and {@link org.cryptacular.io.Resource}. Unless
   *               otherwise noted, character data is processed in the <code>UTF-8</code> character set; if another
   *               character set is desired, the caller should convert to <code>byte[]</code> and provide the resulting
   *               bytes.
   *
   * @return  Digest output.
   *
   * @throws  CryptoException  on hash computation errors.
   * @throws  StreamException  on stream IO errors.
   */
  T hash(Object... data) throws CryptoException, StreamException;


  /**
   * Compares a known hash value with the hash of the given data.
   *
   * @param  hash  Known hash value.
   * @param  data  Data to hash.
   *
   * @return  True if the hashed data matches the given hash, false otherwise.
   *
   * @throws  CryptoException  on hash computation errors.
   * @throws  StreamException  on stream IO errors.
   */
  boolean compare(T hash, Object... data) throws CryptoException, StreamException;
}
