[Libreoffice-commits] core.git: 3 commits - comphelper/qa comphelper/source include/comphelper sc/inc sc/source
Eike Rathke
erack at redhat.com
Sat Feb 24 10:47:31 UTC 2018
comphelper/qa/unit/test_hash.cxx | 4 ++--
comphelper/source/misc/hash.cxx | 33 +++++++++++++++++++++++----------
include/comphelper/hash.hxx | 27 ++++++++++++++++++++++++++-
sc/inc/tabprotection.hxx | 6 ++++++
sc/source/core/data/tabprotection.cxx | 2 ++
5 files changed, 59 insertions(+), 13 deletions(-)
New commits:
commit 89182507aaf336d16ba1e89305bc2ea3b1e6949f
Author: Eike Rathke <erack at redhat.com>
Date: Sat Feb 24 11:45:34 2018 +0100
Hash Base64, Sequence and cleansing, tdf#104250 prep
Change-Id: I58d48b8caa780138b8431bec9db20c9d0e9abce7
diff --git a/comphelper/qa/unit/test_hash.cxx b/comphelper/qa/unit/test_hash.cxx
index beec2c537cf4..e15b906c190f 100644
--- a/comphelper/qa/unit/test_hash.cxx
+++ b/comphelper/qa/unit/test_hash.cxx
@@ -111,8 +111,8 @@ void TestHash::testSHA512_saltspin()
const OUString aPass("pwd");
const OUString aAlgo("SHA-512");
const OUString aSalt("876MLoKTq42+/DLp415iZQ==");
- const OUString aHash = comphelper::Hash::calculateHash( aPass, aSalt, 100000, aAlgo);
- OUString aStr("5l3mgNHXpWiFaBPv5Yso1Xd/UifWvQWmlDnl/hsCYbFT2sJCzorjRmBCQ/3qeDu6Q/4+GIE8a1DsdaTwYh1q2g==");
+ const OUString aHash = comphelper::Hash::calculateHashBase64( aPass, aSalt, 100000, aAlgo);
+ const OUString aStr("5l3mgNHXpWiFaBPv5Yso1Xd/UifWvQWmlDnl/hsCYbFT2sJCzorjRmBCQ/3qeDu6Q/4+GIE8a1DsdaTwYh1q2g==");
CPPUNIT_ASSERT_EQUAL(aStr, aHash);
}
diff --git a/comphelper/source/misc/hash.cxx b/comphelper/source/misc/hash.cxx
index 7a8c3fecd7e9..0a91536347b9 100644
--- a/comphelper/source/misc/hash.cxx
+++ b/comphelper/source/misc/hash.cxx
@@ -168,7 +168,6 @@ std::vector<unsigned char> Hash::calculateHash(
return calculateHash( pInput, nLength, eType);
Hash aHash(eType);
- std::vector<unsigned char> hash;
if (nSaltLen)
{
std::vector<unsigned char> initialData( nSaltLen + nLength);
@@ -181,7 +180,7 @@ std::vector<unsigned char> Hash::calculateHash(
{
aHash.update( pInput, nLength);
}
- hash = aHash.finalize();
+ std::vector<unsigned char> hash( aHash.finalize());
if (nSpinCount)
{
@@ -232,7 +231,7 @@ std::vector<unsigned char> Hash::calculateHash(
return calculateHash( pPassBytes, nPassBytesLen, rSaltValue.data(), rSaltValue.size(), nSpinCount, eType);
}
-OUString Hash::calculateHash(
+css::uno::Sequence<sal_Int8> Hash::calculateHashSequence(
const rtl::OUString& rPassword,
const rtl::OUString& rSaltValue,
sal_uInt32 nSpinCount,
@@ -248,17 +247,31 @@ OUString Hash::calculateHash(
else if (rAlgorithmName == "MD5")
eType = HashType::MD5;
else
- return OUString();
+ return css::uno::Sequence<sal_Int8>();
- css::uno::Sequence<sal_Int8> aSaltSeq;
- comphelper::Base64::decode( aSaltSeq, rSaltValue);
+ std::vector<unsigned char> aSaltVec;
+ if (!rSaltValue.isEmpty())
+ {
+ css::uno::Sequence<sal_Int8> aSaltSeq;
+ comphelper::Base64::decode( aSaltSeq, rSaltValue);
+ aSaltVec = comphelper::sequenceToContainer<std::vector<unsigned char>>( aSaltSeq);
+ }
+
+ std::vector<unsigned char> hash( calculateHash( rPassword, aSaltVec, nSpinCount, eType));
+
+ return comphelper::containerToSequence<sal_Int8>( hash);
+}
- std::vector<unsigned char> hash = calculateHash( rPassword,
- comphelper::sequenceToContainer<std::vector<unsigned char>>( aSaltSeq),
- nSpinCount, eType);
+OUString Hash::calculateHashBase64(
+ const rtl::OUString& rPassword,
+ const rtl::OUString& rSaltValue,
+ sal_uInt32 nSpinCount,
+ const rtl::OUString& rAlgorithmName)
+{
+ css::uno::Sequence<sal_Int8> aSeq( calculateHashSequence( rPassword, rSaltValue, nSpinCount, rAlgorithmName));
OUStringBuffer aBuf;
- comphelper::Base64::encode( aBuf, comphelper::containerToSequence<sal_Int8>( hash));
+ comphelper::Base64::encode( aBuf, aSeq);
return aBuf.makeStringAndClear();
}
diff --git a/include/comphelper/hash.hxx b/include/comphelper/hash.hxx
index 07998ad02736..b3e97553060d 100644
--- a/include/comphelper/hash.hxx
+++ b/include/comphelper/hash.hxx
@@ -12,6 +12,8 @@
#include <comphelper/comphelperdllapi.h>
+#include <com/sun/star/uno/Sequence.hxx>
+
#include <memory>
#include <vector>
@@ -97,10 +99,33 @@ public:
that have a valid match in HashType. If not, an empty string is
returned. Not all algorithm names are supported.
+ @return the raw hash value as sal_Int8 sequence.
+ */
+ static css::uno::Sequence<sal_Int8> calculateHashSequence(
+ const rtl::OUString& rPassword,
+ const rtl::OUString& rSaltValue,
+ sal_uInt32 nSpinCount,
+ const rtl::OUString& rAlgorithmName);
+
+ /** Convenience function to calculate a salted hash with iterations.
+
+ @param rPassword
+ UTF-16LE encoded string without leading BOM character
+
+ @param rSaltValue
+ Base64 encoded salt that will be decoded and prepended to password
+ data.
+
+ @param rAlgorithmName
+ One of "SHA-512", "SHA-256", ... as listed in
+ https://msdn.microsoft.com/en-us/library/dd920692
+ that have a valid match in HashType. If not, an empty string is
+ returned. Not all algorithm names are supported.
+
@return the base64 encoded string of the hash value, that can be
compared against a stored base64 encoded hash value.
*/
- static rtl::OUString calculateHash(
+ static rtl::OUString calculateHashBase64(
const rtl::OUString& rPassword,
const rtl::OUString& rSaltValue,
sal_uInt32 nSpinCount,
commit 4446ac904ebaa0b2ba0fed17f2f8fd39d3a3c7fb
Author: Eike Rathke <erack at redhat.com>
Date: Fri Feb 23 20:34:27 2018 +0100
Hold ScOoxPasswordHash at ScTableProtectionImpl, tdf#104250 prep
Change-Id: I8a3e7e0a29058708ac0a2c5b78afc69bf7bf04a6
diff --git a/sc/source/core/data/tabprotection.cxx b/sc/source/core/data/tabprotection.cxx
index 9a4a8bdde26d..9eefbfce4c97 100644
--- a/sc/source/core/data/tabprotection.cxx
+++ b/sc/source/core/data/tabprotection.cxx
@@ -132,6 +132,7 @@ private:
bool mbProtected;
ScPasswordHash meHash1;
ScPasswordHash meHash2;
+ ScOoxPasswordHash maPasswordHash;
::std::vector< ScEnhancedProtection > maEnhancedProtection;
};
@@ -198,6 +199,7 @@ ScTableProtectionImpl::ScTableProtectionImpl(const ScTableProtectionImpl& r) :
mbProtected(r.mbProtected),
meHash1(r.meHash1),
meHash2(r.meHash2),
+ maPasswordHash(r.maPasswordHash),
maEnhancedProtection(r.maEnhancedProtection)
{
}
commit f1fb9932492249ec3f1546e79be8b3be7fb195f3
Author: Eike Rathke <erack at redhat.com>
Date: Fri Feb 23 20:31:18 2018 +0100
Add ScOoxPasswordHash::clear(), tdf#104250 prep
Change-Id: Iaf3bb2ad74fe99435c74e9ea018168ff7e92a977
diff --git a/sc/inc/tabprotection.hxx b/sc/inc/tabprotection.hxx
index 0b3a3ed62105..6a776807a191 100644
--- a/sc/inc/tabprotection.hxx
+++ b/sc/inc/tabprotection.hxx
@@ -49,6 +49,12 @@ struct ScOoxPasswordHash
ScOoxPasswordHash() : mnSpinCount(0) {}
bool hasPassword() const { return !maHashValue.isEmpty(); }
+ void clear()
+ {
+ // Keep algorithm and spin count.
+ maHashValue.clear();
+ maSaltValue.clear();
+ }
};
namespace ScPassHashHelper
More information about the Libreoffice-commits
mailing list