File indexing completed on 2024-04-28 04:32:45

0001 /*
0002     SPDX-FileCopyrightText: 2018 Chinmoy Ranjan Pradhan <chinmoyrp65@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "signatureutils.h"
0008 #include <KLocalizedString>
0009 
0010 using namespace Okular;
0011 
0012 static QString handleEmpty(const QString &string, CertificateInfo::EmptyString empty)
0013 {
0014     if (string.isEmpty()) {
0015         switch (empty) {
0016         case CertificateInfo::EmptyString::Empty:
0017             return {};
0018         case CertificateInfo::EmptyString::TranslatedNotAvailable:
0019             return i18n("Not Available");
0020         }
0021         return {};
0022     }
0023     return string;
0024 }
0025 
0026 class EntityInfo
0027 {
0028 public:
0029     QString commonName;
0030     QString distinguishedName;
0031     QString emailAddress;
0032     QString organization;
0033 };
0034 class Okular::CertificateInfoPrivate : public QSharedData
0035 {
0036 public:
0037     bool isNull = true;
0038     int version = -1;
0039     QByteArray serialNumber;
0040     EntityInfo issuerInfo;
0041     EntityInfo subjectInfo;
0042     QString nickName;
0043     QDateTime validityStart;
0044     QDateTime validityEnd;
0045     CertificateInfo::KeyUsageExtensions keyUsageExtensions = CertificateInfo::KuNone;
0046     QByteArray publicKey;
0047     CertificateInfo::PublicKeyType publicKeyType = CertificateInfo::OtherKey;
0048     int publicKeyStrength = -1;
0049     bool isSelfSigned = false;
0050     QByteArray certificateData;
0051     CertificateInfo::Backend backend = CertificateInfo::Backend::Unknown;
0052     CertificateInfo::KeyLocation keyLocation = CertificateInfo::KeyLocation::Unknown;
0053     std::function<bool(QString)> checkPasswordFunction;
0054 };
0055 
0056 CertificateInfo::CertificateInfo()
0057     : d {new CertificateInfoPrivate()}
0058 {
0059 }
0060 
0061 Okular::CertificateInfo::CertificateInfo(const Okular::CertificateInfo &other) = default;
0062 Okular::CertificateInfo::CertificateInfo(Okular::CertificateInfo &&other) noexcept = default;
0063 Okular::CertificateInfo &Okular::CertificateInfo::operator=(const Okular::CertificateInfo &other) = default;
0064 CertificateInfo &Okular::CertificateInfo::operator=(Okular::CertificateInfo &&other) noexcept = default;
0065 
0066 CertificateInfo::~CertificateInfo() = default;
0067 
0068 Q_DECLARE_OPERATORS_FOR_FLAGS(CertificateInfo::KeyUsageExtensions)
0069 
0070 bool CertificateInfo::isNull() const
0071 {
0072     return d->isNull;
0073 }
0074 
0075 void CertificateInfo::setNull(bool isNull)
0076 {
0077     d->isNull = isNull;
0078 }
0079 
0080 int CertificateInfo::version() const
0081 {
0082     return d->version;
0083 }
0084 void CertificateInfo::setVersion(int version)
0085 {
0086     d->version = version;
0087 }
0088 
0089 QByteArray CertificateInfo::serialNumber() const
0090 {
0091     return d->serialNumber;
0092 }
0093 void CertificateInfo::setSerialNumber(const QByteArray &serialNumber)
0094 {
0095     d->serialNumber = serialNumber;
0096 }
0097 
0098 QString CertificateInfo::issuerInfo(EntityInfoKey key, EmptyString empty) const
0099 {
0100     switch (key) {
0101     case EntityInfoKey::CommonName:
0102         return handleEmpty(d->issuerInfo.commonName, empty);
0103     case EntityInfoKey::DistinguishedName:
0104         return handleEmpty(d->issuerInfo.distinguishedName, empty);
0105     case EntityInfoKey::EmailAddress:
0106         return handleEmpty(d->issuerInfo.emailAddress, empty);
0107     case EntityInfoKey::Organization:
0108         return handleEmpty(d->issuerInfo.organization, empty);
0109     }
0110     return QString();
0111 }
0112 
0113 void CertificateInfo::setIssuerInfo(EntityInfoKey key, const QString &value)
0114 {
0115     switch (key) {
0116     case EntityInfoKey::CommonName:
0117         d->issuerInfo.commonName = value;
0118         return;
0119     case EntityInfoKey::DistinguishedName:
0120         d->issuerInfo.distinguishedName = value;
0121         return;
0122     case EntityInfoKey::EmailAddress:
0123         d->issuerInfo.emailAddress = value;
0124         return;
0125     case EntityInfoKey::Organization:
0126         d->issuerInfo.organization = value;
0127         return;
0128     }
0129 }
0130 
0131 QString CertificateInfo::subjectInfo(EntityInfoKey key, EmptyString empty) const
0132 {
0133     switch (key) {
0134     case EntityInfoKey::CommonName:
0135         return handleEmpty(d->subjectInfo.commonName, empty);
0136     case EntityInfoKey::DistinguishedName:
0137         return handleEmpty(d->subjectInfo.distinguishedName, empty);
0138     case EntityInfoKey::EmailAddress:
0139         return handleEmpty(d->subjectInfo.emailAddress, empty);
0140     case EntityInfoKey::Organization:
0141         return handleEmpty(d->subjectInfo.organization, empty);
0142     }
0143     return QString();
0144 }
0145 
0146 void CertificateInfo::setSubjectInfo(EntityInfoKey key, const QString &value)
0147 {
0148     switch (key) {
0149     case EntityInfoKey::CommonName:
0150         d->subjectInfo.commonName = value;
0151         return;
0152     case EntityInfoKey::DistinguishedName:
0153         d->subjectInfo.distinguishedName = value;
0154         return;
0155     case EntityInfoKey::EmailAddress:
0156         d->subjectInfo.emailAddress = value;
0157         return;
0158     case EntityInfoKey::Organization:
0159         d->subjectInfo.organization = value;
0160         return;
0161     }
0162 }
0163 
0164 QString CertificateInfo::nickName() const
0165 {
0166     return d->nickName;
0167 }
0168 
0169 void CertificateInfo::setNickName(const QString &nickName)
0170 {
0171     d->nickName = nickName;
0172 }
0173 
0174 QDateTime CertificateInfo::validityStart() const
0175 {
0176     return d->validityStart;
0177 }
0178 
0179 void CertificateInfo::setValidityStart(const QDateTime &start)
0180 {
0181     d->validityStart = start;
0182 }
0183 
0184 QDateTime CertificateInfo::validityEnd() const
0185 {
0186     return d->validityEnd;
0187 }
0188 
0189 void Okular::CertificateInfo::setValidityEnd(const QDateTime &validityEnd)
0190 {
0191     d->validityEnd = validityEnd;
0192 }
0193 
0194 CertificateInfo::KeyUsageExtensions CertificateInfo::keyUsageExtensions() const
0195 {
0196     return d->keyUsageExtensions;
0197 }
0198 
0199 void Okular::CertificateInfo::setKeyUsageExtensions(Okular::CertificateInfo::KeyUsageExtensions ext)
0200 {
0201     d->keyUsageExtensions = ext;
0202 }
0203 
0204 QByteArray CertificateInfo::publicKey() const
0205 {
0206     return d->publicKey;
0207 }
0208 
0209 void Okular::CertificateInfo::setPublicKey(const QByteArray &publicKey)
0210 {
0211     d->publicKey = publicKey;
0212 }
0213 
0214 CertificateInfo::PublicKeyType CertificateInfo::publicKeyType() const
0215 {
0216     return d->publicKeyType;
0217 }
0218 
0219 void CertificateInfo::setPublicKeyType(PublicKeyType type)
0220 {
0221     d->publicKeyType = type;
0222 }
0223 
0224 int CertificateInfo::publicKeyStrength() const
0225 {
0226     return d->publicKeyStrength;
0227 }
0228 
0229 void CertificateInfo::setPublicKeyStrength(int strength)
0230 {
0231     d->publicKeyStrength = strength;
0232 }
0233 
0234 bool CertificateInfo::isSelfSigned() const
0235 {
0236     return d->isSelfSigned;
0237 }
0238 
0239 void CertificateInfo::setSelfSigned(bool selfSigned)
0240 {
0241     d->isSelfSigned = selfSigned;
0242 }
0243 
0244 QByteArray CertificateInfo::certificateData() const
0245 {
0246     return d->certificateData;
0247 }
0248 
0249 void CertificateInfo::setCertificateData(const QByteArray &certificateData)
0250 {
0251     d->certificateData = certificateData;
0252 }
0253 
0254 CertificateInfo::KeyLocation CertificateInfo::keyLocation() const
0255 {
0256     return d->keyLocation;
0257 }
0258 
0259 void CertificateInfo::setKeyLocation(KeyLocation location)
0260 {
0261     d->keyLocation = location;
0262 }
0263 
0264 CertificateInfo::Backend CertificateInfo::backend() const
0265 {
0266     return d->backend;
0267 }
0268 
0269 void CertificateInfo::setBackend(Backend backend)
0270 {
0271     d->backend = backend;
0272 }
0273 
0274 bool CertificateInfo::checkPassword(const QString &password) const
0275 {
0276     if (d->checkPasswordFunction) {
0277         return d->checkPasswordFunction(password);
0278     }
0279     return false;
0280 }
0281 
0282 void CertificateInfo::setCheckPasswordFunction(const std::function<bool(const QString &)> &passwordFunction)
0283 {
0284     d->checkPasswordFunction = passwordFunction;
0285 }
0286 
0287 class Okular::SignatureInfoPrivate : public QSharedData
0288 {
0289 public:
0290     SignatureInfo::SignatureStatus signatureStatus = SignatureInfo::SignatureStatusUnknown;
0291     SignatureInfo::CertificateStatus certificateStatus = SignatureInfo::CertificateStatusUnknown;
0292     SignatureInfo::HashAlgorithm hashAlgorithm = SignatureInfo::HashAlgorithmUnknown;
0293     QString signerName;
0294     QString signerSubjectDN;
0295     QString location;
0296     QString reason;
0297     QDateTime signingTime;
0298     QByteArray signature;
0299     QList<qint64> signedRangeBounds;
0300     bool signsTotalDocument = false;
0301     CertificateInfo certificateInfo;
0302 };
0303 
0304 SignatureInfo::SignatureInfo()
0305     : d {new SignatureInfoPrivate()}
0306 {
0307 }
0308 
0309 SignatureInfo::SignatureInfo(SignatureInfo &&other) noexcept = default;
0310 SignatureInfo::SignatureInfo(const SignatureInfo &other) = default;
0311 SignatureInfo &SignatureInfo::operator=(SignatureInfo &&other) noexcept = default;
0312 Okular::SignatureInfo &Okular::SignatureInfo::operator=(const Okular::SignatureInfo &other) = default;
0313 SignatureInfo::~SignatureInfo() = default;
0314 
0315 SignatureInfo::SignatureStatus SignatureInfo::signatureStatus() const
0316 {
0317     return d->signatureStatus;
0318 }
0319 
0320 void SignatureInfo::setSignatureStatus(SignatureInfo::SignatureStatus status)
0321 {
0322     d->signatureStatus = status;
0323 }
0324 
0325 SignatureInfo::CertificateStatus SignatureInfo::certificateStatus() const
0326 {
0327     return d->certificateStatus;
0328 }
0329 
0330 void SignatureInfo::setCertificateStatus(SignatureInfo::CertificateStatus status)
0331 {
0332     d->certificateStatus = status;
0333 }
0334 
0335 SignatureInfo::HashAlgorithm SignatureInfo::hashAlgorithm() const
0336 {
0337     return d->hashAlgorithm;
0338 }
0339 
0340 void Okular::SignatureInfo::setHashAlgorithm(Okular::SignatureInfo::HashAlgorithm algorithm)
0341 {
0342     d->hashAlgorithm = algorithm;
0343 }
0344 
0345 QString SignatureInfo::signerName() const
0346 {
0347     return d->signerName;
0348 }
0349 
0350 void SignatureInfo::setSignerName(const QString &signerName)
0351 {
0352     d->signerName = signerName;
0353 }
0354 
0355 QString SignatureInfo::signerSubjectDN() const
0356 {
0357     return d->signerSubjectDN;
0358 }
0359 
0360 void Okular::SignatureInfo::setSignerSubjectDN(const QString &signerSubjectDN)
0361 {
0362     d->signerSubjectDN = signerSubjectDN;
0363 }
0364 
0365 QString SignatureInfo::location() const
0366 {
0367     return d->location;
0368 }
0369 
0370 void SignatureInfo::setLocation(const QString &location)
0371 {
0372     d->location = location;
0373 }
0374 
0375 QString SignatureInfo::reason() const
0376 {
0377     return d->reason;
0378 }
0379 
0380 void Okular::SignatureInfo::setReason(const QString &reason)
0381 {
0382     d->reason = reason;
0383 }
0384 
0385 QDateTime SignatureInfo::signingTime() const
0386 {
0387     return d->signingTime;
0388 }
0389 
0390 void Okular::SignatureInfo::setSigningTime(const QDateTime &time)
0391 {
0392     d->signingTime = time;
0393 }
0394 
0395 QByteArray SignatureInfo::signature() const
0396 {
0397     return d->signature;
0398 }
0399 
0400 void SignatureInfo::setSignature(const QByteArray &signature)
0401 {
0402     d->signature = signature;
0403 }
0404 
0405 QList<qint64> SignatureInfo::signedRangeBounds() const
0406 {
0407     return d->signedRangeBounds;
0408 }
0409 
0410 void SignatureInfo::setSignedRangeBounds(const QList<qint64> &range)
0411 {
0412     d->signedRangeBounds = range;
0413 }
0414 
0415 bool SignatureInfo::signsTotalDocument() const
0416 {
0417     return d->signsTotalDocument;
0418 }
0419 
0420 void SignatureInfo::setSignsTotalDocument(bool total)
0421 {
0422     d->signsTotalDocument = total;
0423 }
0424 
0425 CertificateInfo SignatureInfo::certificateInfo() const
0426 {
0427     return d->certificateInfo;
0428 }
0429 
0430 void SignatureInfo::setCertificateInfo(const Okular::CertificateInfo &info)
0431 {
0432     d->certificateInfo = info;
0433 }
0434 
0435 CertificateStore::CertificateStore()
0436 {
0437 }
0438 
0439 CertificateStore::~CertificateStore()
0440 {
0441 }
0442 
0443 QList<CertificateInfo> CertificateStore::signingCertificates(bool *userCancelled) const
0444 {
0445     *userCancelled = false;
0446     return QList<CertificateInfo>();
0447 }
0448 
0449 QList<CertificateInfo> CertificateStore::signingCertificatesForNow(bool *userCancelled, bool *nonDateValidCerts) const
0450 {
0451     const QDateTime now = QDateTime::currentDateTime();
0452     QList<Okular::CertificateInfo> certs = signingCertificates(userCancelled);
0453     auto it = certs.begin();
0454     *nonDateValidCerts = false;
0455     while (it != certs.end()) {
0456         if (it->validityStart() > now || now > it->validityEnd()) {
0457             it = certs.erase(it);
0458             *nonDateValidCerts = true;
0459         } else {
0460             ++it;
0461         }
0462     }
0463     return certs;
0464 }