summaryrefslogtreecommitdiff
path: root/plugins/CryptoPP/crypto/src/haval.h
blob: 4cd6db382a91de01872647d1e5401154f819dbf0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#ifndef CRYPTOPP_HAVAL_H
#define CRYPTOPP_HAVAL_H

#include "iterhash.h"

NAMESPACE_BEGIN(CryptoPP)

/// <a href="http://www.weidai.com/scan-mirror/md.html#HAVAL">HAVAL</a>
/*! \warning HAVAL with 128-bit or 160-bit output is considered insecure, and should not be used
	unless you absolutely need it for compatibility. */
class HAVAL : public IteratedHash<word32, LittleEndian, 128>
{
public:
	enum {HAVAL_VERSION = 1};
	CRYPTOPP_CONSTANT(DIGESTSIZE = 32)

	/// digestSize can be 16, 20, 24, 28, or 32 (Default=32)<br>
	/// pass can be 3, 4 or 5 (Default=3)
	HAVAL(unsigned int digestSize=DIGESTSIZE, unsigned int passes=3);
	void TruncatedFinal(byte *hash, size_t size);
	unsigned int DigestSize() const {return digestSize;}

	static const char * StaticAlgorithmName() {return "HAVAL";}
	std::string AlgorithmName() const {return std::string("HAVAL(") + IntToString(digestSize) + "," + IntToString(pass) + ")";}

protected:
	static const unsigned int wi2[32], wi3[32], wi4[32], wi5[32];
	static const word32 mc2[32], mc3[32], mc4[32], mc5[32];

	void Init();
	void Tailor(unsigned int FPTLEN);
	void HashEndianCorrectedBlock(const word32 *in);

	const unsigned int digestSize, pass;
};

/// <a href="http://www.weidai.com/scan-mirror/md.html#HAVAL">HAVAL</a> with 3 passes
class HAVAL3 : public HAVAL
{
public:
	HAVAL3(unsigned int digestSize=DIGESTSIZE) : HAVAL(digestSize, 3) {}
	static void Transform(word32 *buf, const word32 *in);
};

/// <a href="http://www.weidai.com/scan-mirror/md.html#HAVAL">HAVAL</a> with 4 passes
class HAVAL4 : public HAVAL
{
public:
	HAVAL4(unsigned int digestSize=DIGESTSIZE) : HAVAL(digestSize, 4) {}
	static void Transform(word32 *buf, const word32 *in);
};

/// <a href="http://www.weidai.com/scan-mirror/md.html#HAVAL">HAVAL</a> with 5 passes
class HAVAL5 : public HAVAL
{
public:
	HAVAL5(unsigned int digestSize=DIGESTSIZE) : HAVAL(digestSize, 5) {}
	static void Transform(word32 *buf, const word32 *in);
};

NAMESPACE_END

#endif