summaryrefslogtreecommitdiff
path: root/oox/source
diff options
context:
space:
mode:
Diffstat (limited to 'oox/source')
-rw-r--r--oox/source/core/filterbase.cxx3
-rw-r--r--oox/source/core/filterdetect.cxx4
-rw-r--r--oox/source/core/xmlfilterbase.cxx4
-rw-r--r--oox/source/crypto/DocumentDecryption.cxx47
-rw-r--r--oox/source/crypto/Standard2007Engine.cxx39
5 files changed, 30 insertions, 67 deletions
diff --git a/oox/source/core/filterbase.cxx b/oox/source/core/filterbase.cxx
index ff498af719d2..1eee8458bbf1 100644
--- a/oox/source/core/filterbase.cxx
+++ b/oox/source/core/filterbase.cxx
@@ -545,7 +545,8 @@ void FilterBase::setMediaDescriptor( const Sequence< PropertyValue >& rMediaDesc
OUString sFilterName = mxImpl->maMediaDesc.getUnpackedValueOrDefault( "FilterName", OUString() );
try
{
- Reference< XNameAccess > xFilters( Reference<XMultiServiceFactory>(getComponentContext()->getServiceManager(), UNO_QUERY_THROW)->createInstance("com.sun.star.document.FilterFactory" ), UNO_QUERY_THROW );
+ Reference<XMultiServiceFactory> xFactory(getComponentContext()->getServiceManager(), UNO_QUERY_THROW);
+ Reference<XNameAccess> xFilters(xFactory->createInstance("com.sun.star.document.FilterFactory" ), UNO_QUERY_THROW );
Any aValues = xFilters->getByName( sFilterName );
Sequence<PropertyValue > aPropSeq;
aValues >>= aPropSeq;
diff --git a/oox/source/core/filterdetect.cxx b/oox/source/core/filterdetect.cxx
index 7dd3f9210003..154cee0d8bde 100644
--- a/oox/source/core/filterdetect.cxx
+++ b/oox/source/core/filterdetect.cxx
@@ -286,8 +286,8 @@ PasswordVerifier::PasswordVerifier( DocumentDecryption& aDecryptor ) :
comphelper::DocPasswordVerifierResult PasswordVerifier::verifyPassword( const OUString& rPassword, Sequence<NamedValue>& rEncryptionData )
{
- if( mDecryptor.generateEncryptionKey(rPassword) )
- rEncryptionData = mDecryptor.createEncryptionData();
+ if(mDecryptor.generateEncryptionKey(rPassword))
+ rEncryptionData = mDecryptor.createEncryptionData(rPassword);
return rEncryptionData.hasElements() ? comphelper::DocPasswordVerifierResult_OK : comphelper::DocPasswordVerifierResult_WRONG_PASSWORD;
}
diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx
index 763090ab2b20..109e9b1f3076 100644
--- a/oox/source/core/xmlfilterbase.cxx
+++ b/oox/source/core/xmlfilterbase.cxx
@@ -657,7 +657,7 @@ Reference<XStream> XmlFilterBase::implGetOutputStream( MediaDescriptor& rMediaDe
OUString aPassword;
for (int i=0; i<aMediaEncData.getLength(); i++)
{
- if (aMediaEncData[i].Name == "Password")
+ if (aMediaEncData[i].Name == "OOXPassword")
{
Any& any = aMediaEncData[i].Value;
any >>= aPassword;
@@ -690,7 +690,7 @@ bool XmlFilterBase::implFinalizeExport( MediaDescriptor& rMediaDescriptor )
for (int i=0; i<aMediaEncData.getLength(); i++)
{
- if (aMediaEncData[i].Name == "Password")
+ if (aMediaEncData[i].Name == "OOXPassword")
{
Any& any = aMediaEncData[i].Value;
any >>= aPassword;
diff --git a/oox/source/crypto/DocumentDecryption.cxx b/oox/source/crypto/DocumentDecryption.cxx
index 1cb6481f704b..0d1c72933a35 100644
--- a/oox/source/crypto/DocumentDecryption.cxx
+++ b/oox/source/crypto/DocumentDecryption.cxx
@@ -202,23 +202,9 @@ DocumentDecryption::DocumentDecryption(oox::ole::OleStorage& rOleStorage, Refere
mCryptoType(UNKNOWN)
{}
-bool DocumentDecryption::checkEncryptionData(const Sequence<NamedValue>& rEncryptionData)
+bool DocumentDecryption::checkEncryptionData(const Sequence<NamedValue>& /*rEncryptionData*/)
{
- SequenceAsHashMap aHashData( rEncryptionData );
- OUString type = aHashData.getUnpackedValueOrDefault( "CryptoType", OUString("Unknown") );
- if (type == "Standard")
- {
- Sequence<sal_Int8> aKeySeq = aHashData.getUnpackedValueOrDefault( "AES128EncryptionKey", Sequence<sal_Int8>() );
- Sequence<sal_Int8> aVerifierSeq = aHashData.getUnpackedValueOrDefault( "AES128EncryptionVerifier", Sequence<sal_Int8>() );
- Sequence<sal_Int8> aHashSeq = aHashData.getUnpackedValueOrDefault( "AES128EncryptionVerifierHash", Sequence<sal_Int8>() );
-
- vector<sal_uInt8> key = convertToVector(aKeySeq);
- vector<sal_uInt8> verifier = convertToVector(aVerifierSeq);
- vector<sal_uInt8> hash = convertToVector(aHashSeq);
-
- return Standard2007Engine::checkEncryptionData( key, key.size(), verifier, verifier.size(), hash, hash.size() );
- }
- return type == "Agile";
+ return false;
}
bool DocumentDecryption::generateEncryptionKey(const OUString& rPassword)
@@ -363,30 +349,21 @@ bool DocumentDecryption::readEncryptionInfo()
return bResult;
}
-Sequence<NamedValue> DocumentDecryption::createEncryptionData()
+Sequence<NamedValue> DocumentDecryption::createEncryptionData(const OUString& rPassword)
{
- Sequence<NamedValue> aResult;
-
- vector<sal_uInt8>& key = mEngine->getKey();
+ SequenceAsHashMap aEncryptionData;
- if (key.size() > 0)
+ if (mCryptoType == AGILE)
{
- SequenceAsHashMap aEncryptionData;
- if (mCryptoType == AGILE)
- {
- aEncryptionData["CryptoType"] <<= OUString("Agile");
- aEncryptionData["AES128EncryptionKey"] <<= Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( &key[0] ), key.size() );
- aResult = aEncryptionData.getAsConstNamedValueList();
- }
- else if (mCryptoType == STANDARD_2007)
- {
- aEncryptionData["CryptoType"] <<= OUString("Standard");
- aEncryptionData["AES128EncryptionKey"] <<= Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( &key[0] ), key.size() );
- aResult = aEncryptionData.getAsConstNamedValueList();
- }
+ aEncryptionData["CryptoType"] <<= OUString("Agile");
+ }
+ else if (mCryptoType == STANDARD_2007)
+ {
+ aEncryptionData["CryptoType"] <<= OUString("Standard");
}
- return aResult;
+ aEncryptionData["OOXPassword"] <<= rPassword;
+ return aEncryptionData.getAsConstNamedValueList();
}
bool DocumentDecryption::decrypt(Reference<XStream> xDocumentStream)
diff --git a/oox/source/crypto/Standard2007Engine.cxx b/oox/source/crypto/Standard2007Engine.cxx
index 3c17bb60907c..b437846c5f57 100644
--- a/oox/source/crypto/Standard2007Engine.cxx
+++ b/oox/source/crypto/Standard2007Engine.cxx
@@ -164,16 +164,22 @@ bool Standard2007Engine::generateEncryptionKey(const OUString& password)
mInfo.verifier.encryptedVerifier + ENCRYPTED_VERIFIER_LENGTH,
encryptedVerifier.begin());
- vector<sal_uInt8> encryptedVerifierHash(ENCRYPTED_VERIFIER_HASH_LENGTH);
+ vector<sal_uInt8> encryptedHash(ENCRYPTED_VERIFIER_HASH_LENGTH);
std::copy(
mInfo.verifier.encryptedVerifierHash,
mInfo.verifier.encryptedVerifierHash + ENCRYPTED_VERIFIER_HASH_LENGTH,
- encryptedVerifierHash.begin());
+ encryptedHash.begin());
- return checkEncryptionData(
- mKey, mKey.size(),
- encryptedVerifier, encryptedVerifier.size(),
- encryptedVerifierHash, encryptedVerifierHash.size() );
+ vector<sal_uInt8> verifier(encryptedVerifier.size(), 0);
+ Decrypt::aes128ecb(verifier, encryptedVerifier, mKey);
+
+ vector<sal_uInt8> verifierHash(encryptedHash.size(), 0);
+ Decrypt::aes128ecb(verifierHash, encryptedHash, mKey);
+
+ vector<sal_uInt8> hash(RTL_DIGEST_LENGTH_SHA1, 0);
+ sha1(hash, verifier);
+
+ return std::equal( hash.begin(), hash.end(), verifierHash.begin() );
}
bool Standard2007Engine::decrypt(
@@ -199,27 +205,6 @@ bool Standard2007Engine::decrypt(
return true;
}
-bool Standard2007Engine::checkEncryptionData(
- vector<sal_uInt8> key, sal_uInt32 keySize,
- vector<sal_uInt8> encryptedVerifier, sal_uInt32 verifierSize,
- vector<sal_uInt8> encryptedHash, sal_uInt32 hashSize )
-{
- // the only currently supported algorithm needs key size 128
- if ( keySize != 16 || verifierSize != 16 )
- return false;
-
- vector<sal_uInt8> verifier(verifierSize, 0);
- Decrypt::aes128ecb(verifier, encryptedVerifier, key);
-
- vector<sal_uInt8> verifierHash(hashSize, 0);
- Decrypt::aes128ecb(verifierHash, encryptedHash, key);
-
- vector<sal_uInt8> hash(RTL_DIGEST_LENGTH_SHA1, 0);
- sha1(hash, verifier);
-
- return std::equal( hash.begin(), hash.end(), verifierHash.begin() );
-}
-
bool Standard2007Engine::writeEncryptionInfo(const OUString& password, BinaryXOutputStream& rStream)
{
mInfo.header.flags = ENCRYPTINFO_AES | ENCRYPTINFO_CRYPTOAPI;