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 }