diff options
Diffstat (limited to '')
| -rw-r--r-- | NEWS | 7 | ||||
| -rw-r--r-- | lang/cpp/src/gpgmefw.h | 3 | ||||
| -rw-r--r-- | lang/cpp/src/key.cpp | 107 | ||||
| -rw-r--r-- | lang/cpp/src/key.h | 49 | ||||
| -rw-r--r-- | lang/cpp/tests/run-keylist.cpp | 5 | 
5 files changed, 170 insertions, 1 deletions
| @@ -9,6 +9,9 @@ Noteworthy changes in version 1.24.0 (unrelease)   * Add information about designated revocation keys.  [T7118] + * cpp: Provide information about designated revocation keys for a Key. +   [T7118] +   * qt: Allow reading the data to decrypt/encrypt/sign/verify directly from     files.  [T6550] @@ -23,6 +26,10 @@ Noteworthy changes in version 1.24.0 (unrelease)   gpgme_revocation_key_t                  NEW.   cpp: Context::EncryptFile               NEW.   cpp: SignatureMode::SignFile            NEW. + cpp: RevocationKey                      NEW. + cpp: Key::revocationKey                 NEW. + cpp: Key::numRevocationKeys             NEW. + cpp: Key::revocationKeys                NEW.   qt: DecryptVerifyJob::setInputFile      NEW.   qt: DecryptVerifyJob::inputFile         NEW.   qt: DecryptVerifyJob::setOutputFile     NEW. diff --git a/lang/cpp/src/gpgmefw.h b/lang/cpp/src/gpgmefw.h index fdad7bf0..c6166d2c 100644 --- a/lang/cpp/src/gpgmefw.h +++ b/lang/cpp/src/gpgmefw.h @@ -75,4 +75,7 @@ typedef struct _gpgme_tofu_info *gpgme_tofu_info_t;  struct _gpgme_op_query_swdb_result;  typedef struct _gpgme_op_query_swdb_result *gpgme_query_swdb_result_t; +struct _gpgme_revocation_key; +typedef struct _gpgme_revocation_key *gpgme_revocation_key_t; +  #endif // __GPGMEPP_GPGMEFW_H__ diff --git a/lang/cpp/src/key.cpp b/lang/cpp/src/key.cpp index 9cbd188b..2465cf06 100644 --- a/lang/cpp/src/key.cpp +++ b/lang/cpp/src/key.cpp @@ -122,6 +122,37 @@ std::vector<Subkey> Key::subkeys() const      return v;  } +RevocationKey Key::revocationKey(unsigned int index) const +{ +    return RevocationKey(key, index); +} + +unsigned int Key::numRevocationKeys() const +{ +    if (!key) { +        return 0; +    } +    unsigned int count = 0; +    for (auto revkey = key->revocation_keys; revkey; revkey = revkey->next) { +        ++count; +    } +    return count; +} + +std::vector<RevocationKey> Key::revocationKeys() const +{ +    if (!key) { +        return std::vector<RevocationKey>(); +    } + +    std::vector<RevocationKey> v; +    v.reserve(numRevocationKeys()); +    for (auto revkey = key->revocation_keys; revkey; revkey = revkey->next) { +        v.push_back(RevocationKey(key, revkey)); +    } +    return v; +} +  Key::OwnerTrust Key::ownerTrust() const  {      if (!key) { @@ -1256,6 +1287,68 @@ bool UserID::Signature::isBad() const      return isNull() || isExpired() || isInvalid();  } +// +// +// class RevocationKey +// +// + +static gpgme_revocation_key_t find_revkey(const shared_gpgme_key_t &key, unsigned int idx) +{ +    if (key) { +        for (gpgme_revocation_key_t s = key->revocation_keys; s; s = s->next, --idx) { +            if (idx == 0) { +                return s; +            } +        } +    } +    return nullptr; +} + +static gpgme_revocation_key_t verify_revkey(const shared_gpgme_key_t &key, gpgme_revocation_key_t revkey) +{ +    if (key) { +        for (gpgme_revocation_key_t s = key->revocation_keys; s; s = s->next) { +            if (s == revkey) { +                return revkey; +            } +        } +    } +    return nullptr; +} + +RevocationKey::RevocationKey() : key(), revkey(nullptr) {} + +RevocationKey::RevocationKey(const shared_gpgme_key_t &k, unsigned int idx) +    : key(k), revkey(find_revkey(k, idx)) +{ +} + +RevocationKey::RevocationKey(const shared_gpgme_key_t &k, gpgme_revocation_key_t sk) +    : key(k), revkey(verify_revkey(k, sk)) +{ +} + +Key RevocationKey::parent() const +{ +    return Key(key); +} + +const char *RevocationKey::fingerprint() const +{ +    return revkey ? revkey->fpr : nullptr; +} + +bool RevocationKey::isSensitive() const +{ +    return revkey ? revkey->sensitive : false; +} + +int RevocationKey::algorithm() const +{ +    return revkey ? revkey->pubkey_algo : 0; +} +  std::ostream &operator<<(std::ostream &os, const UserID &uid)  {      os << "GpgME::UserID("; @@ -1325,6 +1418,20 @@ std::ostream &operator<<(std::ostream &os, const Key &key)          const std::vector<Subkey> subkeys = key.subkeys();          std::copy(subkeys.begin(), subkeys.end(),                    std::ostream_iterator<Subkey>(os, "\n")); +        os << " revocationKeys:\n"; +        const std::vector<RevocationKey> revkeys = key.revocationKeys(); +        std::copy(revkeys.begin(), revkeys.end(), +                  std::ostream_iterator<RevocationKey>(os, "\n")); +    } +    return os << ')'; +} + +std::ostream &operator<<(std::ostream &os, const RevocationKey &revkey) +{ +    os << "GpgME::RevocationKey("; +    if (!revkey.isNull()) { +        os << "\n fingerprint: " << protect(revkey.fingerprint()) +           << "\n isSensitive: " << revkey.isSensitive();      }      return os << ')';  } diff --git a/lang/cpp/src/key.h b/lang/cpp/src/key.h index bdcc18d2..a1648884 100644 --- a/lang/cpp/src/key.h +++ b/lang/cpp/src/key.h @@ -44,6 +44,7 @@ class Context;  class Subkey;  class UserID;  class TofuInfo; +class RevocationKey;  typedef std::shared_ptr< std::remove_pointer<gpgme_key_t>::type > shared_gpgme_key_t; @@ -100,6 +101,10 @@ public:      std::vector<UserID> userIDs() const;      std::vector<Subkey> subkeys() const; +    RevocationKey revocationKey(unsigned int index) const; +    unsigned int numRevocationKeys() const; +    std::vector<RevocationKey> revocationKeys() const; +      bool isRevoked() const;      bool isExpired() const;      bool isDisabled() const; @@ -547,9 +552,53 @@ private:      gpgme_key_sig_t sig;  }; +// +// class RevocationKey +// + +class GPGMEPP_EXPORT RevocationKey +{ +public: +    RevocationKey(); +    RevocationKey(const shared_gpgme_key_t &key, gpgme_revocation_key_t revkey); +    RevocationKey(const shared_gpgme_key_t &key, unsigned int idx); + +    // Rule of Zero + +    void swap(RevocationKey &other) +    { +        using std::swap; +        swap(this->key, other.key); +        swap(this->revkey, other.revkey); +    } + +    bool isNull() const +    { +        return !key || !revkey; +    } + +    Key parent() const; + +    const char *fingerprint() const; + +    bool isSensitive() const; + +    int algorithm() const; + +private: +    shared_gpgme_key_t key; +    gpgme_revocation_key_t revkey; +}; + +inline void swap(RevocationKey& v1, RevocationKey& v2) +{ +    v1.swap(v2); +} +  GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const UserID &uid);  GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Subkey &subkey);  GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Key &key); +GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const RevocationKey &revkey);  } // namespace GpgME diff --git a/lang/cpp/tests/run-keylist.cpp b/lang/cpp/tests/run-keylist.cpp index 9e7d763c..b46a815a 100644 --- a/lang/cpp/tests/run-keylist.cpp +++ b/lang/cpp/tests/run-keylist.cpp @@ -160,7 +160,10 @@ main (int argc, char **argv)      std::stringstream ss;      do {          key = ctx->nextKey(err); -        ss << key << "\n\n"; +        if (!err) +        { +            ss << key << "\n\n"; +        }      } while (!err && !key.isNull());      std::cout << ss.str(); | 
