Blame lang/cpp/src/key.h

Packit d7e8d0
/*
Packit d7e8d0
  key.h - wraps a gpgme key
Packit d7e8d0
  Copyright (C) 2003, 2005 Klarälvdalens Datakonsult AB
Packit d7e8d0
Packit d7e8d0
  This file is part of GPGME++.
Packit d7e8d0
Packit d7e8d0
  GPGME++ is free software; you can redistribute it and/or
Packit d7e8d0
  modify it under the terms of the GNU Library General Public
Packit d7e8d0
  License as published by the Free Software Foundation; either
Packit d7e8d0
  version 2 of the License, or (at your option) any later version.
Packit d7e8d0
Packit d7e8d0
  GPGME++ is distributed in the hope that it will be useful,
Packit d7e8d0
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d7e8d0
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit d7e8d0
  GNU Library General Public License for more details.
Packit d7e8d0
Packit d7e8d0
  You should have received a copy of the GNU Library General Public License
Packit d7e8d0
  along with GPGME++; see the file COPYING.LIB.  If not, write to the
Packit d7e8d0
  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit d7e8d0
  Boston, MA 02110-1301, USA.
Packit d7e8d0
*/
Packit d7e8d0
Packit d7e8d0
// -*- c++ -*-
Packit d7e8d0
#ifndef __GPGMEPP_KEY_H__
Packit d7e8d0
#define __GPGMEPP_KEY_H__
Packit d7e8d0
Packit d7e8d0
#include "global.h"
Packit d7e8d0
#include "notation.h"
Packit d7e8d0
Packit d7e8d0
#include "gpgmefw.h"
Packit d7e8d0
Packit d7e8d0
#include <memory>
Packit d7e8d0
#include <sys/time.h>
Packit d7e8d0
Packit d7e8d0
#include <vector>
Packit d7e8d0
#include <algorithm>
Packit d7e8d0
#include <string>
Packit d7e8d0
Packit d7e8d0
namespace GpgME
Packit d7e8d0
{
Packit d7e8d0
Packit d7e8d0
class Context;
Packit d7e8d0
Packit d7e8d0
class Subkey;
Packit d7e8d0
class UserID;
Packit d7e8d0
class TofuInfo;
Packit d7e8d0
Packit d7e8d0
typedef std::shared_ptr< std::remove_pointer<gpgme_key_t>::type > shared_gpgme_key_t;
Packit d7e8d0
Packit d7e8d0
//
Packit d7e8d0
// class Key
Packit d7e8d0
//
Packit d7e8d0
Packit d7e8d0
class GPGMEPP_EXPORT Key
Packit d7e8d0
{
Packit d7e8d0
    friend class ::GpgME::Context;
Packit d7e8d0
    struct Null {
Packit d7e8d0
		Null() {}
Packit d7e8d0
	};
Packit d7e8d0
public:
Packit d7e8d0
    Key();
Packit d7e8d0
    /* implicit */ Key(const Null &);
Packit d7e8d0
    Key(const shared_gpgme_key_t &key);
Packit d7e8d0
    Key(gpgme_key_t key, bool acquireRef);
Packit d7e8d0
Packit d7e8d0
    static const Null null;
Packit d7e8d0
Packit d7e8d0
    const Key &operator=(Key other)
Packit d7e8d0
    {
Packit d7e8d0
        swap(other);
Packit d7e8d0
        return *this;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    const Key &mergeWith(const Key &other);
Packit d7e8d0
Packit d7e8d0
    void swap(Key &other)
Packit d7e8d0
    {
Packit d7e8d0
        using std::swap;
Packit d7e8d0
        swap(this->key, other.key);
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    bool isNull() const
Packit d7e8d0
    {
Packit d7e8d0
        return !key;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    UserID userID(unsigned int index) const;
Packit d7e8d0
    Subkey subkey(unsigned int index) const;
Packit d7e8d0
Packit d7e8d0
    unsigned int numUserIDs() const;
Packit d7e8d0
    unsigned int numSubkeys() const;
Packit d7e8d0
Packit d7e8d0
    std::vector<UserID> userIDs() const;
Packit d7e8d0
    std::vector<Subkey> subkeys() const;
Packit d7e8d0
Packit d7e8d0
    bool isRevoked() const;
Packit d7e8d0
    bool isExpired() const;
Packit d7e8d0
    bool isDisabled() const;
Packit d7e8d0
    bool isInvalid() const;
Packit d7e8d0
Packit d7e8d0
    bool canEncrypt() const;
Packit d7e8d0
    /*!
Packit d7e8d0
      This function contains a workaround for old gpgme's: all secret
Packit d7e8d0
      OpenPGP keys canSign() == true, which canReallySign() doesn't
Packit d7e8d0
      have. I don't have time to find what breaks when I remove this
Packit d7e8d0
      workaround, but since Kleopatra merges secret into public keys,
Packit d7e8d0
      the workaround is not necessary there (and actively harms), I've
Packit d7e8d0
      added a new function instead.
Packit d7e8d0
     */
Packit d7e8d0
    bool canSign() const;
Packit d7e8d0
    bool canReallySign() const;
Packit d7e8d0
    bool canCertify() const;
Packit d7e8d0
    bool canAuthenticate() const;
Packit d7e8d0
    bool isQualified() const;
Packit d7e8d0
    bool isDeVs() const;
Packit d7e8d0
Packit d7e8d0
    bool hasSecret() const;
Packit d7e8d0
    GPGMEPP_DEPRECATED bool isSecret() const
Packit d7e8d0
    {
Packit d7e8d0
        return hasSecret();
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    /*!
Packit d7e8d0
      @return true if this is a X.509 root certificate (currently
Packit d7e8d0
      equivalent to something like
Packit d7e8d0
      strcmp( chainID(), subkey(0).fingerprint() ) == 0 )
Packit d7e8d0
    */
Packit d7e8d0
    bool isRoot() const;
Packit d7e8d0
Packit d7e8d0
    enum OwnerTrust { Unknown = 0, Undefined = 1, Never = 2,
Packit d7e8d0
                      Marginal = 3, Full = 4, Ultimate = 5
Packit d7e8d0
                    };
Packit d7e8d0
Packit d7e8d0
    OwnerTrust ownerTrust() const;
Packit d7e8d0
    char ownerTrustAsString() const;
Packit d7e8d0
Packit d7e8d0
    Protocol protocol() const;
Packit d7e8d0
    const char *protocolAsString() const;
Packit d7e8d0
Packit d7e8d0
    const char *issuerSerial() const;
Packit d7e8d0
    const char *issuerName() const;
Packit d7e8d0
    const char *chainID() const;
Packit d7e8d0
Packit d7e8d0
    const char *keyID() const;
Packit d7e8d0
    const char *shortKeyID() const;
Packit d7e8d0
    const char *primaryFingerprint() const;
Packit d7e8d0
Packit d7e8d0
    unsigned int keyListMode() const;
Packit d7e8d0
Packit d7e8d0
    /*! Update information about this key.
Packit d7e8d0
     * Starts a keylisting for this key with validity
Packit d7e8d0
     * and tofu information gathering. Blocks for
Packit d7e8d0
     * how long the keylisting takes.*/
Packit d7e8d0
    void update();
Packit d7e8d0
Packit d7e8d0
    /**
Packit d7e8d0
     * @brief Add a user id to this key.
Packit d7e8d0
     *
Packit d7e8d0
     * Needs gnupg 2.1.13 and the key needs to be updated
Packit d7e8d0
     * afterwards to see the new uid.
Packit d7e8d0
     *
Packit d7e8d0
     * @param uid should be fully formated and UTF-8 encoded.
Packit d7e8d0
     *
Packit d7e8d0
     * @returns a possible error.
Packit d7e8d0
     **/
Packit d7e8d0
    Error addUid(const char *uid);
Packit d7e8d0
private:
Packit d7e8d0
    gpgme_key_t impl() const
Packit d7e8d0
    {
Packit d7e8d0
        return key.get();
Packit d7e8d0
    }
Packit d7e8d0
    shared_gpgme_key_t key;
Packit d7e8d0
};
Packit d7e8d0
Packit d7e8d0
//
Packit d7e8d0
// class Subkey
Packit d7e8d0
//
Packit d7e8d0
Packit d7e8d0
class GPGMEPP_EXPORT Subkey
Packit d7e8d0
{
Packit d7e8d0
public:
Packit d7e8d0
    Subkey();
Packit d7e8d0
    Subkey(const shared_gpgme_key_t &key, gpgme_sub_key_t subkey);
Packit d7e8d0
    Subkey(const shared_gpgme_key_t &key, unsigned int idx);
Packit d7e8d0
Packit d7e8d0
    const Subkey &operator=(Subkey other)
Packit d7e8d0
    {
Packit d7e8d0
        swap(other);
Packit d7e8d0
        return *this;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    void swap(Subkey &other)
Packit d7e8d0
    {
Packit d7e8d0
        using std::swap;
Packit d7e8d0
        swap(this->key, other.key);
Packit d7e8d0
        swap(this->subkey, other.subkey);
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    bool isNull() const
Packit d7e8d0
    {
Packit d7e8d0
        return !key || !subkey;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    Key parent() const;
Packit d7e8d0
Packit d7e8d0
    const char *keyID() const;
Packit d7e8d0
    const char *fingerprint() const;
Packit d7e8d0
Packit d7e8d0
    time_t creationTime() const;
Packit d7e8d0
    time_t expirationTime() const;
Packit d7e8d0
    bool neverExpires() const;
Packit d7e8d0
Packit d7e8d0
    bool isRevoked() const;
Packit d7e8d0
    bool isExpired() const;
Packit d7e8d0
    bool isInvalid() const;
Packit d7e8d0
    bool isDisabled() const;
Packit d7e8d0
Packit d7e8d0
    bool canEncrypt() const;
Packit d7e8d0
    bool canSign() const;
Packit d7e8d0
    bool canCertify() const;
Packit d7e8d0
    bool canAuthenticate() const;
Packit d7e8d0
    bool isQualified() const;
Packit d7e8d0
    bool isDeVs() const;
Packit d7e8d0
    bool isCardKey() const;
Packit d7e8d0
Packit d7e8d0
    bool isSecret() const;
Packit d7e8d0
Packit d7e8d0
    /** Same as gpgme_pubkey_algo_t */
Packit d7e8d0
    enum PubkeyAlgo {
Packit d7e8d0
        AlgoUnknown = 0,
Packit d7e8d0
        AlgoRSA     = 1,
Packit d7e8d0
        AlgoRSA_E   = 2,
Packit d7e8d0
        AlgoRSA_S   = 3,
Packit d7e8d0
        AlgoELG_E   = 16,
Packit d7e8d0
        AlgoDSA     = 17,
Packit d7e8d0
        AlgoECC     = 18,
Packit d7e8d0
        AlgoELG     = 20,
Packit d7e8d0
        AlgoECDSA   = 301,
Packit d7e8d0
        AlgoECDH    = 302,
Packit d7e8d0
        AlgoEDDSA   = 303,
Packit d7e8d0
        AlgoMax     = 1 << 31
Packit d7e8d0
    };
Packit d7e8d0
Packit d7e8d0
    PubkeyAlgo publicKeyAlgorithm() const;
Packit d7e8d0
Packit d7e8d0
    /**
Packit d7e8d0
      @brief Get the public key algorithm name.
Packit d7e8d0
Packit d7e8d0
      This only works for the pre 2.1 algorithms for ECC NULL is returned.
Packit d7e8d0
Packit d7e8d0
      @returns a statically allocated string with the name of the public
Packit d7e8d0
               key algorithm, or NULL if that name is not known.
Packit d7e8d0
    */
Packit d7e8d0
    const char *publicKeyAlgorithmAsString() const;
Packit d7e8d0
Packit d7e8d0
    /** @brief Same as publicKeyAlgorithmAsString but static. */
Packit d7e8d0
    static const char *publicKeyAlgorithmAsString(PubkeyAlgo algo);
Packit d7e8d0
Packit d7e8d0
    /**
Packit d7e8d0
       @brief Get the key algo string like GnuPG 2.1 prints it.
Packit d7e8d0
Packit d7e8d0
       This returns combinations of size and algorithm. Like
Packit d7e8d0
       bp512 or rsa2048. Misnamed because publicKeyAlgorithmAsString
Packit d7e8d0
       already used the older pubkey_algo_name.
Packit d7e8d0
       Actually uses gpgme_pubkey_algo_string.
Packit d7e8d0
Packit d7e8d0
       @returns the key algorithm as string. Empty string on error.
Packit d7e8d0
    */
Packit d7e8d0
    std::string algoName() const;
Packit d7e8d0
Packit d7e8d0
    unsigned int length() const;
Packit d7e8d0
Packit d7e8d0
    const char *cardSerialNumber() const;
Packit d7e8d0
Packit d7e8d0
    const char *keyGrip() const;
Packit d7e8d0
Packit d7e8d0
private:
Packit d7e8d0
    shared_gpgme_key_t key;
Packit d7e8d0
    gpgme_sub_key_t subkey;
Packit d7e8d0
};
Packit d7e8d0
Packit d7e8d0
//
Packit d7e8d0
// class UserID
Packit d7e8d0
//
Packit d7e8d0
Packit d7e8d0
class GPGMEPP_EXPORT UserID
Packit d7e8d0
{
Packit d7e8d0
public:
Packit d7e8d0
    class Signature;
Packit d7e8d0
Packit d7e8d0
    UserID();
Packit d7e8d0
    UserID(const shared_gpgme_key_t &key, gpgme_user_id_t uid);
Packit d7e8d0
    UserID(const shared_gpgme_key_t &key, unsigned int idx);
Packit d7e8d0
Packit d7e8d0
    const UserID &operator=(UserID other)
Packit d7e8d0
    {
Packit d7e8d0
        swap(other);
Packit d7e8d0
        return *this;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    void swap(UserID &other)
Packit d7e8d0
    {
Packit d7e8d0
        using std::swap;
Packit d7e8d0
        swap(this->key, other.key);
Packit d7e8d0
        swap(this->uid, other.uid);
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    bool isNull() const
Packit d7e8d0
    {
Packit d7e8d0
        return !key || !uid;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    Key parent() const;
Packit d7e8d0
Packit d7e8d0
    unsigned int numSignatures() const;
Packit d7e8d0
    Signature signature(unsigned int index) const;
Packit d7e8d0
    std::vector<Signature> signatures() const;
Packit d7e8d0
Packit d7e8d0
    const char *id() const;
Packit d7e8d0
    const char *name() const;
Packit d7e8d0
    const char *email() const;
Packit d7e8d0
    const char *comment() const;
Packit d7e8d0
Packit d7e8d0
    enum Validity { Unknown = 0, Undefined = 1, Never = 2,
Packit d7e8d0
                    Marginal = 3, Full = 4, Ultimate = 5
Packit d7e8d0
                  };
Packit d7e8d0
Packit d7e8d0
    Validity validity() const;
Packit d7e8d0
    char validityAsString() const;
Packit d7e8d0
Packit d7e8d0
    bool isRevoked() const;
Packit d7e8d0
    bool isInvalid() const;
Packit d7e8d0
Packit d7e8d0
    /** TOFU info for this userid.
Packit d7e8d0
     * @returns The TOFU stats or a null TofuInfo.
Packit d7e8d0
     */
Packit d7e8d0
    GpgME::TofuInfo tofuInfo() const;
Packit d7e8d0
Packit d7e8d0
    /*! Wrapper around gpgme_addrspec_from_uid.
Packit d7e8d0
     *
Packit d7e8d0
     * The input string should match the format of
Packit d7e8d0
     * a user id string.
Packit d7e8d0
     *
Packit d7e8d0
     * @returns a normalized mail address if found
Packit d7e8d0
     * or an empty string. */
Packit d7e8d0
    static std::string addrSpecFromString(const char *uid);
Packit d7e8d0
Packit d7e8d0
    /*! Wrapper around gpgme_addrspec_from_uid.
Packit d7e8d0
     *
Packit d7e8d0
     * @returns a normalized mail address for this userid
Packit d7e8d0
     * or an empty string. */
Packit d7e8d0
    std::string addrSpec() const;
Packit d7e8d0
Packit d7e8d0
    /*! Revoke the user id.
Packit d7e8d0
     *
Packit d7e8d0
     * Key needs update afterwards.
Packit d7e8d0
     *
Packit d7e8d0
     * @returns an error on error.*/
Packit d7e8d0
    Error revoke();
Packit d7e8d0
private:
Packit d7e8d0
    shared_gpgme_key_t key;
Packit d7e8d0
    gpgme_user_id_t uid;
Packit d7e8d0
};
Packit d7e8d0
Packit d7e8d0
//
Packit d7e8d0
// class UserID::Signature
Packit d7e8d0
//
Packit d7e8d0
Packit d7e8d0
class GPGMEPP_EXPORT UserID::Signature
Packit d7e8d0
{
Packit d7e8d0
public:
Packit d7e8d0
    typedef GPGMEPP_DEPRECATED GpgME::Notation Notation;
Packit d7e8d0
Packit d7e8d0
    Signature();
Packit d7e8d0
    Signature(const shared_gpgme_key_t &key, gpgme_user_id_t uid, gpgme_key_sig_t sig);
Packit d7e8d0
    Signature(const shared_gpgme_key_t &key, gpgme_user_id_t uid, unsigned int idx);
Packit d7e8d0
Packit d7e8d0
    const Signature &operator=(Signature other)
Packit d7e8d0
    {
Packit d7e8d0
        swap(other);
Packit d7e8d0
        return *this;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    void swap(Signature &other)
Packit d7e8d0
    {
Packit d7e8d0
        using std::swap;
Packit d7e8d0
        swap(this->key, other.key);
Packit d7e8d0
        swap(this->uid, other.uid);
Packit d7e8d0
        swap(this->sig, other.sig);
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    bool isNull() const
Packit d7e8d0
    {
Packit d7e8d0
        return !sig || !uid || !key ;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    UserID parent() const;
Packit d7e8d0
Packit d7e8d0
    const char *signerKeyID() const;
Packit d7e8d0
Packit d7e8d0
    const char *algorithmAsString() const;
Packit d7e8d0
    unsigned int algorithm() const;
Packit d7e8d0
    time_t creationTime() const;
Packit d7e8d0
    time_t expirationTime() const;
Packit d7e8d0
    bool neverExpires() const;
Packit d7e8d0
Packit d7e8d0
    bool isRevokation() const;
Packit d7e8d0
    bool isInvalid() const;
Packit d7e8d0
    bool isExpired() const;
Packit d7e8d0
    bool isExportable() const;
Packit d7e8d0
Packit d7e8d0
    const char *signerUserID() const;
Packit d7e8d0
    const char *signerName() const;
Packit d7e8d0
    const char *signerEmail() const;
Packit d7e8d0
    const char *signerComment() const;
Packit d7e8d0
Packit d7e8d0
    unsigned int certClass() const;
Packit d7e8d0
Packit d7e8d0
    enum Status { NoError = 0, SigExpired, KeyExpired,
Packit d7e8d0
                  BadSignature, NoPublicKey, GeneralError
Packit d7e8d0
                };
Packit d7e8d0
    Status status() const;
Packit d7e8d0
    std::string statusAsString() const;
Packit d7e8d0
Packit d7e8d0
    const char *policyURL() const;
Packit d7e8d0
Packit d7e8d0
    unsigned int numNotations() const;
Packit d7e8d0
    GpgME::Notation notation(unsigned int idx) const;
Packit d7e8d0
    std::vector<GpgME::Notation> notations() const;
Packit d7e8d0
Packit d7e8d0
private:
Packit d7e8d0
    shared_gpgme_key_t key;
Packit d7e8d0
    gpgme_user_id_t uid;
Packit d7e8d0
    gpgme_key_sig_t sig;
Packit d7e8d0
};
Packit d7e8d0
Packit d7e8d0
GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const UserID &uid);
Packit d7e8d0
GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Key &key);
Packit d7e8d0
Packit d7e8d0
} // namespace GpgME
Packit d7e8d0
Packit d7e8d0
GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Key)
Packit d7e8d0
GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Subkey)
Packit d7e8d0
GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(UserID)
Packit d7e8d0
GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(UserID::Signature)
Packit d7e8d0
Packit d7e8d0
GPGMEPP_MAKE_STRCMP(ByFingerprint, .primaryFingerprint());
Packit d7e8d0
GPGMEPP_MAKE_STRCMP(ByKeyID, .keyID());
Packit d7e8d0
GPGMEPP_MAKE_STRCMP(ByShortKeyID, .shortKeyID());
Packit d7e8d0
GPGMEPP_MAKE_STRCMP(ByChainID, .chainID());
Packit d7e8d0
Packit d7e8d0
#endif // __GPGMEPP_KEY_H__