diff --git a/OfficeCryptReader/source/CryptTransform.cpp b/OfficeCryptReader/source/CryptTransform.cpp index eb8b85d731..396e05f39c 100644 --- a/OfficeCryptReader/source/CryptTransform.cpp +++ b/OfficeCryptReader/source/CryptTransform.cpp @@ -305,8 +305,15 @@ _buf GenerateOdfKey(_buf & pSalt, _buf & pPassword, int keySize, int spin, CRYPT { _buf pKey (keySize); _buf empty (NULL, 0, false); + _buf pPassword_hash; - _buf pPassword_hash = HashAppend(pPassword, empty, algorithm); + if (algorithm == CRYPT_METHOD::None) + { + pPassword_hash = pPassword; } + else + { + pPassword_hash = HashAppend(pPassword, empty, algorithm); + } PKCS5_PBKDF2_HMAC pbkdf; @@ -819,36 +826,40 @@ void ECMADecryptor::Decrypt(unsigned char* data_inp, int size, unsigned char*& d } } //----------------------------------------------------------------------------------------------------------- -void odfWriteProtect::SetPassword (const std::wstring &password_) +void ODFWriteProtect::SetPassword (const std::wstring &password_) { password = password_; } -void odfWriteProtect::SetProtectKey (const std::string &key) -{ - protect_key = key; -} -void odfWriteProtect::SetProtectAlgorithm (const CRYPT_METHOD::_hashAlgorithm &alg) -{ - hash = alg; -} -void odfWriteProtect::Generate() -{ - _buf pPassword (password); - _buf empty (NULL, 0, false); - _buf pHashTest = HashAppend(empty, pPassword, hash); - - protect_key = std::string((char*)pHashTest.ptr, pHashTest.size); -} -bool odfWriteProtect::Verify() +void ODFWriteProtect::SetCryptData(_odfWriteProtectData &_data) { - _buf pPassword (password); - _buf empty (NULL, 0, false); - _buf pHash (protect_key); + data = _data; +} +void ODFWriteProtect::GetCryptData(_odfWriteProtectData &_data) +{ + _data = data; +} - _buf pHashTest = HashAppend(empty, pPassword, hash); - - return (pHashTest == pHash); +void ODFWriteProtect::Generate() +{ + std::string passw_ansi = std::string(password.begin(), password.end()); + _buf pPassword (passw_ansi); + _buf pSalt (data.saltValue); + + _buf pHash = GenerateOdfKey(pSalt, pPassword, 16, data.spinCount, CRYPT_METHOD::None); + + data.hashValue = std::string((char*)pHash.ptr, pHash.size); +} +bool ODFWriteProtect::Verify() +{ + std::string passw_ansi = std::string(password.begin(), password.end()); + _buf pPassword (passw_ansi); + _buf pSalt (data.saltValue); + _buf pHash (data.hashValue); + + _buf pHashTest = GenerateOdfKey(pSalt, pPassword, 16, data.spinCount, CRYPT_METHOD::None); + + return (pHashTest == pHash); } //---------------------------------------------------------------------------------------------------------- void ECMAWriteProtect::SetPassword (const std::wstring &password_) diff --git a/OfficeCryptReader/source/CryptTransform.h b/OfficeCryptReader/source/CryptTransform.h index 3065e73a22..71c227f6f2 100644 --- a/OfficeCryptReader/source/CryptTransform.h +++ b/OfficeCryptReader/source/CryptTransform.h @@ -40,12 +40,14 @@ namespace CRYPT_METHOD { enum _hashAlgorithm { + None, MD5, SHA1, SHA224, SHA256, SHA384, - SHA512 + SHA512, + PBKDF2 }; enum _cipherAlgorithm @@ -81,6 +83,7 @@ struct _ecmaWriteProtectData std::string saltValue; std::string hashValue; }; +typedef _ecmaWriteProtectData _odfWriteProtectData; struct _ecmaCryptData { //default ms2010 @@ -162,21 +165,22 @@ private: }; //--------------------------------------------------------------------------------------------------- -class odfWriteProtect +class ODFWriteProtect { public: - odfWriteProtect() : hash(CRYPT_METHOD::SHA1) {} + ODFWriteProtect(){} + virtual ~ODFWriteProtect(){} - void SetPassword (const std::wstring & password); - void SetProtectKey (const std::string & protect_key); - void SetProtectAlgorithm (const CRYPT_METHOD::_hashAlgorithm & hash); + void SetPassword (const std::wstring &password); + + void SetCryptData(_odfWriteProtectData &data); + void GetCryptData(_odfWriteProtectData &data); void Generate(); bool Verify(); private: - std::wstring password; - CRYPT_METHOD::_hashAlgorithm hash; - std::string protect_key; + std::wstring password; + _odfWriteProtectData data; }; //--------------------------------------------------------------------------------------------------- class ECMAEncryptor diff --git a/OfficeCryptReader/source/ECMACryptFile.cpp b/OfficeCryptReader/source/ECMACryptFile.cpp index 6923058a68..174c0066c1 100644 --- a/OfficeCryptReader/source/ECMACryptFile.cpp +++ b/OfficeCryptReader/source/ECMACryptFile.cpp @@ -1093,3 +1093,22 @@ bool ECMACryptFile::WriteAdditional(const std::wstring &file_name, const std::ws return true; } + +bool TestOdfProtect(const std::wstring &passward, const std::string &salt, const std::string &hash, int count) +{ + CRYPT::ODFWriteProtect test; + + CRYPT::_odfWriteProtectData ver1; + + ver1.hashAlgorithm = CRYPT_METHOD::PBKDF2; + ver1.hashValue = DecodeBase64(hash); + ver1.saltValue = DecodeBase64(salt); + ver1.spinCount = count; + + test.SetCryptData(ver1); + test.SetPassword(passward); + bool result_ver1 = test.Verify(); + + return result_ver1; +} +