I've fixed this now and it seems to build on Windows too. The fixes are in
these commits, and if they work, should be cherry-picked in the given order:

f65b4e326d91bfe900dc1dd22ece69e3ddd8444a
f3025b08c40161265442c34e2b50bc05aa5388c6
42c0a318a970f6f7f43d26a8397448d5d5b8bd36

There were several problems on Windows. The Visual Studio 2008 compiler
doesn't have the ::std::vector::data() method (even though it should, it
was part of the C++98/03 standard), I had to use &vector[0] instead. Also
that ancient OpenSSL version we use internally, 1.0.x, uses
EVP_MD_CTX_create()/destroy() instead of EVP_MD_CTX_new()/free(). Finally
some template function was unhappy about parameter type ambiguity (even
though superior compilers like Clang are perfectly happy), and I had to add
casts.


On Sun, Mar 17, 2024 at 11:15 AM Matthias Seidel <matthias.sei...@hamburg.de>
wrote:

> Hi Damjan,
>
> You are right, the interesting part is at the beginning:
>
> ---
>
> =============
> Building module oox
> =============
>
> Entering /cygdrive/c/Source/openoffice/main/oox/prj
>
> cd .. && make -s -r -j1   && make -s -r deliverlog
> [ build CXX ] oox/source/core/encryption
> encryption.cxx
> c:/Source/openoffice/main/oox/inc\oox/helper/openssl_wrapper.hxx(44) :
> error C3861: 'EVP_MD_CTX_new': identifier not found
> c:/Source/openoffice/main/oox/inc\oox/helper/openssl_wrapper.hxx(51) :
> error C3861: 'EVP_MD_CTX_free': identifier not found
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(100) : error
> C2782: 'bool oox::getFlag(Type,Type)' : template parameter 'Type' is
> ambiguous
> c:/Source/openoffice/main/oox/inc\oox/helper/helper.hxx(141) : see
> declaration of 'oox::getFlag'
>          could be 'unsigned int'
>          or       'sal_uInt32'
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(133) : error
> C2782: 'bool oox::getFlag(Type,Type)' : template parameter 'Type' is
> ambiguous
> c:/Source/openoffice/main/oox/inc\oox/helper/helper.hxx(141) : see
> declaration of 'oox::getFlag'
>          could be 'unsigned int'
>          or       'sal_uInt32'
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(134) : error
> C2782: 'bool oox::getFlag(Type,Type)' : template parameter 'Type' is
> ambiguous
> c:/Source/openoffice/main/oox/inc\oox/helper/helper.hxx(141) : see
> declaration of 'oox::getFlag'
>          could be 'unsigned int'
>          or       'sal_uInt32'
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(210) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(214) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(217) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(299) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(362) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(700) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(701) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(702) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(710) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(711) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(753) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(754) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(756) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(780) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(781) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(783) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(809) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(833) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(833) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(833) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(852) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(854) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(882) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(882) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(882) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(888) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(888) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(888) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(930) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(932) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(932) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(938) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> c:/Source/openoffice/main/oox/source/core/encryption.cxx(946) : error
> C2039: 'data' : is not a member of 'std::vector<_Ty>'
>          with
>          [
>              _Ty=sal_uInt8
>          ]
> make: *** No rule to make target
> '/cygdrive/c/Source/openoffice/main/solver/450/
> wntmsci12.pro/workdir/CxxObject/oox/source/core/encryption.o',
> needed by
> '/cygdrive/c/Source/openoffice/main/solver/450/
> wntmsci12.pro/workdir/LinkTarget/Library/ioox.lib'.
> Stop.
> dmake:  Error code 2, while making 'all'
>
> 1 module(s):
>          oox
> need(s) to be rebuilt
>
> Reason(s):
>
> ERROR: error 65280 occurred while making
> /cygdrive/c/Source/openoffice/main/oox/prj
>
> When you have fixed the errors in that module you can resume the build
> by running:
>
>          build --from oox
>
> ---
>
> Regards,
>
>     Matthias
>
> Am 17.03.24 um 01:55 schrieb Damjan Jovanovic:
> > Please check further up in the log, or run "build" in main/oox again.
> >
> > That "No rule to make target" happens after other errors break
> compilation.
> >
> > On Sat, Mar 16, 2024 at 8:38 PM Matthias Seidel <
> matthias.sei...@hamburg.de>
> > wrote:
> >
> >> Hi Damjan,
> >>
> >> Tried to build trunk on Windows but it stops here:
> >>
> >> make: *** No rule to make target
> >> '/cygdrive/c/Source/openoffice/main/solver/450/
> >> wntmsci12.pro/workdir/CxxObject/oox/source/core/encryption.o',
> >> needed by
> >> '/cygdrive/c/Source/openoffice/main/solver/450/
> >> wntmsci12.pro/workdir/LinkTarget/Library/ioox.lib'.
> >> Stop.
> >> dmake:  Error code 2, while making 'all'
> >>
> >> 1 module(s):
> >>           oox
> >> need(s) to be rebuilt
> >>
> >> Reason(s):
> >>
> >> ERROR: error 65280 occurred while making
> >> /cygdrive/c/Source/openoffice/main/oox/prj
> >>
> >> When you have fixed the errors in that module you can resume the build
> >> by running:
> >>
> >>           build --from oox
> >>
> >> Am 16.03.24 um 04:49 schrieb Damjan Jovanovic:
> >>> Hi
> >>>
> >>> Bug 118236 with 7 votes, the inability to open password-protected
> >>> (encrypted) OOXML files from MS Office 2010+, is now fixed in trunk :-)
> >>>
> >>> ---snip---
> >>> commit 506fa58b1970084a0caacb50b3a805e469be4756 (HEAD -> trunk,
> >>> origin/trunk, origin/HEAD)
> >>> Author: Damjan Jovanovic <dam...@apache.org>
> >>> Date:   Sat Mar 2 18:47:05 2024 +0200
> >>>
> >>>       Implement the (MS Office 2010+) OOXML "Agile encryption"
> support, so
> >>> that we
> >>>       can open such password-protected OOXML files.
> >>>
> >>>       Adds all the Agile encryption XML tokens and namespaces, and
> parses
> >> the
> >>> XML
> >>>       from EncryptionInfo stream, gets OpenOffice to recognize the
> file is
> >>> encrypted
> >>>       and ask for a password, and successfully decrypts the file if
> >> password
> >>> is
> >>>       correct.
> >>>
> >>>       Also a number of other fixes and improvements:
> >>>       - Sorted main/oox/source/token/tokens.txt so it's in alphabetical
> >> order
> >>>         (wrong order might have broken certain tokens?).
> >>>       - Refactored how OOXML encryption is generally handled. It's now
> in
> >> its
> >>>         own file.
> >>>       - Added logging to the FilterDetect class. It logs to the
> >> office-wide
> >>> default
> >>>         logger.
> >>>       - Added a flush() method to the BinaryXOutputStream class.
> >>>       - Changed FilterDetect to use XMultiComponentFactory and
> >>> XComponentContext
> >>>         instead of the deprecated XMultiServiceFactory.
> >>>       - Error handling was generally improved.
> >>>       - Exception safety and some memory safety (::std::vector instead
> of
> >>> new[])
> >>>         in all the new code. Memory leaks should not be possible.
> >>>
> >>>       Much of the code involved in the decryption was ported from the
> >>> excellent
> >>>       Apache POI project, so it's been credited in our NOTICE file.
> >>>
> >>>       Patch by: me
> >>> ---snip---
> >>>
> >>>
> >>> It took much longer than I expected:
> >>>
> >>> The MS-OFFCRYPTO specification was unclear, and plain wrong in some
> >> parts,
> >>> eg. "SHA-1" in the spec but "SHA1" in actual OOXML documents; I've made
> >> our
> >>> code support both.
> >>>
> >>> The "Standard" encryption from MS Office 2007 that we already supported
> >> was
> >>> itself a mess, and much work was needed to refactor and clean up that
> >> code
> >>> before the "Agile" encryption could also be added.
> >>>
> >>> Then XML parsing had to be added, since Agile encryption specifies
> >> settings
> >>> in XML instead of binary like Standard encryption did. XML handling in
> >>> OpenOffice is pretty outdated, with no support for namespaces, but at
> >> least
> >>> the newer "FastParser" does support namespaces and is in fact very fast
> >>> because it converts strings to unique integers, and packs namespaces
> into
> >>> bit fields, for faster comparisons. I ended up updating the main/oox
> >>> FastParser to support the new Agile encryption namespaces and elements.
> >>>
> >>> MS-OFFCRYPTO also only describes encryption, not decryption, and since
> we
> >>> can only read OOXML, only decryption matters.
> >>>
> >>> Apache POI code was tremendously helpful in figuring out the decryption
> >>> process. Most of the decryption code I added was just ported directly
> >> from
> >>> theirs, and thus I've added Apache POI to our NOTICE file (please check
> >>> that I've done it correctly). Also several bugs were figured out by
> >>> simultaneously stepping through our code in gdb and their code in
> >> NetBeans,
> >>> and comparing respective values. A big thank you to the Apache POI
> >>> developers, whose OOXML support is still better than ours in many ways!
> >>>
> >>> I used OpenSSL for all the message digest and encryption stuff, both
> >>> because our MD5 and SHA1 algorithms are broken (bug 127661), and
> because
> >>> Agile encryption requires many digests and ciphers that OpenSSL
> supports
> >>> but we don't.
> >>>
> >>> Anyway, it works now. All encrypted OOXML files should work, eg. text
> >>> documents, spreadsheets, presentations, etc.
> >>>
> >>> Other issues I am aware of:
> >>> - We only support password encrypted documents. Certificate encrypted
> >>> documents: not yet. ODF 1.3 also added certificate encryption, so maybe
> >>> that's something we should develop together.
> >>> - There are other variations of encryption we still don't support, eg.
> >> the
> >>> "Extensible" encryption, the "RC4 CryptoAPI" encryption, "XOR
> >> obfuscation",
> >>> etc. Apache POI would be a good source for those too. It's unclear to
> me
> >>> how widely those are used, and whether they are worth implementing.
> >>> - It may need to be rearchitected when we add OOXML writing.
> >>> - A lot of other required cleanups to our code were discovered, will
> >>> discuss those separately.
> >>>
> >>> I've squashed all my work into a single commit, so it can be easily
> >>> cherry-picked to AOO42X and maybe even AOO41X when people are happy
> with
> >> it.
> >>> Regards
> >>> Damjan
> >>>
>

Reply via email to