2002-10-04 17:31:41 +00:00
|
|
|
#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>
|
2004-09-03 10:57:31 +00:00
|
|
|
/*! \warning HAVAL with 128-bit or 160-bit output is considered insecure, and should not be used
|
|
|
|
unless you absolutely need it for compatibility. */
|
2002-10-04 17:31:41 +00:00
|
|
|
class HAVAL : public IteratedHash<word32, LittleEndian, 128>
|
|
|
|
{
|
|
|
|
public:
|
2006-12-14 11:41:39 +00:00
|
|
|
enum {HAVAL_VERSION = 1};
|
|
|
|
CRYPTOPP_CONSTANT(DIGESTSIZE = 32)
|
2002-10-04 17:31:41 +00:00
|
|
|
|
|
|
|
/// 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);
|
2005-07-12 04:23:32 +00:00
|
|
|
void TruncatedFinal(byte *hash, size_t size);
|
2002-10-04 17:31:41 +00:00
|
|
|
unsigned int DigestSize() const {return digestSize;}
|
|
|
|
|
2004-03-09 12:42:38 +00:00
|
|
|
static const char * StaticAlgorithmName() {return "HAVAL";}
|
|
|
|
std::string AlgorithmName() const {return std::string("HAVAL(") + IntToString(digestSize) + "," + IntToString(pass) + ")";}
|
|
|
|
|
2002-10-04 17:31:41 +00:00
|
|
|
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);
|
2003-07-04 00:17:37 +00:00
|
|
|
void HashEndianCorrectedBlock(const word32 *in);
|
2002-10-04 17:31:41 +00:00
|
|
|
|
|
|
|
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
|