aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/function/gpg/GpgKeyOpera.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/function/gpg/GpgKeyOpera.cpp')
-rw-r--r--src/core/function/gpg/GpgKeyOpera.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp
index 9511b347..931eae72 100644
--- a/src/core/function/gpg/GpgKeyOpera.cpp
+++ b/src/core/function/gpg/GpgKeyOpera.cpp
@@ -364,4 +364,42 @@ void GpgKeyOpera::DeleteKey(const KeyId& key_id) {
keys.push_back(key_id);
DeleteKeys(keys);
}
+
+auto AddADSKImpl(GpgContext& ctx, const GpgKey& key, const GpgSubKey& adsk,
+ const DataObjectPtr& data_object) -> GpgError {
+ auto algo = adsk.GetFingerprint();
+ unsigned int flags = GPGME_CREATE_ADSK;
+
+ LOG_D() << "add adsk args: " << key.GetId() << algo;
+
+ auto err =
+ gpgme_op_createsubkey(ctx.DefaultContext(), static_cast<gpgme_key_t>(key),
+ algo.toLatin1(), 0, 0, flags);
+ if (CheckGpgError(err) != GPG_ERR_NO_ERROR) {
+ data_object->Swap({GpgGenerateKeyResult{}});
+ return err;
+ }
+
+ data_object->Swap(
+ {GpgGenerateKeyResult{gpgme_op_genkey_result(ctx.DefaultContext())}});
+ return CheckGpgError(err);
+}
+
+void GpgKeyOpera::AddADSK(const GpgKey& key, const GpgSubKey& adsk,
+ const GpgOperationCallback& callback) {
+ RunGpgOperaAsync(
+ [=](const DataObjectPtr& data_object) -> GpgError {
+ return AddADSKImpl(ctx_, key, adsk, data_object);
+ },
+ callback, "gpgme_op_createsubkey", "2.4.1");
+}
+
+auto GpgKeyOpera::AddADSKSync(const GpgKey& key, const GpgSubKey& adsk)
+ -> std::tuple<GpgError, DataObjectPtr> {
+ return RunGpgOperaSync(
+ [=](const DataObjectPtr& data_object) -> GpgError {
+ return AddADSKImpl(ctx_, key, adsk, data_object);
+ },
+ "gpgme_op_createsubkey", "2.4.1");
+}
} // namespace GpgFrontend