[poppler] poppler/SignatureHandler.cc poppler/SignatureHandler.h
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon May 22 19:53:10 UTC 2023
poppler/SignatureHandler.cc | 15 ++++++++++++---
poppler/SignatureHandler.h | 7 ++++++-
2 files changed, 18 insertions(+), 4 deletions(-)
New commits:
commit 33672ca1b6670f7378e24f6d475438f7f5d86b05
Author: Sune Vuorela <sune at vuorela.dk>
Date: Mon May 22 19:53:08 2023 +0000
Fix crash with weird hashing used for signatures
diff --git a/poppler/SignatureHandler.cc b/poppler/SignatureHandler.cc
index a306c358..b8f08acd 100644
--- a/poppler/SignatureHandler.cc
+++ b/poppler/SignatureHandler.cc
@@ -768,11 +768,11 @@ SignatureVerificationHandler::SignatureVerificationHandler(std::vector<unsigned
SECItem usedAlgorithm = NSS_CMSSignedData_GetDigestAlgs(CMSSignedData)[0]->algorithm;
auto hashAlgorithm = SECOID_FindOIDTag(&usedAlgorithm);
HASH_HashType hashType = HASH_GetHashTypeByOidTag(hashAlgorithm);
- hashContext = std::make_unique<HashContext>(ConvertHashTypeFromNss(hashType));
+ hashContext = HashContext::create(ConvertHashTypeFromNss(hashType));
}
}
-SignatureSignHandler::SignatureSignHandler(const std::string &certNickname, HashAlgorithm digestAlgTag) : hashContext(std::make_unique<HashContext>(digestAlgTag)), signing_cert(nullptr)
+SignatureSignHandler::SignatureSignHandler(const std::string &certNickname, HashAlgorithm digestAlgTag) : hashContext(HashContext::create(digestAlgTag)), signing_cert(nullptr)
{
SignatureHandler::setNSSDir({});
signing_cert = CERT_FindCertByNickname(CERT_GetDefaultCertDB(), certNickname.c_str());
@@ -1232,7 +1232,16 @@ std::vector<unsigned char> HashContext::endHash()
return digestBuffer;
}
-HashContext::HashContext(HashAlgorithm algorithm) : hash_context { HASH_Create(HASH_GetHashTypeByOidTag(ConvertHashAlgorithmToNss(algorithm))) }, digest_alg_tag(algorithm) { }
+HashContext::HashContext(HashAlgorithm algorithm, private_tag) : hash_context { HASH_Create(HASH_GetHashTypeByOidTag(ConvertHashAlgorithmToNss(algorithm))) }, digest_alg_tag(algorithm) { }
+
+std::unique_ptr<HashContext> HashContext::create(HashAlgorithm algorithm)
+{
+ auto ctx = std::make_unique<HashContext>(algorithm, private_tag {});
+ if (ctx->hash_context) {
+ return ctx;
+ }
+ return {};
+}
HashAlgorithm HashContext::getHashAlgorithm() const
{
diff --git a/poppler/SignatureHandler.h b/poppler/SignatureHandler.h
index 8a978f09..d166305b 100644
--- a/poppler/SignatureHandler.h
+++ b/poppler/SignatureHandler.h
@@ -47,12 +47,17 @@
class HashContext
{
+ class private_tag
+ {
+ };
+
public:
- explicit HashContext(HashAlgorithm algorithm);
+ HashContext(HashAlgorithm algorithm, private_tag);
void updateHash(unsigned char *data_block, int data_len);
std::vector<unsigned char> endHash();
HashAlgorithm getHashAlgorithm() const;
~HashContext() = default;
+ static std::unique_ptr<HashContext> create(HashAlgorithm algorithm);
private:
struct HashDestroyer
More information about the poppler
mailing list