diff options
| author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-11-29 00:00:00 +0000 |
|---|---|---|
| committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-11-30 15:27:15 +0500 |
| commit | e5431fa6f5505e385c6f9367260717e9c47dc2ee (patch) | |
| tree | 4cd2c2c3b225b48c8e7053432c41d7b6b6a3d5f8 /CPP/Common | |
| parent | e008ce3976c087bfd21344af8f00a23cf69d4174 (diff) | |
| download | 7zip-24.09.tar.gz 7zip-24.09.tar.bz2 7zip-24.09.zip | |
24.0924.09
Diffstat (limited to 'CPP/Common')
| -rw-r--r-- | CPP/Common/Md5Reg.cpp | 44 | ||||
| -rw-r--r-- | CPP/Common/MyCom.h | 37 | ||||
| -rw-r--r-- | CPP/Common/Sha3Reg.cpp | 76 | ||||
| -rw-r--r-- | CPP/Common/Sha512Prepare.cpp | 7 | ||||
| -rw-r--r-- | CPP/Common/Sha512Reg.cpp | 83 |
5 files changed, 247 insertions, 0 deletions
diff --git a/CPP/Common/Md5Reg.cpp b/CPP/Common/Md5Reg.cpp new file mode 100644 index 0000000..026fd41 --- /dev/null +++ b/CPP/Common/Md5Reg.cpp | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | // Md5Reg.cpp | ||
| 2 | |||
| 3 | #include "StdAfx.h" | ||
| 4 | |||
| 5 | #include "../../C/Md5.h" | ||
| 6 | |||
| 7 | #include "../Common/MyBuffer2.h" | ||
| 8 | #include "../Common/MyCom.h" | ||
| 9 | |||
| 10 | #include "../7zip/Common/RegisterCodec.h" | ||
| 11 | |||
| 12 | Z7_CLASS_IMP_COM_1( | ||
| 13 | CMd5Hasher | ||
| 14 | , IHasher | ||
| 15 | ) | ||
| 16 | CAlignedBuffer1 _buf; | ||
| 17 | public: | ||
| 18 | Byte _mtDummy[1 << 7]; | ||
| 19 | |||
| 20 | CMd5 *Md5() { return (CMd5 *)(void *)(Byte *)_buf; } | ||
| 21 | public: | ||
| 22 | CMd5Hasher(): | ||
| 23 | _buf(sizeof(CMd5)) | ||
| 24 | { | ||
| 25 | Md5_Init(Md5()); | ||
| 26 | } | ||
| 27 | }; | ||
| 28 | |||
| 29 | Z7_COM7F_IMF2(void, CMd5Hasher::Init()) | ||
| 30 | { | ||
| 31 | Md5_Init(Md5()); | ||
| 32 | } | ||
| 33 | |||
| 34 | Z7_COM7F_IMF2(void, CMd5Hasher::Update(const void *data, UInt32 size)) | ||
| 35 | { | ||
| 36 | Md5_Update(Md5(), (const Byte *)data, size); | ||
| 37 | } | ||
| 38 | |||
| 39 | Z7_COM7F_IMF2(void, CMd5Hasher::Final(Byte *digest)) | ||
| 40 | { | ||
| 41 | Md5_Final(Md5(), digest); | ||
| 42 | } | ||
| 43 | |||
| 44 | REGISTER_HASHER(CMd5Hasher, 0x208, "MD5", MD5_DIGEST_SIZE) | ||
diff --git a/CPP/Common/MyCom.h b/CPP/Common/MyCom.h index a3cc3c8..7dc21ba 100644 --- a/CPP/Common/MyCom.h +++ b/CPP/Common/MyCom.h | |||
| @@ -468,6 +468,19 @@ EXTERN_C_END | |||
| 468 | Z7_COM_QI_ENTRY(i7) \ | 468 | Z7_COM_QI_ENTRY(i7) \ |
| 469 | ) | 469 | ) |
| 470 | 470 | ||
| 471 | #define Z7_COM_UNKNOWN_IMP_8(i1, i2, i3, i4, i5, i6, i7, i8) \ | ||
| 472 | Z7_COM_UNKNOWN_IMP_SPEC( \ | ||
| 473 | Z7_COM_QI_ENTRY_UNKNOWN(i1) \ | ||
| 474 | Z7_COM_QI_ENTRY(i1) \ | ||
| 475 | Z7_COM_QI_ENTRY(i2) \ | ||
| 476 | Z7_COM_QI_ENTRY(i3) \ | ||
| 477 | Z7_COM_QI_ENTRY(i4) \ | ||
| 478 | Z7_COM_QI_ENTRY(i5) \ | ||
| 479 | Z7_COM_QI_ENTRY(i6) \ | ||
| 480 | Z7_COM_QI_ENTRY(i7) \ | ||
| 481 | Z7_COM_QI_ENTRY(i8) \ | ||
| 482 | ) | ||
| 483 | |||
| 471 | 484 | ||
| 472 | #define Z7_IFACES_IMP_UNK_1(i1) \ | 485 | #define Z7_IFACES_IMP_UNK_1(i1) \ |
| 473 | Z7_COM_UNKNOWN_IMP_1(i1) \ | 486 | Z7_COM_UNKNOWN_IMP_1(i1) \ |
| @@ -508,6 +521,16 @@ EXTERN_C_END | |||
| 508 | Z7_IFACE_COM7_IMP(i5) \ | 521 | Z7_IFACE_COM7_IMP(i5) \ |
| 509 | Z7_IFACE_COM7_IMP(i6) \ | 522 | Z7_IFACE_COM7_IMP(i6) \ |
| 510 | 523 | ||
| 524 | #define Z7_IFACES_IMP_UNK_7(i1, i2, i3, i4, i5, i6, i7) \ | ||
| 525 | Z7_COM_UNKNOWN_IMP_7(i1, i2, i3, i4, i5, i6, i7) \ | ||
| 526 | Z7_IFACE_COM7_IMP(i1) \ | ||
| 527 | Z7_IFACE_COM7_IMP(i2) \ | ||
| 528 | Z7_IFACE_COM7_IMP(i3) \ | ||
| 529 | Z7_IFACE_COM7_IMP(i4) \ | ||
| 530 | Z7_IFACE_COM7_IMP(i5) \ | ||
| 531 | Z7_IFACE_COM7_IMP(i6) \ | ||
| 532 | Z7_IFACE_COM7_IMP(i7) \ | ||
| 533 | |||
| 511 | 534 | ||
| 512 | #define Z7_CLASS_IMP_COM_0(c) \ | 535 | #define Z7_CLASS_IMP_COM_0(c) \ |
| 513 | Z7_class_final(c) : \ | 536 | Z7_class_final(c) : \ |
| @@ -574,6 +597,20 @@ EXTERN_C_END | |||
| 574 | private: | 597 | private: |
| 575 | 598 | ||
| 576 | 599 | ||
| 600 | #define Z7_CLASS_IMP_COM_7(c, i1, i2, i3, i4, i5, i6, i7) \ | ||
| 601 | Z7_class_final(c) : \ | ||
| 602 | public i1, \ | ||
| 603 | public i2, \ | ||
| 604 | public i3, \ | ||
| 605 | public i4, \ | ||
| 606 | public i5, \ | ||
| 607 | public i6, \ | ||
| 608 | public i7, \ | ||
| 609 | public CMyUnknownImp { \ | ||
| 610 | Z7_IFACES_IMP_UNK_7(i1, i2, i3, i4, i5, i6, i7) \ | ||
| 611 | private: | ||
| 612 | |||
| 613 | |||
| 577 | /* | 614 | /* |
| 578 | #define Z7_CLASS_IMP_NOQIB_0(c) \ | 615 | #define Z7_CLASS_IMP_NOQIB_0(c) \ |
| 579 | Z7_class_final(c) : \ | 616 | Z7_class_final(c) : \ |
diff --git a/CPP/Common/Sha3Reg.cpp b/CPP/Common/Sha3Reg.cpp new file mode 100644 index 0000000..95db25e --- /dev/null +++ b/CPP/Common/Sha3Reg.cpp | |||
| @@ -0,0 +1,76 @@ | |||
| 1 | // Sha3Reg.cpp | ||
| 2 | |||
| 3 | #include "StdAfx.h" | ||
| 4 | |||
| 5 | #include "../../C/Sha3.h" | ||
| 6 | |||
| 7 | #include "../Common/MyBuffer2.h" | ||
| 8 | #include "../Common/MyCom.h" | ||
| 9 | |||
| 10 | #include "../7zip/Common/RegisterCodec.h" | ||
| 11 | |||
| 12 | Z7_CLASS_IMP_COM_1( | ||
| 13 | CSha3Hasher | ||
| 14 | , IHasher | ||
| 15 | ) | ||
| 16 | unsigned _digestSize; | ||
| 17 | bool _isShake; | ||
| 18 | CAlignedBuffer1 _buf; | ||
| 19 | public: | ||
| 20 | Byte _mtDummy[1 << 7]; | ||
| 21 | |||
| 22 | CSha3 *Sha() { return (CSha3 *)(void *)(Byte *)_buf; } | ||
| 23 | public: | ||
| 24 | CSha3Hasher(unsigned digestSize, bool isShake, unsigned blockSize): | ||
| 25 | _digestSize(digestSize), | ||
| 26 | _isShake(isShake), | ||
| 27 | _buf(sizeof(CSha3)) | ||
| 28 | { | ||
| 29 | CSha3 *p = Sha(); | ||
| 30 | Sha3_SET_blockSize(p, blockSize) | ||
| 31 | Sha3_Init(Sha()); | ||
| 32 | } | ||
| 33 | }; | ||
| 34 | |||
| 35 | Z7_COM7F_IMF2(void, CSha3Hasher::Init()) | ||
| 36 | { | ||
| 37 | Sha3_Init(Sha()); | ||
| 38 | } | ||
| 39 | |||
| 40 | Z7_COM7F_IMF2(void, CSha3Hasher::Update(const void *data, UInt32 size)) | ||
| 41 | { | ||
| 42 | Sha3_Update(Sha(), (const Byte *)data, size); | ||
| 43 | } | ||
| 44 | |||
| 45 | Z7_COM7F_IMF2(void, CSha3Hasher::Final(Byte *digest)) | ||
| 46 | { | ||
| 47 | Sha3_Final(Sha(), digest, _digestSize, _isShake); | ||
| 48 | } | ||
| 49 | |||
| 50 | Z7_COM7F_IMF2(UInt32, CSha3Hasher::GetDigestSize()) | ||
| 51 | { | ||
| 52 | return (UInt32)_digestSize; | ||
| 53 | } | ||
| 54 | |||
| 55 | |||
| 56 | #define REGISTER_SHA3_HASHER_2(cls, id, name, digestSize, isShake, digestSize_for_blockSize) \ | ||
| 57 | namespace N ## cls { \ | ||
| 58 | static IHasher *CreateHasherSpec() \ | ||
| 59 | { return new CSha3Hasher(digestSize / 8, isShake, \ | ||
| 60 | SHA3_BLOCK_SIZE_FROM_DIGEST_SIZE(digestSize_for_blockSize / 8)); } \ | ||
| 61 | static const CHasherInfo g_HasherInfo = { CreateHasherSpec, id, name, digestSize }; \ | ||
| 62 | struct REGISTER_HASHER_NAME(cls) { REGISTER_HASHER_NAME(cls)() { RegisterHasher(&g_HasherInfo); }}; \ | ||
| 63 | static REGISTER_HASHER_NAME(cls) g_RegisterHasher; } | ||
| 64 | |||
| 65 | #define REGISTER_SHA3_HASHER( cls, id, name, size, isShake) \ | ||
| 66 | REGISTER_SHA3_HASHER_2(cls, id, name, size, isShake, size) | ||
| 67 | |||
| 68 | // REGISTER_SHA3_HASHER (Sha3_224_Hasher, 0x230, "SHA3-224", 224, false) | ||
| 69 | REGISTER_SHA3_HASHER (Sha3_256_Hasher, 0x231, "SHA3-256", 256, false) | ||
| 70 | // REGISTER_SHA3_HASHER (Sha3_386_Hasher, 0x232, "SHA3-384", 384, false) | ||
| 71 | // REGISTER_SHA3_HASHER (Sha3_512_Hasher, 0x233, "SHA3-512", 512, false) | ||
| 72 | // REGISTER_SHA3_HASHER (Shake128_Hasher, 0x240, "SHAKE128", 128, true) | ||
| 73 | // REGISTER_SHA3_HASHER (Shake256_Hasher, 0x241, "SHAKE256", 256, true) | ||
| 74 | // REGISTER_SHA3_HASHER_2 (Shake128_512_Hasher, 0x248, "SHAKE128-256", 256, true, 128) // -1344 (max) | ||
| 75 | // REGISTER_SHA3_HASHER_2 (Shake256_512_Hasher, 0x249, "SHAKE256-512", 512, true, 256) // -1088 (max) | ||
| 76 | // Shake supports different digestSize values for same blockSize | ||
diff --git a/CPP/Common/Sha512Prepare.cpp b/CPP/Common/Sha512Prepare.cpp new file mode 100644 index 0000000..e7beff5 --- /dev/null +++ b/CPP/Common/Sha512Prepare.cpp | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | // Sha512Prepare.cpp | ||
| 2 | |||
| 3 | #include "StdAfx.h" | ||
| 4 | |||
| 5 | #include "../../C/Sha512.h" | ||
| 6 | |||
| 7 | static struct CSha512Prepare { CSha512Prepare() { Sha512Prepare(); } } g_Sha512Prepare; | ||
diff --git a/CPP/Common/Sha512Reg.cpp b/CPP/Common/Sha512Reg.cpp new file mode 100644 index 0000000..21df6ba --- /dev/null +++ b/CPP/Common/Sha512Reg.cpp | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | // Sha512Reg.cpp | ||
| 2 | |||
| 3 | #include "StdAfx.h" | ||
| 4 | |||
| 5 | #include "../../C/Sha512.h" | ||
| 6 | |||
| 7 | #include "../Common/MyBuffer2.h" | ||
| 8 | #include "../Common/MyCom.h" | ||
| 9 | |||
| 10 | #include "../7zip/Common/RegisterCodec.h" | ||
| 11 | |||
| 12 | Z7_CLASS_IMP_COM_2( | ||
| 13 | CSha512Hasher | ||
| 14 | , IHasher | ||
| 15 | , ICompressSetCoderProperties | ||
| 16 | ) | ||
| 17 | unsigned _digestSize; | ||
| 18 | CAlignedBuffer1 _buf; | ||
| 19 | public: | ||
| 20 | Byte _mtDummy[1 << 7]; | ||
| 21 | |||
| 22 | CSha512 *Sha() { return (CSha512 *)(void *)(Byte *)_buf; } | ||
| 23 | public: | ||
| 24 | CSha512Hasher(unsigned digestSize): | ||
| 25 | _digestSize(digestSize), | ||
| 26 | _buf(sizeof(CSha512)) | ||
| 27 | { | ||
| 28 | Sha512_SetFunction(Sha(), 0); | ||
| 29 | Sha512_InitState(Sha(), _digestSize); | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | Z7_COM7F_IMF2(void, CSha512Hasher::Init()) | ||
| 34 | { | ||
| 35 | Sha512_InitState(Sha(), _digestSize); | ||
| 36 | } | ||
| 37 | |||
| 38 | Z7_COM7F_IMF2(void, CSha512Hasher::Update(const void *data, UInt32 size)) | ||
| 39 | { | ||
| 40 | Sha512_Update(Sha(), (const Byte *)data, size); | ||
| 41 | } | ||
| 42 | |||
| 43 | Z7_COM7F_IMF2(void, CSha512Hasher::Final(Byte *digest)) | ||
| 44 | { | ||
| 45 | Sha512_Final(Sha(), digest, _digestSize); | ||
| 46 | } | ||
| 47 | |||
| 48 | Z7_COM7F_IMF2(UInt32, CSha512Hasher::GetDigestSize()) | ||
| 49 | { | ||
| 50 | return (UInt32)_digestSize; | ||
| 51 | } | ||
| 52 | |||
| 53 | Z7_COM7F_IMF(CSha512Hasher::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps)) | ||
| 54 | { | ||
| 55 | unsigned algo = 0; | ||
| 56 | for (UInt32 i = 0; i < numProps; i++) | ||
| 57 | { | ||
| 58 | if (propIDs[i] == NCoderPropID::kDefaultProp) | ||
| 59 | { | ||
| 60 | const PROPVARIANT &prop = coderProps[i]; | ||
| 61 | if (prop.vt != VT_UI4) | ||
| 62 | return E_INVALIDARG; | ||
| 63 | if (prop.ulVal > 2) | ||
| 64 | return E_NOTIMPL; | ||
| 65 | algo = (unsigned)prop.ulVal; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | if (!Sha512_SetFunction(Sha(), algo)) | ||
| 69 | return E_NOTIMPL; | ||
| 70 | return S_OK; | ||
| 71 | } | ||
| 72 | |||
| 73 | #define REGISTER_SHA512_HASHER(cls, id, name, size) \ | ||
| 74 | namespace N ## cls { \ | ||
| 75 | static IHasher *CreateHasherSpec() { return new CSha512Hasher(size); } \ | ||
| 76 | static const CHasherInfo g_HasherInfo = { CreateHasherSpec, id, name, size }; \ | ||
| 77 | struct REGISTER_HASHER_NAME(cls) { REGISTER_HASHER_NAME(cls)() { RegisterHasher(&g_HasherInfo); }}; \ | ||
| 78 | static REGISTER_HASHER_NAME(cls) g_RegisterHasher; } | ||
| 79 | |||
| 80 | // REGISTER_SHA512_HASHER (Sha512_224_Hasher, 0x220, "SHA512-224", SHA512_224_DIGEST_SIZE) | ||
| 81 | // REGISTER_SHA512_HASHER (Sha512_256_Hasher, 0x221, "SHA512-256", SHA512_256_DIGEST_SIZE) | ||
| 82 | REGISTER_SHA512_HASHER (Sha384Hasher, 0x222, "SHA384", SHA512_384_DIGEST_SIZE) | ||
| 83 | REGISTER_SHA512_HASHER (Sha512Hasher, 0x223, "SHA512", SHA512_DIGEST_SIZE) | ||
