/*
 * 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 */
