13#include "keyparameters.h"
15#include <Libkleo/KeyUsage>
20#include "libkleo_debug.h"
24using namespace Qt::StringLiterals;
40 return email.left(at + 1) + encodeDomainName(email.mid(at + 1));
44class KeyParameters::Private
46 friend class ::Kleo::KeyParameters;
50 Subkey::PubkeyAlgo keyType = Subkey::AlgoUnknown;
52 unsigned int keyLength = 0;
56 Subkey::PubkeyAlgo subkeyType = Subkey::AlgoUnknown;
57 unsigned int subkeyLength = 0;
64 std::vector<QString> emailAdresses;
65 std::vector<QString> domainNames;
66 std::vector<QString> uris;
73 QStringList controlStatements;
76 explicit Private(Protocol proto)
82KeyParameters::KeyParameters()
83 : KeyParameters{NoProtocol}
87KeyParameters::KeyParameters(Protocol protocol)
88 : d{new Private{protocol}}
92KeyParameters::~KeyParameters() =
default;
94KeyParameters::KeyParameters(
const KeyParameters &other)
95 : d{new Private{*other.d}}
99KeyParameters &KeyParameters::operator=(
const KeyParameters &other)
105KeyParameters::KeyParameters(KeyParameters &&other) =
default;
107KeyParameters &KeyParameters::operator=(KeyParameters &&other) =
default;
109KeyParameters::Protocol KeyParameters::protocol()
const
114void KeyParameters::setKeyType(Subkey::PubkeyAlgo type)
119GpgME::Subkey::PubkeyAlgo KeyParameters::keyType()
const
124void KeyParameters::setCardKeyRef(
const QString &cardKeyRef)
126 d->cardKeyRef = cardKeyRef;
129QString KeyParameters::cardKeyRef()
const
131 return d->cardKeyRef;
134void KeyParameters::setKeyLength(
unsigned int length)
136 d->keyLength = length;
139unsigned int KeyParameters::keyLength()
const
144void KeyParameters::setKeyCurve(
const QString &curve)
149QString KeyParameters::keyCurve()
const
154void KeyParameters::setKeyUsage(
const KeyUsage &usage)
159KeyUsage KeyParameters::keyUsage()
const
164void KeyParameters::setSubkeyType(Subkey::PubkeyAlgo type)
166 d->subkeyType =
type;
169Subkey::PubkeyAlgo KeyParameters::subkeyType()
const
171 return d->subkeyType;
174void KeyParameters::setSubkeyLength(
unsigned int length)
176 d->subkeyLength = length;
179unsigned int KeyParameters::subkeyLength()
const
181 return d->subkeyLength;
184void KeyParameters::setSubkeyCurve(
const QString &curve)
186 d->subkeyCurve = curve;
189QString KeyParameters::subkeyCurve()
const
191 return d->subkeyCurve;
194void KeyParameters::setSubkeyUsage(
const KeyUsage &usage)
196 d->subkeyUsage = usage;
199KeyUsage KeyParameters::subkeyUsage()
const
201 return d->subkeyUsage;
204void KeyParameters::setExpirationDate(
const QDate &date)
206 d->expirationDate = date;
209QDate KeyParameters::expirationDate()
const
211 return d->expirationDate;
214void KeyParameters::setName(
const QString &name)
219QString KeyParameters::name()
const
224void KeyParameters::setComment(
const QString &comment)
226 d->comment = comment;
229QString KeyParameters::comment()
const
234void KeyParameters::setDN(
const QString &dn)
239QString KeyParameters::dn()
const
244void KeyParameters::setEmail(
const QString &email)
246 d->emailAdresses = {email};
249void KeyParameters::addEmail(
const QString &email)
251 d->emailAdresses.push_back(email);
254const std::vector<QString> &KeyParameters::emails()
const
256 return d->emailAdresses;
259void KeyParameters::addDomainName(
const QString &domain)
261 d->domainNames.push_back(domain);
264const std::vector<QString> &KeyParameters::domainNames()
const
266 return d->domainNames;
269void KeyParameters::addURI(
const QString &uri)
271 d->uris.push_back(uri);
274const std::vector<QString> &KeyParameters::uris()
const
279QString KeyParameters::serial()
const
284void KeyParameters::setSerial(
const QString &serial)
289void KeyParameters::setUseRandomSerial()
291 d->serial = u
"random"_s;
294QString KeyParameters::issuerDN()
const
299void KeyParameters::setIssuerDN(
const QString &issuerDN)
301 d->issuerDN = issuerDN;
304QString KeyParameters::signingKey()
const
306 return d->signingKey;
309void KeyParameters::setSigningKey(
const QString &signingKey)
311 d->signingKey = signingKey;
314QStringList KeyParameters::controlStatements()
const
316 return d->controlStatements;
319void KeyParameters::setControlStatements(
const QStringList &controlStatements)
321 QStringList validControlStatements;
322 for (
const auto &controlStatement : controlStatements) {
323 if (controlStatement.startsWith(u
'%')) {
324 validControlStatements << controlStatements;
326 qCWarning(LIBKLEO_LOG).nospace() <<
"Invalid control statement \"" << controlStatement <<
"\". Control statements start with a %";
329 d->controlStatements = validControlStatements;
334QString serialize(Subkey::PubkeyAlgo algo)
339QString serialize(
unsigned int number)
344QString serialize(KeyUsage keyUsage)
347 if (keyUsage.canSign()) {
348 usages << QStringLiteral(
"sign");
350 if (keyUsage.canEncrypt()) {
351 usages << QStringLiteral(
"encrypt");
353 if (keyUsage.canAuthenticate()) {
354 usages << QStringLiteral(
"auth");
356 if (keyUsage.canCertify()) {
357 usages << QStringLiteral(
"cert");
359 return usages.
join(QLatin1Char{
' '});
362QString serialize(
const QDate &date)
367QString serialize(
const char *key,
const QString &value)
373QString KeyParameters::toString()
const
375 QStringList keyParameters;
377 keyParameters.
push_back(QLatin1StringView(
"<GnupgKeyParms format=\"internal\">"));
379 if (d->protocol == OpenPGP) {
381 keyParameters.
push_back(QStringLiteral(
"%ask-passphrase"));
385 if (!d->cardKeyRef.isEmpty()) {
386 keyParameters.
push_back(serialize(
"Key-Type", QLatin1StringView{
"card:"} + d->cardKeyRef));
387 }
else if (d->keyType != Subkey::AlgoUnknown) {
388 keyParameters.
push_back(serialize(
"Key-Type", serialize(d->keyType)));
390 qCWarning(LIBKLEO_LOG) <<
"KeyParameters::toString(): Key type is unset/empty";
393 keyParameters.
push_back(serialize(
"Key-Length", serialize(d->keyLength)));
395 if (!d->keyCurve.isEmpty()) {
396 keyParameters.
push_back(serialize(
"Key-Curve", d->keyCurve));
398 keyParameters.
push_back(serialize(
"Key-Usage", serialize(d->keyUsage)));
400 if (d->subkeyType != Subkey::AlgoUnknown) {
401 keyParameters.
push_back(serialize(
"Subkey-Type", serialize(d->subkeyType)));
402 if (d->subkeyUsage.value()) {
403 keyParameters.
push_back(serialize(
"Subkey-Usage", serialize(d->subkeyUsage)));
405 if (d->subkeyLength) {
406 keyParameters.
push_back(serialize(
"Subkey-Length", serialize(d->subkeyLength)));
408 if (!d->subkeyCurve.isEmpty()) {
409 keyParameters.
push_back(serialize(
"Subkey-Curve", d->subkeyCurve));
413 if (d->expirationDate.isValid()) {
414 keyParameters.
push_back(serialize(
"Expire-Date", serialize(d->expirationDate)));
417 if (!d->serial.isEmpty()) {
418 keyParameters.
push_back(serialize(
"Serial", d->serial));
421 if (!d->issuerDN.isEmpty()) {
422 keyParameters.
push_back(serialize(
"Issuer-DN", d->issuerDN));
425 if (!d->issuerDN.isEmpty()) {
426 keyParameters.
push_back(serialize(
"Signing-Key", d->signingKey));
429 if (!d->name.isEmpty()) {
430 keyParameters.
push_back(serialize(
"Name-Real", d->name));
432 if (!d->comment.isEmpty()) {
433 keyParameters.
push_back(serialize(
"Name-Comment", d->comment));
435 if (!d->dn.isEmpty()) {
436 keyParameters.
push_back(serialize(
"Name-DN", d->dn));
438 std::transform(std::cbegin(d->emailAdresses), std::cend(d->emailAdresses), std::back_inserter(keyParameters), [
this](
const auto &email) {
439 return serialize(
"Name-Email", (d->protocol == CMS) ? encodeEmail(email) : email);
441 std::transform(std::cbegin(d->domainNames), std::cend(d->domainNames), std::back_inserter(keyParameters), [](
const auto &domain) {
442 return serialize(
"Name-DNS", encodeDomainName(domain));
444 std::transform(std::cbegin(d->uris), std::cend(d->uris), std::back_inserter(keyParameters), [](
const auto &uri) {
445 return serialize(
"Name-URI", uri);
448 for (
const auto &controlStatement : d->controlStatements) {
449 keyParameters.
push_back(controlStatement);
452 keyParameters.
push_back(QLatin1StringView(
"</GnupgKeyParms>"));
454 return keyParameters.
join(QLatin1Char(
'\n'));
Type type(const QSqlDatabase &db)
bool isEmpty() const const
QString toString(QStringView format, QCalendar cal) const const
void push_back(parameter_type value)
QString fromLatin1(QByteArrayView str)
qsizetype lastIndexOf(QChar ch, Qt::CaseSensitivity cs) const const
QString number(double n, char format, int precision)
QString join(QChar separator) const const
QByteArray toAce(const QString &domain, AceProcessingOptions options)