/*
 * Hash: Hash algorithms under the crypto API
 *
 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
 *
 * This program 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.
 *
 */

#ifndef _CRYPTO_HASH_H
#define _CRYPTO_HASH_H

#include <linux/crypto.h>

struct shash_desc {
  u32 flags;

  void* __ctx[] CRYPTO_MINALIGN_ATTR;
};

struct shash_alg {
  int (*init)(struct shash_desc* desc);
  int (*update)(struct shash_desc* desc, const u8* data, unsigned int len);
  int (*final)(struct shash_desc* desc, u8* out);
  int (*finup)(struct shash_desc* desc,
               const u8* data,
               unsigned int len,
               u8* out);
  int (*digest)(struct shash_desc* desc,
                const u8* data,
                unsigned int len,
                u8* out);
  int (*export)(struct shash_desc* desc, void* out);
  int (*import)(struct shash_desc* desc, const void* in);

  unsigned int descsize;

  unsigned int digestsize;
  unsigned int statesize;

  struct crypto_alg base;
};

struct hash_tfm {
  const struct shash_alg* alg;
  struct shash_desc desc;
};

static inline void* shash_desc_ctx(struct shash_desc* desc) {
  return desc->__ctx;
}

#endif /* _CRYPTO_HASH_H */
