You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

192 lines
8.3 KiB

/*
SPDX-FileCopyrightText: 2018 Chinmoy Ranjan Pradhan <chinmoyrp65@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "pdfsignatureutils.h"
#include <KLocalizedString>
#include <QDebug>
#include <QInputDialog>
static Okular::CertificateInfo::KeyUsageExtensions fromPoppler(Poppler::CertificateInfo::KeyUsageExtensions popplerKu)
{
using namespace Okular;
CertificateInfo::KeyUsageExtensions ku = CertificateInfo::KuNone;
if (popplerKu.testFlag(Poppler::CertificateInfo::KuDigitalSignature)) {
ku |= CertificateInfo::KuDigitalSignature;
}
if (popplerKu.testFlag(Poppler::CertificateInfo::KuNonRepudiation)) {
ku |= CertificateInfo::KuNonRepudiation;
}
if (popplerKu.testFlag(Poppler::CertificateInfo::KuKeyEncipherment)) {
ku |= CertificateInfo::KuKeyEncipherment;
}
if (popplerKu.testFlag(Poppler::CertificateInfo::KuDataEncipherment)) {
ku |= CertificateInfo::KuDataEncipherment;
}
if (popplerKu.testFlag(Poppler::CertificateInfo::KuKeyAgreement)) {
ku |= CertificateInfo::KuKeyAgreement;
}
if (popplerKu.testFlag(Poppler::CertificateInfo::KuKeyCertSign)) {
ku |= CertificateInfo::KuKeyCertSign;
}
if (popplerKu.testFlag(Poppler::CertificateInfo::KuClrSign)) {
ku |= CertificateInfo::KuClrSign;
}
if (popplerKu.testFlag(Poppler::CertificateInfo::KuEncipherOnly)) {
ku |= CertificateInfo::KuEncipherOnly;
}
return ku;
}
static Okular::CertificateInfo::PublicKeyType fromPoppler(Poppler::CertificateInfo::PublicKeyType type)
{
switch (type) {
case Poppler::CertificateInfo::RsaKey:
return Okular::CertificateInfo::RsaKey;
case Poppler::CertificateInfo::DsaKey:
return Okular::CertificateInfo::DsaKey;
case Poppler::CertificateInfo::EcKey:
return Okular::CertificateInfo::EcKey;
case Poppler::CertificateInfo::OtherKey:
return Okular::CertificateInfo::OtherKey;
}
return Okular::CertificateInfo::OtherKey;
}
Okular::CertificateInfo fromPoppler(const Poppler::CertificateInfo &pInfo)
{
Okular::CertificateInfo oInfo;
if (pInfo.isNull()) {
return oInfo;
}
oInfo.setNull(false);
oInfo.setVersion(pInfo.version());
oInfo.setSerialNumber(pInfo.serialNumber());
for (auto key :
{Poppler::CertificateInfo::EntityInfoKey::CommonName, Poppler::CertificateInfo::EntityInfoKey::DistinguishedName, Poppler::CertificateInfo::EntityInfoKey::EmailAddress, Poppler::CertificateInfo::EntityInfoKey::Organization}) {
oInfo.setIssuerInfo(static_cast<Okular::CertificateInfo::EntityInfoKey>(key), pInfo.issuerInfo(key));
oInfo.setSubjectInfo(static_cast<Okular::CertificateInfo::EntityInfoKey>(key), pInfo.subjectInfo(key));
}
oInfo.setNickName(pInfo.nickName());
oInfo.setValidityStart(pInfo.validityStart());
oInfo.setValidityEnd(pInfo.validityEnd());
oInfo.setKeyUsageExtensions(fromPoppler(pInfo.keyUsageExtensions()));
oInfo.setPublicKey(pInfo.publicKey());
oInfo.setPublicKeyType(fromPoppler(pInfo.publicKeyType()));
oInfo.setPublicKeyStrength(pInfo.publicKeyStrength());
oInfo.setSelfSigned(pInfo.isSelfSigned());
oInfo.setCertificateData(pInfo.certificateData());
oInfo.setCheckPasswordFunction([pInfo](const QString &password) { return pInfo.checkPassword(password); });
return oInfo;
}
Okular::SignatureInfo::CertificateStatus fromPoppler(Poppler::SignatureValidationInfo::CertificateStatus status)
{
switch (status) {
case Poppler::SignatureValidationInfo::CertificateTrusted:
return Okular::SignatureInfo::CertificateTrusted;
case Poppler::SignatureValidationInfo::CertificateUntrustedIssuer:
return Okular::SignatureInfo::CertificateUntrustedIssuer;
case Poppler::SignatureValidationInfo::CertificateUnknownIssuer:
return Okular::SignatureInfo::CertificateUnknownIssuer;
case Poppler::SignatureValidationInfo::CertificateRevoked:
return Okular::SignatureInfo::CertificateRevoked;
case Poppler::SignatureValidationInfo::CertificateExpired:
return Okular::SignatureInfo::CertificateExpired;
case Poppler::SignatureValidationInfo::CertificateGenericError:
return Okular::SignatureInfo::CertificateGenericError;
case Poppler::SignatureValidationInfo::CertificateNotVerified:
return Okular::SignatureInfo::CertificateNotVerified;
default:
return Okular::SignatureInfo::CertificateStatusUnknown;
}
}
Okular::SignatureInfo::SignatureStatus fromPoppler(Poppler::SignatureValidationInfo::SignatureStatus status)
{
switch (status) {
case Poppler::SignatureValidationInfo::SignatureValid:
return Okular::SignatureInfo::SignatureValid;
case Poppler::SignatureValidationInfo::SignatureInvalid:
return Okular::SignatureInfo::SignatureInvalid;
case Poppler::SignatureValidationInfo::SignatureDigestMismatch:
return Okular::SignatureInfo::SignatureDigestMismatch;
case Poppler::SignatureValidationInfo::SignatureDecodingError:
return Okular::SignatureInfo::SignatureDecodingError;
case Poppler::SignatureValidationInfo::SignatureGenericError:
return Okular::SignatureInfo::SignatureGenericError;
case Poppler::SignatureValidationInfo::SignatureNotFound:
return Okular::SignatureInfo::SignatureNotFound;
case Poppler::SignatureValidationInfo::SignatureNotVerified:
return Okular::SignatureInfo::SignatureNotVerified;
default:
return Okular::SignatureInfo::SignatureStatusUnknown;
}
}
Okular::SignatureInfo::HashAlgorithm fromPoppler(Poppler::SignatureValidationInfo::HashAlgorithm hash)
{
switch (hash) {
case Poppler::SignatureValidationInfo::HashAlgorithmMd2:
return Okular::SignatureInfo::HashAlgorithmMd2;
case Poppler::SignatureValidationInfo::HashAlgorithmMd5:
return Okular::SignatureInfo::HashAlgorithmMd5;
case Poppler::SignatureValidationInfo::HashAlgorithmSha1:
return Okular::SignatureInfo::HashAlgorithmSha1;
case Poppler::SignatureValidationInfo::HashAlgorithmSha256:
return Okular::SignatureInfo::HashAlgorithmSha256;
case Poppler::SignatureValidationInfo::HashAlgorithmSha384:
return Okular::SignatureInfo::HashAlgorithmSha384;
case Poppler::SignatureValidationInfo::HashAlgorithmSha512:
return Okular::SignatureInfo::HashAlgorithmSha512;
case Poppler::SignatureValidationInfo::HashAlgorithmSha224:
return Okular::SignatureInfo::HashAlgorithmSha224;
default:
return Okular::SignatureInfo::HashAlgorithmUnknown;
}
}
Okular::SignatureInfo fromPoppler(const Poppler::SignatureValidationInfo &pInfo)
{
Okular::SignatureInfo oInfo;
oInfo.setCertificateInfo(fromPoppler(pInfo.certificateInfo()));
oInfo.setSignatureStatus(fromPoppler(pInfo.signatureStatus()));
oInfo.setCertificateStatus(fromPoppler(pInfo.certificateStatus()));
oInfo.setHashAlgorithm(fromPoppler(pInfo.hashAlgorithm()));
oInfo.setSignerName(pInfo.signerName());
oInfo.setSignerSubjectDN(pInfo.signerSubjectDN());
oInfo.setLocation(pInfo.location());
oInfo.setReason(pInfo.reason());
oInfo.setSigningTime(QDateTime::fromSecsSinceEpoch(pInfo.signingTime()));
oInfo.setSignature(pInfo.signature());
oInfo.setSignedRangeBounds(pInfo.signedRangeBounds());
oInfo.setSignsTotalDocument(pInfo.signsTotalDocument());
return oInfo;
}
PopplerCertificateStore::~PopplerCertificateStore() = default;
QList<Okular::CertificateInfo> PopplerCertificateStore::signingCertificates(bool *userCancelled) const
{
*userCancelled = false;
auto PDFGeneratorNSSPasswordCallback = [&userCancelled](const char *element) -> char * {
bool ok;
const QString pwd = QInputDialog::getText(nullptr, i18n("Enter Password"), i18n("Enter password to open %1:", QString::fromUtf8(element)), QLineEdit::Password, QString(), &ok);
*userCancelled = !ok;
return ok ? strdup(pwd.toUtf8().constData()) : nullptr;
};
Poppler::setNSSPasswordCallback(PDFGeneratorNSSPasswordCallback);
const QVector<Poppler::CertificateInfo> certs = Poppler::getAvailableSigningCertificates();
QList<Okular::CertificateInfo> vReturnCerts;
for (const auto &cert : certs) {
vReturnCerts.append(fromPoppler(cert));
}
Poppler::setNSSPasswordCallback(nullptr);
return vReturnCerts;
}