summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Voytenko <mav@openoffice.org>2011-03-17 09:16:41 +0100
committerMikhail Voytenko <mav@openoffice.org>2011-03-17 09:16:41 +0100
commitff0e866194b35ab33b0e622b9bd33253a4234263 (patch)
tree48e63f186e3f0ef06f6f89fd56ebbe50fe4bd346
parentcd3b62ba4bd7cbb17d905f120fad084ba4a10668 (diff)
mav60: #164341# support AES encryption
-rw-r--r--comphelper/inc/comphelper/storagehelper.hxx5
-rw-r--r--comphelper/source/misc/storagehelper.cxx37
-rw-r--r--unotools/inc/unotools/saveopt.hxx10
-rw-r--r--unotools/source/config/saveopt.cxx98
4 files changed, 137 insertions, 13 deletions
diff --git a/comphelper/inc/comphelper/storagehelper.hxx b/comphelper/inc/comphelper/storagehelper.hxx
index 6fdc050db3cf..92a2411d6441 100644
--- a/comphelper/inc/comphelper/storagehelper.hxx
+++ b/comphelper/inc/comphelper/storagehelper.hxx
@@ -165,7 +165,10 @@ public:
throw ( ::com::sun::star::uno::Exception );
static ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >
- CreatePackageEncryptionData( const ::rtl::OUString& aPassword );
+ CreatePackageEncryptionData(
+ const ::rtl::OUString& aPassword,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xSF
+ = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >() );
static sal_Bool IsValidZipEntryFileName( const ::rtl::OUString& aName, sal_Bool bSlashAllowed );
static sal_Bool IsValidZipEntryFileName( const sal_Unicode *pChar, sal_Int32 nLength, sal_Bool bSlashAllowed );
diff --git a/comphelper/source/misc/storagehelper.cxx b/comphelper/source/misc/storagehelper.cxx
index 60ffa965fcf1..ae3c14c58d5b 100644
--- a/comphelper/source/misc/storagehelper.cxx
+++ b/comphelper/source/misc/storagehelper.cxx
@@ -34,6 +34,9 @@
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/beans/IllegalTypeException.hpp>
+#include <com/sun/star/xml/crypto/XDigestContext.hpp>
+#include <com/sun/star/xml/crypto/XDigestContextSupplier.hpp>
+#include <com/sun/star/xml/crypto/DigestID.hpp>
#include <rtl/digest.h>
@@ -422,22 +425,44 @@ uno::Reference< embed::XStorage > OStorageHelper::GetStorageOfFormatFromStream(
}
// ----------------------------------------------------------------------
-uno::Sequence< beans::NamedValue > OStorageHelper::CreatePackageEncryptionData( const ::rtl::OUString& aPassword )
+uno::Sequence< beans::NamedValue > OStorageHelper::CreatePackageEncryptionData( const ::rtl::OUString& aPassword, const uno::Reference< lang::XMultiServiceFactory >& xSF )
{
// TODO/LATER: Should not the method be part of DocPasswordHelper?
uno::Sequence< beans::NamedValue > aEncryptionData;
+ sal_Int32 nSha1Ind = 0;
if ( aPassword.getLength() )
{
+ // generate SHA256 start key
+ try
+ {
+ uno::Reference< lang::XMultiServiceFactory > xFactory = xSF.is() ? xSF : ::comphelper::getProcessServiceFactory();
+ if ( !xFactory.is() )
+ throw uno::RuntimeException();
+
+ uno::Reference< xml::crypto::XDigestContextSupplier > xDigestContextSupplier( xFactory->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.crypto.SEInitializer" ) ) ), uno::UNO_QUERY_THROW );
+ uno::Reference< xml::crypto::XDigestContext > xDigestContext( xDigestContextSupplier->getDigestContext( xml::crypto::DigestID::SHA256, uno::Sequence< beans::NamedValue >() ), uno::UNO_SET_THROW );
+
+ ::rtl::OString aUTF8Password( ::rtl::OUStringToOString( aPassword, RTL_TEXTENCODING_UTF8 ) );
+ xDigestContext->updateDigest( uno::Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aUTF8Password.getStr() ), aUTF8Password.getLength() ) );
+ uno::Sequence< sal_Int8 > aDigest = xDigestContext->finalizeDigestAndDispose();
+
+ aEncryptionData.realloc( ++nSha1Ind );
+ aEncryptionData[0].Name = PACKAGE_ENCRYPTIONDATA_SHA256UTF8;
+ aEncryptionData[0].Value <<= aDigest;
+ }
+ catch ( uno::Exception& )
+ {}
+
// MS_1252 encoding was used for SO60 document format password encoding,
// this encoding supports only a minor subset of nonascii characters,
// but for compatibility reasons it has to be used for old document formats
- aEncryptionData.realloc( 2 );
- aEncryptionData[0].Name = PACKAGE_ENCRYPTIONDATA_SHA1UTF8;
- aEncryptionData[1].Name = PACKAGE_ENCRYPTIONDATA_SHA1MS1252;
+ aEncryptionData.realloc( nSha1Ind + 2 );
+ aEncryptionData[nSha1Ind].Name = PACKAGE_ENCRYPTIONDATA_SHA1UTF8;
+ aEncryptionData[nSha1Ind + 1].Name = PACKAGE_ENCRYPTIONDATA_SHA1MS1252;
rtl_TextEncoding pEncoding[2] = { RTL_TEXTENCODING_UTF8, RTL_TEXTENCODING_MS_1252 };
- for ( sal_Int32 nInd = 0; nInd < 2; nInd++ )
+ for ( sal_Int32 nInd = nSha1Ind; nInd < nSha1Ind + 2; nInd++ )
{
::rtl::OString aByteStrPass = ::rtl::OUStringToOString( aPassword, pEncoding[nInd] );
@@ -449,7 +474,7 @@ uno::Sequence< beans::NamedValue > OStorageHelper::CreatePackageEncryptionData(
if ( nError != rtl_Digest_E_None )
{
- aEncryptionData.realloc( 0 );
+ aEncryptionData.realloc( nSha1Ind );
break;
}
diff --git a/unotools/inc/unotools/saveopt.hxx b/unotools/inc/unotools/saveopt.hxx
index 22cf75c5be3d..9dab6150a8ad 100644
--- a/unotools/inc/unotools/saveopt.hxx
+++ b/unotools/inc/unotools/saveopt.hxx
@@ -53,7 +53,9 @@ public:
E_DOPRETTYPRINTING,
E_WARNALIENFORMAT,
E_LOADDOCPRINTER,
- E_ODFDEFAULTVERSION
+ E_ODFDEFAULTVERSION,
+ E_USESHA1INODF12,
+ E_USEBLOWFISHINODF12
};
// keep enum values sorted that a less or greater compare maps to older and newer versions!
@@ -119,6 +121,12 @@ public:
void SetODFDefaultVersion( ODFDefaultVersion eVersion );
ODFDefaultVersion GetODFDefaultVersion() const;
+ void SetUseSHA1InODF12( sal_Bool bUse );
+ sal_Bool IsUseSHA1InODF12() const;
+
+ void SetUseBlowfishInODF12( sal_Bool bUse );
+ sal_Bool IsUseBlowfishInODF12() const;
+
sal_Bool IsReadOnly( EOption eOption ) const;
};
diff --git a/unotools/source/config/saveopt.cxx b/unotools/source/config/saveopt.cxx
index 379ba65dc9e6..565816d31e27 100644
--- a/unotools/source/config/saveopt.cxx
+++ b/unotools/source/config/saveopt.cxx
@@ -79,7 +79,11 @@ class SvtSaveOptions_Impl : public utl::ConfigItem
bSaveUnpacked,
bDoPrettyPrinting,
bWarnAlienFormat,
- bLoadDocPrinter;
+ bLoadDocPrinter,
+ bUseSHA1InODF12,
+ bUseBlowfishInODF12;
+
+ SvtSaveOptions::ODFDefaultVersion eODFDefaultVersion;
sal_Bool bROAutoSaveTime,
bROUseUserData,
@@ -95,10 +99,10 @@ class SvtSaveOptions_Impl : public utl::ConfigItem
bROWarnAlienFormat,
bRODoPrettyPrinting,
bROLoadDocPrinter,
+ bROUseSHA1InODF12,
+ bROUseBlowfishInODF12,
bROODFDefaultVersion;
- SvtSaveOptions::ODFDefaultVersion eODFDefaultVersion;
-
public:
SvtSaveOptions_Impl();
~SvtSaveOptions_Impl();
@@ -120,6 +124,9 @@ public:
sal_Bool IsPrettyPrintingEnabled( ) const { return bDoPrettyPrinting; }
sal_Bool IsWarnAlienFormat() const { return bWarnAlienFormat; }
sal_Bool IsLoadDocPrinter() const { return bLoadDocPrinter; }
+ sal_Bool IsUseSHA1InODF12() const { return bUseSHA1InODF12; }
+ sal_Bool IsUseBlowfishInODF12() const { return bUseBlowfishInODF12; }
+
SvtSaveOptions::ODFDefaultVersion
GetODFDefaultVersion() const { return eODFDefaultVersion; }
@@ -137,6 +144,8 @@ public:
void EnablePrettyPrinting( sal_Bool _bDoPP );
void SetWarnAlienFormat( sal_Bool _bDoPP );
void SetLoadDocPrinter( sal_Bool bNew );
+ void SetUseSHA1InODF12( sal_Bool bUse );
+ void SetUseBlowfishInODF12( sal_Bool bUse );
void SetODFDefaultVersion( SvtSaveOptions::ODFDefaultVersion eNew );
sal_Bool IsReadOnly( SvtSaveOptions::EOption eOption ) const;
@@ -279,6 +288,24 @@ void SvtSaveOptions_Impl::SetODFDefaultVersion( SvtSaveOptions::ODFDefaultVersio
}
}
+void SvtSaveOptions_Impl::SetUseSHA1InODF12( sal_Bool bUse )
+{
+ if ( !bROUseSHA1InODF12 && bUseSHA1InODF12 != bUse )
+ {
+ bUseSHA1InODF12 = bUse;
+ SetModified();
+ }
+}
+
+void SvtSaveOptions_Impl::SetUseBlowfishInODF12( sal_Bool bUse )
+{
+ if ( !bROUseBlowfishInODF12 && bUseBlowfishInODF12 != bUse )
+ {
+ bUseBlowfishInODF12 = bUse;
+ SetModified();
+ }
+}
+
sal_Bool SvtSaveOptions_Impl::IsReadOnly( SvtSaveOptions::EOption eOption ) const
{
sal_Bool bReadOnly = CFG_READONLY_DEFAULT;
@@ -329,6 +356,12 @@ sal_Bool SvtSaveOptions_Impl::IsReadOnly( SvtSaveOptions::EOption eOption ) cons
case SvtSaveOptions::E_ODFDEFAULTVERSION :
bReadOnly = bROLoadDocPrinter;
break;
+ case SvtSaveOptions::E_USESHA1INODF12:
+ bReadOnly = bROUseSHA1InODF12;
+ break;
+ case SvtSaveOptions::E_USEBLOWFISHINODF12:
+ bReadOnly = bROUseBlowfishInODF12;
+ break;
}
return bReadOnly;
}
@@ -349,6 +382,8 @@ sal_Bool SvtSaveOptions_Impl::IsReadOnly( SvtSaveOptions::EOption eOption ) cons
#define INTERNET 13
#define SAVEWORKINGSET 14
#define ODFDEFAULTVERSION 15
+#define USESHA1INODF12 16
+#define USEBLOWFISHINODF12 17
Sequence< OUString > GetPropertyNames()
{
@@ -369,7 +404,9 @@ Sequence< OUString > GetPropertyNames()
"URL/FileSystem",
"URL/Internet",
"WorkingSet",
- "ODF/DefaultVersion"
+ "ODF/DefaultVersion",
+ "ODF/UseSHA1InODF12",
+ "ODF/UseBlowfishInODF12"
};
const int nCount = sizeof( aPropNames ) / sizeof( const char* );
@@ -399,6 +436,9 @@ SvtSaveOptions_Impl::SvtSaveOptions_Impl()
, bDoPrettyPrinting( sal_False )
, bWarnAlienFormat( sal_True )
, bLoadDocPrinter( sal_True )
+ , eODFDefaultVersion( SvtSaveOptions::ODFVER_LATEST )
+ , bUseSHA1InODF12( false )
+ , bUseBlowfishInODF12( false )
, bROAutoSaveTime( CFG_READONLY_DEFAULT )
, bROUseUserData( CFG_READONLY_DEFAULT )
, bROBackup( CFG_READONLY_DEFAULT )
@@ -414,7 +454,8 @@ SvtSaveOptions_Impl::SvtSaveOptions_Impl()
, bRODoPrettyPrinting( CFG_READONLY_DEFAULT )
, bROLoadDocPrinter( CFG_READONLY_DEFAULT )
, bROODFDefaultVersion( CFG_READONLY_DEFAULT )
- , eODFDefaultVersion( SvtSaveOptions::ODFVER_LATEST )
+ , bROUseSHA1InODF12( CFG_READONLY_DEFAULT )
+ , bROUseBlowfishInODF12( CFG_READONLY_DEFAULT )
{
Sequence< OUString > aNames = GetPropertyNames();
Sequence< Any > aValues = GetProperties( aNames );
@@ -527,6 +568,16 @@ SvtSaveOptions_Impl::SvtSaveOptions_Impl()
bROLoadDocPrinter = pROStates[nProp];
break;
+ case USESHA1INODF12:
+ bUseSHA1InODF12 = bTemp;
+ bROUseSHA1InODF12 = pROStates[nProp];
+ break;
+
+ case USEBLOWFISHINODF12:
+ bUseBlowfishInODF12 = bTemp;
+ bROUseBlowfishInODF12 = pROStates[nProp];
+ break;
+
default :
DBG_ERRORFILE( "invalid index to load a path" );
}
@@ -704,6 +755,23 @@ void SvtSaveOptions_Impl::Commit()
++nRealCount;
}
break;
+ case USESHA1INODF12:
+ if (!bROUseSHA1InODF12)
+ {
+ pValues[nRealCount] <<= bUseSHA1InODF12;
+ pNames[nRealCount] = pOrgNames[i];
+ ++nRealCount;
+ }
+ break;
+ case USEBLOWFISHINODF12:
+ if (!bROUseBlowfishInODF12)
+ {
+ pValues[nRealCount] <<= bUseBlowfishInODF12;
+ pNames[nRealCount] = pOrgNames[i];
+ ++nRealCount;
+ }
+ break;
+
default:
DBG_ERRORFILE( "invalid index to save a path" );
}
@@ -995,6 +1063,26 @@ SvtSaveOptions::ODFDefaultVersion SvtSaveOptions::GetODFDefaultVersion() const
return pImp->pSaveOpt->GetODFDefaultVersion();
}
+void SvtSaveOptions::SetUseSHA1InODF12( sal_Bool bUse )
+{
+ pImp->pSaveOpt->SetUseSHA1InODF12( bUse );
+}
+
+sal_Bool SvtSaveOptions::IsUseSHA1InODF12() const
+{
+ return pImp->pSaveOpt->IsUseSHA1InODF12();
+}
+
+void SvtSaveOptions::SetUseBlowfishInODF12( sal_Bool bUse )
+{
+ pImp->pSaveOpt->SetUseBlowfishInODF12( bUse );
+}
+
+sal_Bool SvtSaveOptions::IsUseBlowfishInODF12() const
+{
+ return pImp->pSaveOpt->IsUseBlowfishInODF12();
+}
+
sal_Bool SvtSaveOptions::IsReadOnly( SvtSaveOptions::EOption eOption ) const
{
return pImp->pSaveOpt->IsReadOnly(eOption);