/* $OpenBSD: whrlpool.h,v 1.5 2014/07/10 22:45:58 jsing Exp $ */
module libressl_d.openssl.whrlpool;


public import core.stdc.stddef;
public import libressl_d.openssl.opensslconf;

extern (C):
nothrow @nogc:

enum WHIRLPOOL_DIGEST_LENGTH = 512 / 8;
enum WHIRLPOOL_BBLOCK = 512;
enum WHIRLPOOL_COUNTER = 256 / 8;

struct WHIRLPOOL_CTX
{
	union H_
	{
		ubyte[.WHIRLPOOL_DIGEST_LENGTH] c;

		/**
		 * double q is here to ensure 64-bit alignment
		 */
		double[.WHIRLPOOL_DIGEST_LENGTH / double.sizeof] q;
	}

	H_ H;
	ubyte[.WHIRLPOOL_BBLOCK / 8] data;
	uint bitoff;
	size_t[.WHIRLPOOL_COUNTER / size_t.sizeof] bitlen;
}

version (OPENSSL_NO_WHIRLPOOL) {
} else {
	int WHIRLPOOL_Init(.WHIRLPOOL_CTX* c);
	int WHIRLPOOL_Update(.WHIRLPOOL_CTX* c, const (void)* inp, size_t bytes);
	void WHIRLPOOL_BitUpdate(.WHIRLPOOL_CTX* c, const (void)* inp, size_t bits);
	int WHIRLPOOL_Final(ubyte* md, .WHIRLPOOL_CTX* c);
	ubyte* WHIRLPOOL(const (void)* inp, size_t bytes, ubyte* md);
}