xmlsecurity/qa/unit/signing/data/badDsigGPG.odt |binary xmlsecurity/qa/unit/signing/data/badStreamGPG.odt |binary xmlsecurity/qa/unit/signing/data/goodGPG.odt |binary xmlsecurity/qa/unit/signing/data/pubring.gpg |binary xmlsecurity/qa/unit/signing/data/random_seed | 2 xmlsecurity/qa/unit/signing/data/secring.gpg |binary xmlsecurity/qa/unit/signing/data/trustdb.gpg |binary xmlsecurity/qa/unit/signing/data/untrustedGoodGPG.odt |binary xmlsecurity/qa/unit/signing/signing.cxx | 91 +++++++++++++++++- 9 files changed, 92 insertions(+), 1 deletion(-)
New commits: commit 6da58b0e842b81669e5076c2c00dddf67a5616e1 Author: Thorsten Behrens <thorsten.behr...@cib.de> Date: Wed Dec 6 14:02:25 2017 +0100 gpg4libre: add unit tests for ODF signing feature Since this requires a working gpg setup, limit to linux for the moment. If you need to add signatures or redo them, run LibreOffice from a shell with env var GNUPGHOME=<core>/xmlsecurity/qa/unit/signing/data/ set. For editing keys, gpg2 also accepts a --homedir=<core>/xmlsecurity/qa/unit/signing/data/ option Change-Id: I59e5b563098b19d05c8c2db32537241bc835fc80 Reviewed-on: https://gerrit.libreoffice.org/45950 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de> diff --git a/xmlsecurity/qa/unit/signing/data/badDsigGPG.odt b/xmlsecurity/qa/unit/signing/data/badDsigGPG.odt new file mode 100644 index 000000000000..032ddbf7a276 Binary files /dev/null and b/xmlsecurity/qa/unit/signing/data/badDsigGPG.odt differ diff --git a/xmlsecurity/qa/unit/signing/data/badStreamGPG.odt b/xmlsecurity/qa/unit/signing/data/badStreamGPG.odt new file mode 100644 index 000000000000..252ea26b00b1 Binary files /dev/null and b/xmlsecurity/qa/unit/signing/data/badStreamGPG.odt differ diff --git a/xmlsecurity/qa/unit/signing/data/goodGPG.odt b/xmlsecurity/qa/unit/signing/data/goodGPG.odt new file mode 100644 index 000000000000..a02af30169fe Binary files /dev/null and b/xmlsecurity/qa/unit/signing/data/goodGPG.odt differ diff --git a/xmlsecurity/qa/unit/signing/data/pubring.gpg b/xmlsecurity/qa/unit/signing/data/pubring.gpg new file mode 100644 index 000000000000..40a8d53fb401 Binary files /dev/null and b/xmlsecurity/qa/unit/signing/data/pubring.gpg differ diff --git a/xmlsecurity/qa/unit/signing/data/random_seed b/xmlsecurity/qa/unit/signing/data/random_seed new file mode 100644 index 000000000000..8e68109a880e --- /dev/null +++ b/xmlsecurity/qa/unit/signing/data/random_seed @@ -0,0 +1,2 @@ +°Á,A? ´ p£Ôj`\ÚGkV¿feTâ*ì;¼^hÌFÖ¾3µ}²´iõÅsAØr¾9©B´h¡oWFæÀ! !7(â;9µ±xÚ*L¯zY¡8=ë#ç6æñÇï3Y&](^æµ4änZ?ålÿ.÷®ÔÓïØ}Öµ]¡5w6!Ç?ç¼lãÁ'%k©.^,IfÏVîVÏÓ ¥'_R!QºéUݪiDöUZ" ¦ö°Z°$R^MfØçàï )_~»ñûwoÊÃ6c©3/ CÌñ÷Åù*EÅ;BzQ"MÛúÖ¶QCú-é×Òí¾¼' Ýy³$ ë_ ÓÏ!^s2zht¯LÇNÖ;¼©Íè¶\ûÁÅ«çÌ 0måøöG¼÷9õM_®'ÕÆm(K·HÏ|ñôô®ÌézU;0Az|ñ½°§8òX=aÙHºX>cÂ4&Å6¢ãÜkñÓ/TìCäÆÃ½¿sÈÀÊ_O`ä %M{UD çù¸Â{Ô;[cV9Ä]!ýf@û(p^ÝÐ[ÿîhíÌáyòöséTäëotf(«"Î(×qN²©c¤r ÚÓ½aµÔÐܵ Û§õ·³*³?>õYC6Åøa%'Ë]Ìi=g¯lR +/R°?uÿâñâê7[ÄF(È \ No newline at end of file diff --git a/xmlsecurity/qa/unit/signing/data/secring.gpg b/xmlsecurity/qa/unit/signing/data/secring.gpg new file mode 100644 index 000000000000..d98950c22ecd Binary files /dev/null and b/xmlsecurity/qa/unit/signing/data/secring.gpg differ diff --git a/xmlsecurity/qa/unit/signing/data/trustdb.gpg b/xmlsecurity/qa/unit/signing/data/trustdb.gpg new file mode 100644 index 000000000000..c86bb02f3d79 Binary files /dev/null and b/xmlsecurity/qa/unit/signing/data/trustdb.gpg differ diff --git a/xmlsecurity/qa/unit/signing/data/untrustedGoodGPG.odt b/xmlsecurity/qa/unit/signing/data/untrustedGoodGPG.odt new file mode 100644 index 000000000000..e1b36d54417e Binary files /dev/null and b/xmlsecurity/qa/unit/signing/data/untrustedGoodGPG.odt differ diff --git a/xmlsecurity/qa/unit/signing/signing.cxx b/xmlsecurity/qa/unit/signing/signing.cxx index 4d2419cf6e41..635993eb38b6 100644 --- a/xmlsecurity/qa/unit/signing/signing.cxx +++ b/xmlsecurity/qa/unit/signing/signing.cxx @@ -8,6 +8,7 @@ */ #include <config_features.h> +#include <config_gpgme.h> #include <sal/config.h> @@ -102,7 +103,18 @@ public: void testXAdESGood(); /// Test importing of signature line images void testSignatureLineImages(); - +#ifdef LINUX +# if GPGME_HAVE_GPGME + /// Test a typical ODF where all streams are GPG-signed. + void testODFGoodGPG(); + /// Test a typical ODF where all streams are GPG-signed, but we don't trust the signature. + void testODFUntrustedGoodGPG(); + /// Test a typical broken ODF signature where one stream is corrupted. + void testODFBrokenStreamGPG(); + /// Test a typical broken ODF signature where the XML dsig hash is corrupted. + void testODFBrokenDsigGPG(); +# endif +#endif CPPUNIT_TEST_SUITE(SigningTest); CPPUNIT_TEST(testDescription); CPPUNIT_TEST(testODFGood); @@ -125,6 +137,14 @@ public: CPPUNIT_TEST(testXAdES); CPPUNIT_TEST(testXAdESGood); CPPUNIT_TEST(testSignatureLineImages); +#ifdef LINUX +# if GPGME_HAVE_GPGME + CPPUNIT_TEST(testODFGoodGPG); + CPPUNIT_TEST(testODFUntrustedGoodGPG); + CPPUNIT_TEST(testODFBrokenStreamGPG); + CPPUNIT_TEST(testODFBrokenDsigGPG); +# endif +#endif CPPUNIT_TEST_SUITE_END(); private: @@ -157,6 +177,16 @@ void SigningTest::setUp() osl::FileBase::getSystemPathFromFileURL(aTargetDir, aTargetPath); setenv("MOZILLA_CERTIFICATE_FOLDER", aTargetPath.toUtf8().getStr(), 1); #endif +#ifdef LINUX +# if GPGME_HAVE_GPGME + // Make gpg use our own defined setup below data dir + OUString aHomePath; + osl::FileBase::getSystemPathFromFileURL( + m_directories.getURLFromSrc(DATA_DIRECTORY), + aHomePath); + setenv("GNUPGHOME", aHomePath.toUtf8().getStr(), 1); +# endif +#endif } void SigningTest::tearDown() @@ -657,6 +687,65 @@ void SigningTest::testSignatureLineImages() CPPUNIT_ASSERT(xSignatureInfo[0].InvalidSignatureLineImage.is()); } +#ifdef LINUX +# if GPGME_HAVE_GPGME +void SigningTest::testODFGoodGPG() +{ + createDoc(m_directories.getURLFromSrc(DATA_DIRECTORY) + "goodGPG.odt"); + SfxBaseModel* pBaseModel = dynamic_cast<SfxBaseModel*>(mxComponent.get()); + CPPUNIT_ASSERT(pBaseModel); + SfxObjectShell* pObjectShell = pBaseModel->GetObjectShell(); + CPPUNIT_ASSERT(pObjectShell); + // Our local gpg config fully trusts the signing cert, so in + // contrast to the X509 test we can fail on NOTVALIDATED here + SignatureState nActual = pObjectShell->GetDocumentSignatureState(); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + (OString::number( + static_cast<std::underlying_type<SignatureState>::type>(nActual)) + .getStr()), + nActual, SignatureState::OK); +} + +void SigningTest::testODFUntrustedGoodGPG() +{ + createDoc(m_directories.getURLFromSrc(DATA_DIRECTORY) + "untrustedGoodGPG.odt"); + SfxBaseModel* pBaseModel = dynamic_cast<SfxBaseModel*>(mxComponent.get()); + CPPUNIT_ASSERT(pBaseModel); + SfxObjectShell* pObjectShell = pBaseModel->GetObjectShell(); + CPPUNIT_ASSERT(pObjectShell); + // Our local gpg config does _not_ trust the signing cert, so in + // contrast to the X509 test we can fail everything but + // NOTVALIDATED here + SignatureState nActual = pObjectShell->GetDocumentSignatureState(); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + (OString::number( + static_cast<std::underlying_type<SignatureState>::type>(nActual)) + .getStr()), + nActual, SignatureState::NOTVALIDATED); +} + +void SigningTest::testODFBrokenStreamGPG() +{ + createDoc(m_directories.getURLFromSrc(DATA_DIRECTORY) + "badStreamGPG.odt"); + SfxBaseModel* pBaseModel = dynamic_cast<SfxBaseModel*>(mxComponent.get()); + CPPUNIT_ASSERT(pBaseModel); + SfxObjectShell* pObjectShell = pBaseModel->GetObjectShell(); + CPPUNIT_ASSERT(pObjectShell); + CPPUNIT_ASSERT_EQUAL(static_cast<int>(SignatureState::BROKEN), static_cast<int>(pObjectShell->GetDocumentSignatureState())); +} + +void SigningTest::testODFBrokenDsigGPG() +{ + createDoc(m_directories.getURLFromSrc(DATA_DIRECTORY) + "badDsigGPG.odt"); + SfxBaseModel* pBaseModel = dynamic_cast<SfxBaseModel*>(mxComponent.get()); + CPPUNIT_ASSERT(pBaseModel); + SfxObjectShell* pObjectShell = pBaseModel->GetObjectShell(); + CPPUNIT_ASSERT(pObjectShell); + CPPUNIT_ASSERT_EQUAL(static_cast<int>(SignatureState::BROKEN), static_cast<int>(pObjectShell->GetDocumentSignatureState())); +} +# endif +#endif + void SigningTest::registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) { xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("odfds"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0"));
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits