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)