20#include <config_gpgme.h>
31#include <com/sun/star/uno/Sequence.hxx>
32#include <com/sun/star/xml/crypto/sax/XKeyCollector.hpp>
33#include <com/sun/star/xml/crypto/sax/ElementMarkPriority.hpp>
34#include <com/sun/star/xml/crypto/sax/XReferenceCollector.hpp>
35#include <com/sun/star/xml/crypto/sax/XSignatureVerifyResultBroadcaster.hpp>
36#include <com/sun/star/xml/crypto/XSEInitializer.hpp>
37#include <com/sun/star/graphic/GraphicProvider.hpp>
38#include <com/sun/star/embed/StorageFormats.hpp>
49using namespace css::uno;
50using namespace css::beans;
54 sal_Int32 nSecurityId)
61 sal_Int32 nIdOfSignatureElementCollector;
62 css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener > xReferenceResolvedListener;
64 nIdOfSignatureElementCollector =
65 m_xSAXEventKeeper->addSecurityElementCollector( css::xml::crypto::sax::ElementMarkPriority_BEFOREMODIFY,
false);
74 css::uno::Reference<css::lang::XInitialization> xInitialization(xReferenceResolvedListener, css::uno::UNO_QUERY);
76 css::uno::Sequence<css::uno::Any>
args
78 Any(OUString::number(nSecurityId)),
80 Any(OUString::number(nIdOfSignatureElementCollector)),
84 xInitialization->initialize(
args);
86 css::uno::Reference< css::xml::crypto::sax::XSignatureVerifyResultBroadcaster >
87 signatureVerifyResultBroadcaster(xReferenceResolvedListener, css::uno::UNO_QUERY);
89 signatureVerifyResultBroadcaster->addSignatureVerifyResultListener(
this );
92 nIdOfSignatureElementCollector,
93 xReferenceResolvedListener);
95 css::uno::Reference<css::xml::crypto::sax::XKeyCollector> keyCollector (xReferenceResolvedListener, css::uno::UNO_QUERY);
96 keyCollector->setKeyId(0);
98 return xReferenceResolvedListener;
103 css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener > xReferenceResolvedListener;
104 sal_Int32 nSignatureId = 0;
129#if HAVE_FEATURE_GPGME
140 css::uno::Reference<css::xml::crypto::XSEInitializer> xGpgSEInitializer(
143 xGpgSEInitializer->createSecurityContext(OUString()));
154 SAL_INFO(
"xmlsecurity.helper",
"XSecController::haveReferenceForId: no signature");
160 if (rSri.
nType == SignatureReferenceType::SAMEDOCUMENT
161 && rSri.
ouURI == rId)
173 SAL_INFO(
"xmlsecurity.helper",
"XSecController::addReference: no signature");
177 isi.
addReference(SignatureReferenceType::SAMEDOCUMENT, nDigestID, ouUri, -1, ouType );
181 const OUString& ouUri,
183 sal_Int32 nDigestID )
189 SAL_INFO(
"xmlsecurity.helper",
"XSecController::addStreamReference: no signature");
199 css::uno::Reference< css::io::XInputStream > xObjectInputStream
202 if ( xObjectInputStream.is() )
204 css::uno::Reference<css::xml::crypto::XUriBinding> xUriBinding
206 xUriBinding->setUriBinding(ouUri, xObjectInputStream);
217 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setReferenceCount: no signature");
228 int refNum = refInfors.size();
229 sal_Int32 referenceCount = 0;
231 for(
int i=0 ;
i<refNum; ++
i)
233 if (refInfors[
i].
nType == SignatureReferenceType::SAMEDOCUMENT )
242 css::uno::Reference<css::xml::crypto::sax::XReferenceCollector> xReferenceCollector
244 xReferenceCollector->setReferenceCount( referenceCount );
248 std::vector<std::pair<OUString, OUString>> & rX509IssuerSerials,
249 std::vector<OUString>
const& rX509Certificates)
253 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setX509IssuerName: no signature");
260 for (OUString
const& it : rX509Certificates)
265 data.back().X509Certificate = it;
266 uno::Reference<xml::crypto::XSecurityEnvironment>
const xSecEnv(
m_xSecurityContext->getSecurityEnvironment());
267 uno::Reference<security::XCertificate>
const xCert(xSecEnv->createCertificateFromAscii(it));
270 SAL_INFO(
"xmlsecurity.helper",
"cannot parse X509Certificate");
273 OUString
const issuerName(xCert->getIssuerName());
275 auto const iter = std::find_if(rX509IssuerSerials.begin(), rX509IssuerSerials.end(),
276 [&](
auto const& rX509IssuerSerial) {
277 return xmlsecurity::EqualDistinguishedNames(issuerName, rX509IssuerSerial.first, xmlsecurity::COMPAT_2ND)
278 && serialNumber == rX509IssuerSerial.second;
280 if (iter != rX509IssuerSerials.end())
282 data.back().X509IssuerName = iter->first;
283 data.back().X509SerialNumber = iter->second;
284 rX509IssuerSerials.erase(iter);
287 catch (uno::Exception
const&)
289 SAL_INFO(
"xmlsecurity.helper",
"cannot parse X509Certificate");
293 for (
auto const& it : rX509IssuerSerials)
296 data.back().X509IssuerName = it.first;
297 data.back().X509SerialNumber = it.second;
309 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setSignatureValue: no signature");
320 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setDigestValue: no signature");
326 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setDigestValue: no signature reference");
339 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setGpgKeyID: no signature");
350 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setGpgCertificate: no signature");
361 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setGpgOwner: no signature");
372 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setDate: no signature");
413 OUString
const& rCertDigest, sal_Int32
const ,
414 std::u16string_view
const& rX509IssuerName, std::u16string_view
const& rX509SerialNumber)
422 for (
auto & it : rData)
425 && it.X509SerialNumber == rX509SerialNumber)
427 it.CertDigest = rCertDigest;
435 for (
auto & it : rData)
437 if (!it.X509Certificate.isEmpty())
441 uno::Reference<xml::crypto::XSecurityEnvironment>
const xSecEnv(
m_xSecurityContext->getSecurityEnvironment());
442 uno::Reference<security::XCertificate>
const xCert(xSecEnv->createCertificateFromAscii(it.X509Certificate));
445 SAL_INFO(
"xmlsecurity.helper",
"cannot parse X509Certificate");
450 it.CertDigest = rCertDigest;
452 it.X509SerialNumber = rX509SerialNumber;
453 it.X509IssuerName = rX509IssuerName;
457 catch (uno::Exception
const&)
459 SAL_INFO(
"xmlsecurity.helper",
"cannot parse X509Certificate");
467 "xmlsecurity.helper",
"PGPKeyID vs CertDigest mismatch");
471 SAL_INFO(
"xmlsecurity.helper",
"cannot find X509Data for CertDigest");
476Reference<css::graphic::XGraphic> lcl_getGraphicFromString(std::u16string_view rImage)
478 Sequence<sal_Int8> seq;
481 Reference< graphic::XGraphic > xGraphic;
482 if( !seq.hasElements() )
483 return Reference<css::graphic::XGraphic>();
485 Reference< graphic::XGraphicProvider > xGraphicProvider(
487 Reference< io::XInputStream > xInputStream( new ::comphelper::SequenceInputStream( seq ) );
490 xGraphic = xGraphicProvider->queryGraphic(aArgs);
528 if (rEncapsulatedX509Certificate.isEmpty())
539 SAL_INFO(
"xmlsecurity.helper",
"XSecController::setId: no signature");
557 bool bJustChainingOn =
false;
558 css::uno::Reference< css::xml::sax::XDocumentHandler > xHandler;
563 for (
i=0;
i<sigNum; ++
i)
567 int refNum = vReferenceInfors.size();
569 for (j=0; j<refNum; ++j)
573 if (refInfor.
ouURI == referenceId)
577 bJustChainingOn =
true;
582 css::xml::crypto::sax::ElementMarkPriority_BEFOREMODIFY,
false );
584 css::uno::Reference<css::xml::crypto::sax::XReferenceCollector> xReferenceCollector
589 xReferenceCollector->setReferenceId( nKeeperId );
597 if ( bJustChainingOn )
613 if (
nType == embed::StorageFormats::OFOPXML)
617 css::uno::Reference< css::lang::XInitialization > xInitialization(
m_xSecParser, uno::UNO_QUERY);
void updateSignature(const css::uno::Reference< css::xml::crypto::XXMLSignature > &xSignature, const css::uno::Reference< css::xml::crypto::XXMLSecurityContext > &xContext)
rtl::Reference< SAXEventKeeperImpl > m_xSAXEventKeeper
enum XSecController::InitializationState m_eStatusOfSecurityComponents
css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener > prepareSignatureToRead(sal_Int32 nSecurityId)
css::uno::Reference< css::xml::crypto::XXMLSecurityContext > m_xSecurityContext
bool haveReferenceForId(std::u16string_view rId) const
css::uno::Reference< css::xml::crypto::XXMLSignature > m_xXMLSignature
std::vector< InternalSignatureInformation > m_vInternalSignatureInformations
void setGpgCertificate(OUString const &ouGpgCert)
void setDescription(OUString const &rId, OUString const &rDescription)
void setDigestValue(sal_Int32 nDigestID, OUString const &ouDigestValue)
void setGpgKeyID(OUString const &ouKeyID)
void setSignatureBytes(const css::uno::Sequence< sal_Int8 > &rBytes)
void clearSAXChainConnector()
void switchGpgSignature()
css::uno::Reference< css::xml::sax::XDocumentHandler > const & createSignatureReader(XMLSignatureHelper &rXMLSignatureHelper, sal_Int32 nType=0)
void setId(OUString const &ouId)
bool m_bVerifyCurrentSignature
void setSignatureMethod(svl::crypto::SignatureMethodAlgorithm eAlgorithmID)
Sets algorithm from <SignatureMethod Algorithm="...">.
sal_Int32 m_nReservedSignatureId
void setX509CertDigest(OUString const &rCertDigest, sal_Int32 const nReferenceDigestID, std::u16string_view const &rX509IssuerName, std::u16string_view const &rX509SerialNumber)
css::uno::Reference< css::xml::sax::XDocumentHandler > m_xSecParser
void setSAXChainConnector(const css::uno::Reference< css::lang::XInitialization > &xInitialization)
void setSignatureValue(OUString const &ouSignatureValue)
void setInvalidSignatureImage(std::u16string_view rInvalidSigImg)
void collectToVerify(std::u16string_view referenceId)
void setGpgOwner(OUString const &ouGpgOwner)
void addStreamReference(const OUString &ouUri, bool isBinary, sal_Int32 nDigestID)
void setDate(OUString const &rId, OUString const &ouDate)
friend class OOXMLSecParser
void setX509Data(std::vector< std::pair< OUString, OUString > > &rX509IssuerSerials, std::vector< OUString > const &rX509Certificates)
void setValidSignatureImage(std::u16string_view rValidSigImg)
void addReference(const OUString &ouUri, sal_Int32 nDigestID, const OUString &ouType)
css::uno::Reference< css::io::XInputStream > getObjectInputStream(const OUString &objectURL)
void setReferenceCount() const
void addEncapsulatedX509Certificate(const OUString &rEncapsulatedX509Certificate)
void setSignatureLineId(const OUString &rSignatureLineId)
void releaseSignatureReader()
static void decode(css::uno::Sequence< sal_Int8 > &aPass, std::u16string_view sBuffer)
#define SAL_INFO_IF(condition, area, stream)
#define SAL_WARN_IF(condition, area, stream)
#define SAL_INFO(area, stream)
Reference< XComponentContext > getProcessComponentContext()
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
bool ISO8601parseDateTime(std::u16string_view rString, css::util::DateTime &rDateTime)
OUString bigIntegerToNumericString(const Sequence< sal_Int8 > &integer)
bool EqualDistinguishedNames(std::u16string_view const rName1, std::u16string_view const rName2, EqualMode const eMode)
::std::vector< SignatureReferenceInformation > SignatureReferenceInformations