aboutsummaryrefslogtreecommitdiffstats
path: root/src/gpg/function/GpgKeyOpera.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpg/function/GpgKeyOpera.cpp')
-rw-r--r--src/gpg/function/GpgKeyOpera.cpp85
1 files changed, 66 insertions, 19 deletions
diff --git a/src/gpg/function/GpgKeyOpera.cpp b/src/gpg/function/GpgKeyOpera.cpp
index 4bad303d..e9fcbc1d 100644
--- a/src/gpg/function/GpgKeyOpera.cpp
+++ b/src/gpg/function/GpgKeyOpera.cpp
@@ -26,6 +26,7 @@
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/conversion.hpp>
+#include <boost/format.hpp>
#include <boost/process/async_pipe.hpp>
#include <memory>
#include <string>
@@ -46,18 +47,21 @@ void GpgFrontend::GpgKeyOpera::DeleteKeys(
for (const auto& tmp : *key_ids) {
auto key = GpgKeyGetter::GetInstance().GetKey(tmp);
if (key.good()) {
- LOG(INFO) << "GpgKeyOpera DeleteKeys Get Key Good";
- err = check_gpg_error(gpgme_op_delete(ctx, gpgme_key_t(key), 1));
+ err = check_gpg_error(
+ gpgme_op_delete_ext(ctx, gpgme_key_t(key),
+ GPGME_DELETE_ALLOW_SECRET | GPGME_DELETE_FORCE));
assert(gpg_err_code(err) == GPG_ERR_NO_ERROR);
- } else
- LOG(WARNING) << "GpgKeyOpera DeleteKeys Get Key Bad";
+ } else {
+ LOG(WARNING) << "GpgKeyOpera DeleteKeys get key failed" << tmp;
+ }
}
}
/**
- * Set the expire date and time of a key pair(actually the master key) or subkey
+ * Set the expire date and time of a key pair(actually the primary key) or
+ * subkey
* @param key target key pair
- * @param subkey null if master key
+ * @param subkey null if primary key
* @param expires date and time
* @return if successful
*/
@@ -146,13 +150,12 @@ void GpgFrontend::GpgKeyOpera::GenerateRevokeCert(
* @return error information
*/
GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::GenerateKey(
- const std::unique_ptr<GenKeyInfo>& params) {
+ const std::unique_ptr<GenKeyInfo>& params, GpgGenKeyResult& result) {
auto userid_utf8 = params->getUserid();
const char* userid = userid_utf8.c_str();
auto algo_utf8 = params->getAlgo() + params->getKeySizeStr();
- LOG(INFO) << "GpgFrontend::GpgKeyOpera::GenerateKey Params"
- << params->getAlgo() << params->getKeySizeStr();
+ LOG(INFO) << "params" << params->getAlgo() << params->getKeySizeStr();
const char* algo = algo_utf8.c_str();
unsigned long expires = 0;
@@ -163,19 +166,57 @@ GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::GenerateKey(
system_clock::to_time_t(system_clock::now());
}
- unsigned int flags = 0;
+ GpgError err;
- if (!params->isSubKey()) flags |= GPGME_CREATE_CERT;
- if (params->isAllowEncryption()) flags |= GPGME_CREATE_ENCR;
- if (params->isAllowSigning()) flags |= GPGME_CREATE_SIGN;
- if (params->isAllowAuthentication()) flags |= GPGME_CREATE_AUTH;
- if (params->isNonExpired()) flags |= GPGME_CREATE_NOEXPIRE;
- if (params->isNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD;
+ if (ctx.GetInfo().GnupgVersion >= "2.1.0") {
+ unsigned int flags = 0;
+
+ if (!params->isSubKey()) flags |= GPGME_CREATE_CERT;
+ if (params->isAllowEncryption()) flags |= GPGME_CREATE_ENCR;
+ if (params->isAllowSigning()) flags |= GPGME_CREATE_SIGN;
+ if (params->isAllowAuthentication()) flags |= GPGME_CREATE_AUTH;
+ if (params->isNonExpired()) flags |= GPGME_CREATE_NOEXPIRE;
+ if (params->isNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD;
+
+ LOG(INFO) << "args: " << userid << algo << expires << flags;
+
+ err = gpgme_op_createkey(ctx, userid, algo, 0, expires, nullptr, flags);
- LOG(INFO) << "GpgFrontend::GpgKeyOpera::GenerateKey Args: " << userid << algo
- << expires << flags;
+ } else {
+ std::stringstream ss;
+ auto param_format =
+ boost::format{
+ "<GnupgKeyParms format=\"internal\">\n"
+ "Key-Type: %1%\n"
+ "Key-Usage: sign\n"
+ "Key-Length: %2%\n"
+ "Name-Real: %3%\n"
+ "Name-Comment: %4%\n"
+ "Name-Email: %5%\n"} %
+ params->getAlgo() % params->getKeySize() % params->getName() %
+ params->getComment() % params->getEmail();
+ ss << param_format;
+
+ if (!params->isNonExpired()) {
+ auto date = params->getExpired().date();
+ ss << boost::format{"Expire-Date: %1%\n"} % to_iso_string(date);
+ } else
+ ss << boost::format{"Expire-Date: 0\n"};
+ if (!params->isNoPassPhrase())
+ ss << boost::format{"Passphrase: %1%\n"} % params->getPassPhrase();
+
+ ss << "</GnupgKeyParms>";
+
+ DLOG(INFO) << "params" << std::endl << ss.str();
+
+ err = gpgme_op_genkey(ctx, ss.str().c_str(), nullptr, nullptr);
+ }
+
+ if (check_gpg_error_2_err_code(err) == GPG_ERR_NO_ERROR) {
+ auto temp_result = _new_result(gpgme_op_genkey_result(ctx));
+ std::swap(temp_result, result);
+ }
- auto err = gpgme_op_createkey(ctx, userid, algo, 0, expires, nullptr, flags);
return check_gpg_error(err);
}
@@ -234,3 +275,9 @@ GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::ModifyTOFUPolicy(
auto err = gpgme_op_tofu_policy(ctx, gpgme_key_t(key), tofu_policy);
return check_gpg_error(err);
}
+
+void GpgFrontend::GpgKeyOpera::DeleteKey(const GpgFrontend::KeyId& key_id) {
+ auto keys = std::make_unique<KeyIdArgsList>();
+ keys->push_back(key_id);
+ DeleteKeys(std::move(keys));
+}