Add SHA3 hashing

- added these variants: SHA3-256, SHA3-384, SHA3-512
- reordered also the hashing id's
- added some notes about them in DOC/Hashes.txt

Signed-off-by: Tino Reichardt <milky-7zip@mcmilk.de>
This commit is contained in:
Tino Reichardt
2023-06-18 09:13:59 +02:00
parent 9b8a493437
commit dddf507557
25 changed files with 496 additions and 35 deletions

View File

@@ -17,6 +17,9 @@ COMMON_OBJS = \
$O\Sha256Reg.obj \
$O\Sha384Reg.obj \
$O\Sha512Reg.obj \
$O\Sha3-256Reg.obj \
$O\Sha3-384Reg.obj \
$O\Sha3-512Reg.obj \
$O\StringConvert.obj \
$O\StringToInt.obj \
$O\UTFConvert.obj \
@@ -269,6 +272,7 @@ HASHES_OBJS = \
$O\md2.obj \
$O\md4.obj \
$O\md5.obj \
$O\sha3.obj \
$O\sha512.obj \
C_OBJS = \

View File

@@ -807,18 +807,10 @@ static const char *SkipWhite(const char *s)
static const char * const k_CsumMethodNames[] =
{
"sha256"
, "sha224"
// , "sha512/224"
// , "sha512/256"
, "sha512"
, "sha384"
, "sha1"
, "md5"
, "blake2b"
, "crc64"
, "crc32"
, "cksum"
"sha3-512", "sha3-384", "sha3-256",
"sha512", "sha384", "sha256", "sha224",
"sha1", "md5", "blake2b",
"crc32", "crc64" , "cksum"
};
static UString GetMethod_from_FileName(const UString &name)
@@ -1421,7 +1413,8 @@ static bool CheckDigests(const Byte *a, const Byte *b, size_t size)
static void AddDefaultMethod(UStringVector &methods, unsigned size)
{
const char *m = NULL;
if (size == 32) m = "sha256";
if (size == 64) m = "sha512";
else if (size == 32) m = "sha256";
else if (size == 20) m = "sha1";
else if (size == 16) m = "md5";
else if (size == 8) m = "crc64";
@@ -2098,11 +2091,11 @@ void Codecs_AddHashArcHandler(CCodecs *codecs)
// ubuntu uses "SHA256SUMS" file
item.AddExts(UString (
"sha256 sha512 sha224 sha384 sha1 sha md5"
// "b2sum"
" crc32 crc64"
" asc"
" cksum"
"sha3-512 sha3-384 sha3-256 "
"sha512 sha384 sha256 sha224 "
"sha1 sha md5 "
"crc32 crc64 "
"asc cksum"
),
UString());

View File

@@ -242,13 +242,16 @@ static const CHashCommand g_HashCommands[] =
{ CZipContextMenu::kHash_MD4, "MD4", "MD4" },
{ CZipContextMenu::kHash_MD5, "MD5", "MD5" },
{ CZipContextMenu::kHash_SHA1, "SHA-1", "SHA1" },
{ CZipContextMenu::kHash_SHA256, "SHA-256", "SHA256" },
{ CZipContextMenu::kHash_SHA384, "SHA-384", "SHA384" },
{ CZipContextMenu::kHash_SHA512, "SHA-512", "SHA512" },
{ CZipContextMenu::kHash_SHA256, "SHA2-256", "SHA256" },
{ CZipContextMenu::kHash_SHA384, "SHA2-384", "SHA384" },
{ CZipContextMenu::kHash_SHA512, "SHA2-512", "SHA512" },
{ CZipContextMenu::kHash_BLAKE2sp, "BLAKE2sp", "BLAKE2sp" },
{ CZipContextMenu::kHash_BLAKE3, "BLAKE3", "BLAKE3" },
{ CZipContextMenu::kHash_SHA256, "SHA3-256", "SHA3-256" },
{ CZipContextMenu::kHash_SHA384, "SHA3-384", "SHA3-384" },
{ CZipContextMenu::kHash_SHA512, "SHA3-512", "SHA3-512" },
{ CZipContextMenu::kHash_All, "*", "*" },
{ CZipContextMenu::kHash_Generate_SHA256, "SHA-256 -> file.sha256", "SHA256" },
{ CZipContextMenu::kHash_Generate_SHA256, "SHA2-256 -> file.sha256", "SHA256" },
{ CZipContextMenu::kHash_TestArc, "Checksum : Test", "Hash" }
};
@@ -966,7 +969,7 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu,
name += ".sha256";
cmi.Folder = fs2us(folderPrefix);
cmi.ArcName = name;
s = "SHA-256 -> ";
s = "SHA2-256 -> ";
s += name;
}
else if (hc.CommandInternalID == kHash_TestArc)
@@ -1231,6 +1234,9 @@ HRESULT CZipContextMenu::InvokeCommandCommon(const CCommandMapItem &cmi)
case kHash_SHA512:
case kHash_BLAKE2sp:
case kHash_BLAKE3:
case kHash_SHA3_256:
case kHash_SHA3_384:
case kHash_SHA3_512:
case kHash_All:
case kHash_Generate_SHA256:
case kHash_TestArc:

View File

@@ -59,6 +59,9 @@ public:
kHash_SHA512,
kHash_BLAKE2sp,
kHash_BLAKE3,
kHash_SHA3_256,
kHash_SHA3_384,
kHash_SHA3_512,
kHash_All,
kHash_Generate_SHA256,
kHash_TestArc

View File

@@ -40,4 +40,4 @@ STDMETHODIMP_(void) CBLAKE3Hasher::Final(Byte *digest) throw()
{
blake3_hasher_finalize(&_ctx, digest, BLAKE3_OUT_LEN);
}
REGISTER_HASHER(CBLAKE3Hasher, 0x20a, "BLAKE3", BLAKE3_OUT_LEN)
REGISTER_HASHER(CBLAKE3Hasher, 0x204, "BLAKE3", BLAKE3_OUT_LEN)

View File

@@ -57,4 +57,4 @@ STDMETHODIMP_(void) CCksumHasher::Final(Byte *digest) throw()
SetUi32(digest, val);
}
REGISTER_HASHER(CCksumHasher, 0x203, "CKSUM", 4)
REGISTER_HASHER(CCksumHasher, 0x202, "CKSUM", 4)

View File

@@ -0,0 +1,43 @@
// Sha3-256Reg.cpp /TR 2023-06-18
#include "StdAfx.h"
#include "../../C/CpuArch.h"
EXTERN_C_BEGIN
#include "../../C/hashes/sha3.h"
EXTERN_C_END
#include "../Common/MyCom.h"
#include "../7zip/Common/RegisterCodec.h"
// SHA3-256
class CSHA3_256Hasher:
public IHasher,
public CMyUnknownImp
{
SHA3_CTX _ctx;
Byte mtDummy[1 << 7];
public:
CSHA3_256Hasher() { SHA3_Init(&_ctx, 256); }
MY_UNKNOWN_IMP1(IHasher)
INTERFACE_IHasher(;)
};
STDMETHODIMP_(void) CSHA3_256Hasher::Init() throw()
{
SHA3_Init(&_ctx, 256);
}
STDMETHODIMP_(void) CSHA3_256Hasher::Update(const void *data, UInt32 size) throw()
{
SHA3_Update(&_ctx, (const Byte *)data, size);
}
STDMETHODIMP_(void) CSHA3_256Hasher::Final(Byte *digest) throw()
{
SHA3_Final(digest, &_ctx);
}
REGISTER_HASHER(CSHA3_256Hasher, 0x20a, "SHA3-256", SHA3_256_DIGEST_LENGTH)

View File

@@ -0,0 +1,43 @@
// Sha3-384Reg.cpp /TR 2023-06-18
#include "StdAfx.h"
#include "../../C/CpuArch.h"
EXTERN_C_BEGIN
#include "../../C/hashes/sha3.h"
EXTERN_C_END
#include "../Common/MyCom.h"
#include "../7zip/Common/RegisterCodec.h"
// SHA3-384
class CSHA3_384Hasher:
public IHasher,
public CMyUnknownImp
{
SHA3_CTX _ctx;
Byte mtDummy[1 << 7];
public:
CSHA3_384Hasher() { SHA3_Init(&_ctx, 384); }
MY_UNKNOWN_IMP1(IHasher)
INTERFACE_IHasher(;)
};
STDMETHODIMP_(void) CSHA3_384Hasher::Init() throw()
{
SHA3_Init(&_ctx, 384);
}
STDMETHODIMP_(void) CSHA3_384Hasher::Update(const void *data, UInt32 size) throw()
{
SHA3_Update(&_ctx, (const Byte *)data, size);
}
STDMETHODIMP_(void) CSHA3_384Hasher::Final(Byte *digest) throw()
{
SHA3_Final(digest, &_ctx);
}
REGISTER_HASHER(CSHA3_384Hasher, 0x20b, "SHA3-384", SHA3_384_DIGEST_LENGTH)

View File

@@ -0,0 +1,43 @@
// Sha3-512Reg.cpp /TR 2023-06-18
#include "StdAfx.h"
#include "../../C/CpuArch.h"
EXTERN_C_BEGIN
#include "../../C/hashes/sha3.h"
EXTERN_C_END
#include "../Common/MyCom.h"
#include "../7zip/Common/RegisterCodec.h"
// SHA3-512
class CSHA3_512Hasher:
public IHasher,
public CMyUnknownImp
{
SHA3_CTX _ctx;
Byte mtDummy[1 << 7];
public:
CSHA3_512Hasher() { SHA3_Init(&_ctx, 512); }
MY_UNKNOWN_IMP1(IHasher)
INTERFACE_IHasher(;)
};
STDMETHODIMP_(void) CSHA3_512Hasher::Init() throw()
{
SHA3_Init(&_ctx, 512);
}
STDMETHODIMP_(void) CSHA3_512Hasher::Update(const void *data, UInt32 size) throw()
{
SHA3_Update(&_ctx, (const Byte *)data, size);
}
STDMETHODIMP_(void) CSHA3_512Hasher::Final(Byte *digest) throw()
{
SHA3_Final(digest, &_ctx);
}
REGISTER_HASHER(CSHA3_512Hasher, 0x20c, "SHA3-512", SHA3_512_DIGEST_LENGTH)

View File

@@ -5,7 +5,7 @@
#include "../../C/CpuArch.h"
EXTERN_C_BEGIN
#include "../../C/hashes/sha.h"
#include "../../C/hashes/sha512.h"
EXTERN_C_END
#include "../Common/MyCom.h"

View File

@@ -5,7 +5,7 @@
#include "../../C/CpuArch.h"
EXTERN_C_BEGIN
#include "../../C/hashes/sha.h"
#include "../../C/hashes/sha512.h"
EXTERN_C_END
#include "../Common/MyCom.h"

View File

@@ -42,4 +42,4 @@ STDMETHODIMP_(void) CXXH32Hasher::Final(Byte *digest) throw()
SetUi32(digest, val);
}
REGISTER_HASHER(CXXH32Hasher, 0x203, "XXH32", 4)
REGISTER_HASHER(CXXH32Hasher, 0x20d, "XXH32", 4)

View File

@@ -41,4 +41,4 @@ STDMETHODIMP_(void) CXXH64Hasher::Final(Byte *digest) throw()
UInt64 val = XXH64_digest(_ctx);
SetUi64(digest, val);
}
REGISTER_HASHER(CXXH64Hasher, 0x204, "XXH64", 8)
REGISTER_HASHER(CXXH64Hasher, 0x20e, "XXH64", 8)