From 16f738ecee689c6feb2acb7e4ef4d9bb4144ae7d Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 8 Jun 2008 11:04:43 +0200 Subject: Initial commit --- zip/ZipArchive/ZipCrc32Cryptograph.h | 120 +++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 zip/ZipArchive/ZipCrc32Cryptograph.h (limited to 'zip/ZipArchive/ZipCrc32Cryptograph.h') diff --git a/zip/ZipArchive/ZipCrc32Cryptograph.h b/zip/ZipArchive/ZipCrc32Cryptograph.h new file mode 100644 index 0000000..a25edd0 --- /dev/null +++ b/zip/ZipArchive/ZipCrc32Cryptograph.h @@ -0,0 +1,120 @@ +//////////////////////////////////////////////////////////////////////////////// +// This source file is part of the ZipArchive library source distribution and +// is Copyrighted 2000 - 2007 by Artpol Software - Tadeusz Dracz +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// For the licensing details refer to the License.txt file. +// +// Web Site: http://www.artpol-software.com +//////////////////////////////////////////////////////////////////////////////// + +/** +* \file ZipCrc32Cryptograph.h +* Includes the CZipCrc32Cryptograph class. +* +*/ + +#if !defined(ZIPARCHIVE_ZIPCRC32CRYPTOGRAPH_DOT_H) +#define ZIPARCHIVE_ZIPCRC32CRYPTOGRAPH_DOT_H + +#if _MSC_VER > 1000 + #pragma once +#endif + +#include "zlib/zlib.h" + +#include "ZipCryptograph.h" +#include "ZipFileHeader.h" +#include "ZipStorage.h" + + +#define ZIPARCHIVE_ENCR_HEADER_LEN 12 + +/** + Performs the traditional zip encryption. + + \see + 0610201627|std +*/ +class ZIP_API CZipCrc32Cryptograph : public CZipCryptograph +{ +public: + CZipCrc32Cryptograph(){} + + bool InitDecode(CZipAutoBuffer& password, CZipFileHeader& currentFile, CZipStorage& storage); + void InitEncode(CZipAutoBuffer& password, CZipFileHeader& currentFile, CZipStorage& storage); + void Decode(char* pBuffer, DWORD uSize) + { + for (DWORD i = 0; i < uSize; i++) + CryptDecode(pBuffer[i]); + } + void Encode(char* pBuffer, DWORD uSize) + { + for (DWORD i = 0; i < uSize; i++) + CryptEncode(pBuffer[i]); + } + + bool CanHandle(int iEncryptionMethod) + { + return iEncryptionMethod == CZipCryptograph::encStandard; + } + + /** + See CZipCryptograph::GetEncryptedInfoSizeBeforeData + */ + static DWORD GetEncryptedInfoSizeBeforeData() + { + return ZIPARCHIVE_ENCR_HEADER_LEN; + } + + /** + See CZipCryptograph::GetEncryptedInfoSizeAfterData + */ + static DWORD GetEncryptedInfoSizeAfterData() + { + return 0; + } + + /** + Returns the CRC table. + */ + static const DWORD* GetCRCTable() + { + return zarch_get_crc_table(); + } +private: + + void CryptDecode(char &c) + { + c ^= CryptDecryptByte(); + CryptUpdateKeys(c); + } + + char CryptDecryptByte() + { + int temp = (m_keys[2] & 0xffff) | 2; + return (char)(((temp * (temp ^ 1)) >> 8) & 0xff); + } + void CryptInitKeys(CZipAutoBuffer& password); + void CryptUpdateKeys(char c); + DWORD CryptCRC32(DWORD l, char c) + { + const DWORD *CRC_TABLE = zarch_get_crc_table(); + return CRC_TABLE[(l ^ c) & 0xff] ^ (l >> 8); + } + void CryptEncode(char &c) + { + char t = CryptDecryptByte(); + CryptUpdateKeys(c); + c ^= t; + } + DWORD m_keys[3]; +public: + ~CZipCrc32Cryptograph(){} +}; + +#endif -- cgit v1.2.3