416 lines
7.9 KiB
C++
416 lines
7.9 KiB
C++
/**
|
|
* Copyright (C) 2021 Saturneric
|
|
*
|
|
* This file is part of GpgFrontend.
|
|
*
|
|
* GpgFrontend is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* GpgFrontend is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with GpgFrontend. If not, see <https://www.gnu.org/licenses/>.
|
|
*
|
|
* The initial version of the source code is inherited from
|
|
* the gpg4usb project, which is under GPL-3.0-or-later.
|
|
*
|
|
* All the source code of GpgFrontend was modified and released by
|
|
* Saturneric<eric@bktus.com> starting on May 12, 2021.
|
|
*
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*
|
|
*/
|
|
|
|
#ifndef GPGFRONTEND_GPGKEY_H
|
|
#define GPGFRONTEND_GPGKEY_H
|
|
|
|
#include <boost/date_time.hpp>
|
|
#include <boost/date_time/posix_time/conversion.hpp>
|
|
|
|
#include "GpgSubKey.h"
|
|
#include "GpgUID.h"
|
|
|
|
namespace GpgFrontend {
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
*/
|
|
class GpgKey {
|
|
public:
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsGood() const { return key_ref_ != nullptr; }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::string
|
|
*/
|
|
[[nodiscard]] std::string GetId() const { return key_ref_->subkeys->keyid; }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::string
|
|
*/
|
|
[[nodiscard]] std::string GetName() const { return key_ref_->uids->name; };
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::string
|
|
*/
|
|
[[nodiscard]] std::string GetEmail() const { return key_ref_->uids->email; }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::string
|
|
*/
|
|
[[nodiscard]] std::string GetComment() const {
|
|
return key_ref_->uids->comment;
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::string
|
|
*/
|
|
[[nodiscard]] std::string GetFingerprint() const { return key_ref_->fpr; }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::string
|
|
*/
|
|
[[nodiscard]] std::string GetProtocol() const {
|
|
return gpgme_get_protocol_name(key_ref_->protocol);
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::string
|
|
*/
|
|
[[nodiscard]] std::string GetOwnerTrust() const {
|
|
switch (key_ref_->owner_trust) {
|
|
case GPGME_VALIDITY_UNKNOWN:
|
|
return "Unknown";
|
|
case GPGME_VALIDITY_UNDEFINED:
|
|
return "Undefined";
|
|
case GPGME_VALIDITY_NEVER:
|
|
return "Never";
|
|
case GPGME_VALIDITY_MARGINAL:
|
|
return "Marginal";
|
|
case GPGME_VALIDITY_FULL:
|
|
return "FULL";
|
|
case GPGME_VALIDITY_ULTIMATE:
|
|
return "Ultimate";
|
|
}
|
|
return "Invalid";
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::string
|
|
*/
|
|
[[nodiscard]] std::string GetPublicKeyAlgo() const {
|
|
return gpgme_pubkey_algo_name(key_ref_->subkeys->pubkey_algo);
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return boost::posix_time::ptime
|
|
*/
|
|
[[nodiscard]] boost::posix_time::ptime GetLastUpdateTime() const {
|
|
return boost::posix_time::from_time_t(
|
|
static_cast<time_t>(key_ref_->last_update));
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return boost::posix_time::ptime
|
|
*/
|
|
[[nodiscard]] boost::posix_time::ptime GetExpireTime() const {
|
|
return boost::posix_time::from_time_t(key_ref_->subkeys->expires);
|
|
};
|
|
|
|
/**
|
|
* @brief Create a time object
|
|
*
|
|
* @return boost::posix_time::ptime
|
|
*/
|
|
[[nodiscard]] boost::posix_time::ptime GetCreateTime() const {
|
|
return boost::posix_time::from_time_t(key_ref_->subkeys->timestamp);
|
|
};
|
|
|
|
/**
|
|
* @brief s
|
|
*
|
|
* @return unsigned int
|
|
*/
|
|
[[nodiscard]] unsigned int GetPrimaryKeyLength() const {
|
|
return key_ref_->subkeys->length;
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasEncryptionCapability() const {
|
|
return key_ref_->can_encrypt;
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasActualEncryptionCapability() const;
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasSigningCapability() const {
|
|
return key_ref_->can_sign;
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasActualSigningCapability() const;
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasCertificationCapability() const {
|
|
return key_ref_->can_certify;
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasActualCertificationCapability() const;
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasAuthenticationCapability() const {
|
|
return key_ref_->can_authenticate;
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasActualAuthenticationCapability() const;
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasCardKey() const {
|
|
auto subkeys = GetSubKeys();
|
|
return std::any_of(
|
|
subkeys->begin(), subkeys->end(),
|
|
[](const GpgSubKey& subkey) -> bool { return subkey.IsCardKey(); });
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsPrivateKey() const { return key_ref_->secret; }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsExpired() const { return key_ref_->expired; }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsRevoked() const { return key_ref_->revoked; }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsDisabled() const { return key_ref_->disabled; }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
[[nodiscard]] bool IsHasMasterKey() const {
|
|
return key_ref_->subkeys->secret;
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::unique_ptr<std::vector<GpgSubKey>>
|
|
*/
|
|
[[nodiscard]] std::unique_ptr<std::vector<GpgSubKey>> GetSubKeys() const;
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return std::unique_ptr<std::vector<GpgUID>>
|
|
*/
|
|
[[nodiscard]] std::unique_ptr<std::vector<GpgUID>> GetUIDs() const;
|
|
|
|
/**
|
|
* @brief Construct a new Gpg Key object
|
|
*
|
|
*/
|
|
GpgKey() = default;
|
|
|
|
/**
|
|
* @brief Construct a new Gpg Key object
|
|
*
|
|
* @param key
|
|
*/
|
|
explicit GpgKey(gpgme_key_t&& key);
|
|
|
|
/**
|
|
* @brief Destroy the Gpg Key objects
|
|
*
|
|
*/
|
|
~GpgKey() = default;
|
|
|
|
/**
|
|
* @brief Construct a new Gpg Key object
|
|
*
|
|
* @param key
|
|
*/
|
|
GpgKey(const gpgme_key_t& key) = delete;
|
|
|
|
/**
|
|
* @brief Construct a new Gpg Key object
|
|
*
|
|
* @param k
|
|
*/
|
|
GpgKey(GpgKey&& k) noexcept;
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @param k
|
|
* @return GpgKey&
|
|
*/
|
|
GpgKey& operator=(GpgKey&& k) noexcept;
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @param key
|
|
* @return GpgKey&
|
|
*/
|
|
GpgKey& operator=(const gpgme_key_t& key) = delete;
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @param o
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
bool operator==(const GpgKey& o) const { return o.GetId() == this->GetId(); }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @param o
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
bool operator<=(const GpgKey& o) const { return this->GetId() < o.GetId(); }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return gpgme_key_t
|
|
*/
|
|
explicit operator gpgme_key_t() const { return key_ref_.get(); }
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* @return GpgKey
|
|
*/
|
|
[[nodiscard]] GpgKey Copy() const {
|
|
gpgme_key_ref(key_ref_.get());
|
|
auto* _new_key_ref = key_ref_.get();
|
|
return GpgKey(std::move(_new_key_ref));
|
|
}
|
|
|
|
private:
|
|
/**
|
|
* @brief
|
|
*
|
|
*/
|
|
struct _key_ref_deleter {
|
|
void operator()(gpgme_key_t _key) {
|
|
if (_key != nullptr) gpgme_key_unref(_key);
|
|
}
|
|
};
|
|
|
|
using KeyRefHandler =
|
|
std::unique_ptr<struct _gpgme_key, _key_ref_deleter>; ///<
|
|
|
|
KeyRefHandler key_ref_ = nullptr; ///<
|
|
};
|
|
|
|
} // namespace GpgFrontend
|
|
|
|
#endif // GPGFRONTEND_GPGKEY_H
|