diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2018-10-18 10:35:25 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2018-10-29 19:35:04 +0100 |
commit | c2ceb1f54e85ebc8b38df3f2e4d1113a2fe1cc64 (patch) | |
tree | 90dede99ed9555145649e59921e1f5531134bc6e | |
parent | b8e260a9372de9ee1186e1f78ade29717e9b8026 (diff) |
lok: create certificate and private key with insertCertificate
Change-Id: Ie114068d9aec5259f9f7ed395c5dfeecf8bb787d
Reviewed-on: https://gerrit.libreoffice.org/61915
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
-rw-r--r-- | desktop/qa/desktop_lib/test_desktop_lib.cxx | 35 | ||||
-rw-r--r-- | desktop/source/lib/init.cxx | 19 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKit.h | 4 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKit.hxx | 8 |
4 files changed, 49 insertions, 17 deletions
diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index bd8b08f9fac8..aeb4f0692c42 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -2261,24 +2261,37 @@ void DesktopLOKTest::testInsertCertificate() { comphelper::LibreOfficeKit::setActive(); + // Load the document, save it into a temp file and load that file again LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); + utl::TempFile aTempFile; + aTempFile.EnableKillingFile(); + CPPUNIT_ASSERT(pDocument->pClass->saveAs(pDocument, aTempFile.GetURL().toUtf8().getStr(), "odt", nullptr)); + closeDoc(); + + mxComponent = loadFromDesktop(aTempFile.GetURL(), "com.sun.star.text.TextDocument"); + pDocument = new LibLODocument_Impl(mxComponent); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT(mxComponent.is()); pDocument->m_pDocumentClass->initializeForRendering(pDocument, "{}"); - OUString aFileURL; - createFileURL("certificate.der", aFileURL); - - SvFileStream aStream(aFileURL, StreamMode::READ); - sal_uInt64 nSize = aStream.remainingSize(); - + OUString aCertificateURL; + createFileURL("certificate.der", aCertificateURL); + SvFileStream aCertificateStream(aCertificateURL, StreamMode::READ); std::vector<unsigned char> aCertificate; - aCertificate.resize(nSize); - aStream.ReadBytes(aCertificate.data(), nSize); - - bool bResult = pDocument->m_pDocumentClass->insertCertificate(pDocument, aCertificate.data(), int(aCertificate.size())); - CPPUNIT_ASSERT(bResult); + aCertificate.resize(aCertificateStream.remainingSize()); + aCertificateStream.ReadBytes(aCertificate.data(), aCertificateStream.remainingSize()); + + OUString aPrivateKeyURL; + createFileURL("pkey.der", aPrivateKeyURL); + SvFileStream aPrivateKeyStream(aPrivateKeyURL, StreamMode::READ); + std::vector<unsigned char> aPrivateKey; + aPrivateKey.resize(aPrivateKeyStream.remainingSize()); + aPrivateKeyStream.ReadBytes(aPrivateKey.data(), aPrivateKeyStream.remainingSize()); + + pDocument->m_pDocumentClass->insertCertificate(pDocument, + aCertificate.data(), int(aCertificate.size()), + aPrivateKey.data(), int(aPrivateKey.size())); comphelper::LibreOfficeKit::setActive(false); } diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 2a13775dcc64..b08c6d694f4a 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -76,6 +76,7 @@ #include <com/sun/star/xml/crypto/SEInitializer.hpp> #include <com/sun/star/xml/crypto/XSEInitializer.hpp> #include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp> +#include <com/sun/star/xml/crypto/XCertificateCreator.hpp> #include <com/sun/star/security/DocumentDigitalSignatures.hpp> #include <com/sun/star/security/XDocumentDigitalSignatures.hpp> #include <com/sun/star/security/XCertificate.hpp> @@ -691,7 +692,9 @@ static char* doc_getPartInfo(LibreOfficeKitDocument* pThis, int nPart); static bool doc_insertCertificate(LibreOfficeKitDocument* pThis, const unsigned char* pCertificateBinary, - const int pCertificateBinarySize); + const int nCertificateBinarySize, + const unsigned char* pPrivateKeyBinary, + const int nPrivateKeyBinarySize); static int doc_getSignatureState(LibreOfficeKitDocument* pThis); @@ -3601,7 +3604,9 @@ static void doc_postWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindo } // CERTIFICATE AND DOCUMENT SIGNING -static bool doc_insertCertificate(LibreOfficeKitDocument* /*pThis*/, const unsigned char* pCertificateBinary, const int nCertificateBinarySize) +static bool doc_insertCertificate(LibreOfficeKitDocument* /*pThis*/, + const unsigned char* pCertificateBinary, const int nCertificateBinarySize, + const unsigned char* pPrivateKeyBinary, const int nPrivateKeySize) { if (!xContext.is()) return false; @@ -3614,11 +3619,19 @@ static bool doc_insertCertificate(LibreOfficeKitDocument* /*pThis*/, const unsig uno::Reference<xml::crypto::XSecurityEnvironment> xSecurityEnvironment; xSecurityEnvironment = xSecurityContext->getSecurityEnvironment(); + uno::Reference<xml::crypto::XCertificateCreator> xCertificateCreator(xSecurityEnvironment, uno::UNO_QUERY); + + if (!xCertificateCreator.is()) + return false; uno::Sequence<sal_Int8> aCertificateSequence(nCertificateBinarySize); std::copy(pCertificateBinary, pCertificateBinary + nCertificateBinarySize, aCertificateSequence.begin()); - uno::Reference<security::XCertificate> xCertificate = xSecurityEnvironment->createCertificateFromRaw(aCertificateSequence); + uno::Sequence<sal_Int8> aPrivateKeySequence(nPrivateKeySize); + std::copy(pPrivateKeyBinary, pPrivateKeyBinary + nPrivateKeySize, aPrivateKeySequence.begin()); + + uno::Reference<security::XCertificate> xCertificate; + xCertificate = xCertificateCreator->createDERCertificateWithPrivateKey(aCertificateSequence, aPrivateKeySequence); if (!xCertificate.is()) return false; diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h index 24aa496214a8..238d93f162db 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.h +++ b/include/LibreOfficeKit/LibreOfficeKit.h @@ -326,7 +326,9 @@ struct _LibreOfficeKitDocumentClass /// @see lok::Document::insertCertificate(). bool (*insertCertificate) (LibreOfficeKitDocument* pThis, const unsigned char* pCertificateBinary, - const int pCertificateBinarySize); + const int nCertificateBinarySize, + const unsigned char* pPrivateKeyBinary, + const int nPrivateKeyBinarySize); /// @see lok::Document::getSignatureState(). int (*getSignatureState) (LibreOfficeKitDocument* pThis); diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index d6e4bee6fa8e..829751f2efa9 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -582,9 +582,13 @@ public: * Insert certificate (in binary form) to the certificate store. */ bool insertCertificate(const unsigned char* pCertificateBinary, - const int pCertificateBinarySize) + const int pCertificateBinarySize, + const unsigned char* pPrivateKeyBinary, + const int nPrivateKeyBinarySize) { - return mpDoc->pClass->insertCertificate(mpDoc, pCertificateBinary, pCertificateBinarySize); + return mpDoc->pClass->insertCertificate(mpDoc, + pCertificateBinary, pCertificateBinarySize, + pPrivateKeyBinary, nPrivateKeyBinarySize); } /** |