aboutsummaryrefslogtreecommitdiffstats
path: root/src/sdk/GFSDKGpg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sdk/GFSDKGpg.cpp')
-rw-r--r--src/sdk/GFSDKGpg.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/sdk/GFSDKGpg.cpp b/src/sdk/GFSDKGpg.cpp
index ae467b7b..638c8aa1 100644
--- a/src/sdk/GFSDKGpg.cpp
+++ b/src/sdk/GFSDKGpg.cpp
@@ -33,6 +33,7 @@
#include "core/function/gpg/GpgKeyGetter.h"
#include "core/function/gpg/GpgKeyImportExporter.h"
#include "core/model/DataObject.h"
+#include "core/model/GpgEncryptResult.h"
#include "core/model/GpgSignResult.h"
#include "core/typedef/GpgTypedef.h"
@@ -113,3 +114,37 @@ auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgKeyPrimaryUID(int channel, char* key_id,
s->comment = GFStrDup(primary_uid.GetComment());
return 0;
}
+
+auto GPGFRONTEND_MODULE_SDK_EXPORT
+GFGpgEncryptData(int channel, char** key_ids, int key_ids_size, char* data,
+ int ascii, GFGpgEncryptionResult** ps) -> int {
+ auto encrypt_key_ids = CharArrayToQList(key_ids, key_ids_size);
+
+ GpgFrontend::KeyArgsList encrypt_keys;
+ for (const auto& encrypt_key_id : encrypt_key_ids) {
+ auto key =
+ GpgFrontend::GpgKeyGetter::GetInstance(channel).GetKey(encrypt_key_id);
+ if (key.IsGood()) encrypt_keys.push_back(key);
+ }
+
+ if (encrypt_keys.empty()) return -1;
+
+ auto in_buffer = GpgFrontend::GFBuffer(GFUnStrDup(data).toUtf8());
+
+ auto [err, data_object] =
+ GpgFrontend::GpgBasicOperator::GetInstance(channel).EncryptSync(
+ encrypt_keys, in_buffer, ascii != 0);
+
+ if (GpgFrontend::CheckGpgError(err) != GPG_ERR_NO_ERROR) return -1;
+
+ auto result =
+ GpgFrontend::ExtractParams<GpgFrontend::GpgEncryptResult>(data_object, 0);
+ auto out_buffer =
+ GpgFrontend::ExtractParams<GpgFrontend::GFBuffer>(data_object, 1);
+
+ *ps = static_cast<GFGpgEncryptionResult*>(
+ GFAllocateMemory(sizeof(GFGpgEncryptionResult)));
+ auto* s = *ps;
+ s->encrypted_data = GFStrDup(out_buffer.ConvertToQByteArray());
+ return 0;
+}