diff options
author | saturneric <[email protected]> | 2025-02-03 18:01:26 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2025-02-03 18:01:26 +0000 |
commit | d3d94f5b7a3e60b3bbb73e832bab7cf2d44a1600 (patch) | |
tree | 5cc7838f1325b076b91bb898fd0da3cfcb60b455 /src/core/function/gpg/GpgBasicOperator.cpp | |
parent | doc: update README.md (diff) | |
parent | fix: set pb range when size of operas > 1 (diff) | |
download | GpgFrontend-d3d94f5b7a3e60b3bbb73e832bab7cf2d44a1600.tar.gz GpgFrontend-d3d94f5b7a3e60b3bbb73e832bab7cf2d44a1600.zip |
Merge branch 'develop'
Diffstat (limited to 'src/core/function/gpg/GpgBasicOperator.cpp')
-rw-r--r-- | src/core/function/gpg/GpgBasicOperator.cpp | 406 |
1 files changed, 169 insertions, 237 deletions
diff --git a/src/core/function/gpg/GpgBasicOperator.cpp b/src/core/function/gpg/GpgBasicOperator.cpp index 6443f242..7f36e60a 100644 --- a/src/core/function/gpg/GpgBasicOperator.cpp +++ b/src/core/function/gpg/GpgBasicOperator.cpp @@ -43,29 +43,49 @@ namespace GpgFrontend { GpgBasicOperator::GpgBasicOperator(int channel) : SingletonFunctionObject<GpgBasicOperator>(channel) {} -void GpgBasicOperator::Encrypt(const KeyArgsList& keys, - const GFBuffer& in_buffer, bool ascii, - const GpgOperationCallback& cb) { - RunGpgOperaAsync( - [=](const DataObjectPtr& data_object) -> GpgError { - if (keys.empty()) return GPG_ERR_CANCELED; +void SetSignersImpl(GpgContext& ctx_, const KeyArgsList& signers, bool ascii) { + auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - std::vector<gpgme_key_t> recipients(keys.begin(), keys.end()); + gpgme_signers_clear(ctx); - // Last entry data_in array has to be nullptr - recipients.emplace_back(nullptr); + for (const GpgKey& key : signers) { + LOG_D() << "signer's key fpr: " << key.GetFingerprint(); + if (key.IsHasActualSignCap()) { + auto error = gpgme_signers_add(ctx, gpgme_key_t(key)); + CheckGpgError(error); + } + } + if (signers.size() != gpgme_signers_count(ctx_.DefaultContext())) { + FLOG_D("not all signers added"); + } +} - GpgData data_in(in_buffer); - GpgData data_out; +auto EncryptImpl(GpgContext& ctx_, const KeyArgsList& keys, + const GFBuffer& in_buffer, bool ascii, + const DataObjectPtr& data_object) -> GpgError { + auto recipients = Convert2RawGpgMEKeyList(keys); - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - auto err = CheckGpgError(gpgme_op_encrypt(ctx, recipients.data(), - GPGME_ENCRYPT_ALWAYS_TRUST, - data_in, data_out)); - data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)), - data_out.Read2GFBuffer()}); + GpgData data_in(in_buffer); + GpgData data_out; - return err; + auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); + auto err = CheckGpgError( + gpgme_op_encrypt(ctx, keys.isEmpty() ? nullptr : recipients.data(), + GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out)); + data_object->Swap({ + GpgEncryptResult(gpgme_op_encrypt_result(ctx)), + data_out.Read2GFBuffer(), + }); + + return err; +} + +void GpgBasicOperator::Encrypt(const KeyArgsList& keys, + const GFBuffer& in_buffer, bool ascii, + const GpgOperationCallback& cb) { + RunGpgOperaAsync( + [=](const DataObjectPtr& data_object) { + return EncryptImpl(ctx_, keys, in_buffer, ascii, data_object); }, cb, "gpgme_op_encrypt", "2.1.0"); } @@ -74,25 +94,8 @@ auto GpgBasicOperator::EncryptSync(const KeyArgsList& keys, const GFBuffer& in_buffer, bool ascii) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( - [=](const DataObjectPtr& data_object) -> GpgError { - if (keys.empty()) return GPG_ERR_CANCELED; - - std::vector<gpgme_key_t> recipients(keys.begin(), keys.end()); - - // Last entry data_in array has to be nullptr - recipients.emplace_back(nullptr); - - GpgData data_in(in_buffer); - GpgData data_out; - - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - auto err = CheckGpgError(gpgme_op_encrypt(ctx, recipients.data(), - GPGME_ENCRYPT_ALWAYS_TRUST, - data_in, data_out)); - data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)), - data_out.Read2GFBuffer()}); - - return err; + [=](const DataObjectPtr& data_object) { + return EncryptImpl(ctx_, keys, in_buffer, ascii, data_object); }, "gpgme_op_encrypt", "2.1.0"); } @@ -100,17 +103,8 @@ auto GpgBasicOperator::EncryptSync(const KeyArgsList& keys, void GpgBasicOperator::EncryptSymmetric(const GFBuffer& in_buffer, bool ascii, const GpgOperationCallback& cb) { RunGpgOperaAsync( - [=](const DataObjectPtr& data_object) -> GpgError { - GpgData data_in(in_buffer); - GpgData data_out; - - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - auto err = CheckGpgError(gpgme_op_encrypt( - ctx, nullptr, GPGME_ENCRYPT_SYMMETRIC, data_in, data_out)); - data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)), - data_out.Read2GFBuffer()}); - - return err; + [=](const DataObjectPtr& data_object) { + return EncryptImpl(ctx_, {}, in_buffer, ascii, data_object); }, cb, "gpgme_op_encrypt_symmetric", "2.1.0"); } @@ -119,35 +113,32 @@ auto GpgBasicOperator::EncryptSymmetricSync(const GFBuffer& in_buffer, bool ascii) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( - [=](const DataObjectPtr& data_object) -> GpgError { - GpgData data_in(in_buffer); - GpgData data_out; - - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - auto err = CheckGpgError(gpgme_op_encrypt( - ctx, nullptr, GPGME_ENCRYPT_SYMMETRIC, data_in, data_out)); - data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)), - data_out.Read2GFBuffer()}); - - return err; + [=](const DataObjectPtr& data_object) { + return EncryptImpl(ctx_, {}, in_buffer, ascii, data_object); }, "gpgme_op_encrypt_symmetric", "2.1.0"); } +auto DecryptImpl(GpgContext& ctx_, const GFBuffer& in_buffer, + const DataObjectPtr& data_object) -> GpgError { + GpgData data_in(in_buffer); + GpgData data_out; + + auto err = + CheckGpgError(gpgme_op_decrypt(ctx_.DefaultContext(), data_in, data_out)); + data_object->Swap({ + GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())), + data_out.Read2GFBuffer(), + }); + + return err; +} + void GpgBasicOperator::Decrypt(const GFBuffer& in_buffer, const GpgOperationCallback& cb) { RunGpgOperaAsync( - [=](const DataObjectPtr& data_object) -> GpgError { - GpgData data_in(in_buffer); - GpgData data_out; - - auto err = CheckGpgError( - gpgme_op_decrypt(ctx_.DefaultContext(), data_in, data_out)); - data_object->Swap( - {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())), - data_out.Read2GFBuffer()}); - - return err; + [=](const DataObjectPtr& data_object) { + return DecryptImpl(ctx_, in_buffer, data_object); }, cb, "gpgme_op_decrypt", "2.1.0"); } @@ -155,45 +146,43 @@ void GpgBasicOperator::Decrypt(const GFBuffer& in_buffer, auto GpgBasicOperator::DecryptSync(const GFBuffer& in_buffer) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( - [=](const DataObjectPtr& data_object) -> GpgError { - GpgData data_in(in_buffer); - GpgData data_out; - - auto err = CheckGpgError( - gpgme_op_decrypt(ctx_.DefaultContext(), data_in, data_out)); - data_object->Swap( - {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())), - data_out.Read2GFBuffer()}); - - return err; + [=](const DataObjectPtr& data_object) { + return DecryptImpl(ctx_, in_buffer, data_object); }, "gpgme_op_decrypt", "2.1.0"); } +auto VerifyImpl(GpgContext& ctx_, const GFBuffer& in_buffer, + const GFBuffer& sig_buffer, + const DataObjectPtr& data_object) -> GpgError { + GpgError err; + + GpgData data_in(in_buffer); + GpgData data_out; + + if (!sig_buffer.Empty()) { + GpgData sig_data(sig_buffer); + err = CheckGpgError( + gpgme_op_verify(ctx_.DefaultContext(), sig_data, data_in, nullptr)); + } else { + err = CheckGpgError( + gpgme_op_verify(ctx_.DefaultContext(), data_in, nullptr, data_out)); + } + + data_object->Swap({ + GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())), + GFBuffer(), + }); + + return err; +} + void GpgBasicOperator::Verify(const GFBuffer& in_buffer, const GFBuffer& sig_buffer, const GpgOperationCallback& cb) { RunGpgOperaAsync( [=](const DataObjectPtr& data_object) -> GpgError { - GpgError err; - - GpgData data_in(in_buffer); - GpgData data_out; - - if (!sig_buffer.Empty()) { - GpgData sig_data(sig_buffer); - err = CheckGpgError(gpgme_op_verify(ctx_.DefaultContext(), sig_data, - data_in, nullptr)); - } else { - err = CheckGpgError(gpgme_op_verify(ctx_.DefaultContext(), data_in, - nullptr, data_out)); - } - - data_object->Swap({ - GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())), - }); - - return err; + return VerifyImpl(ctx_, in_buffer, sig_buffer, data_object); }, cb, "gpgme_op_verify", "2.1.0"); } @@ -202,51 +191,41 @@ auto GpgBasicOperator::VerifySync(const GFBuffer& in_buffer, const GFBuffer& sig_buffer) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( - [=](const DataObjectPtr& data_object) -> GpgError { - GpgError err; + [=](const DataObjectPtr& data_object) { + return VerifyImpl(ctx_, in_buffer, sig_buffer, data_object); + }, + "gpgme_op_verify", "2.1.0"); +} - GpgData data_in(in_buffer); - GpgData data_out; +auto SignImpl(GpgContext& ctx_, const KeyArgsList& signers, + const GFBuffer& in_buffer, GpgSignMode mode, bool ascii, + const DataObjectPtr& data_object) -> GpgError { + if (signers.empty()) return GPG_ERR_CANCELED; - if (!sig_buffer.Empty()) { - GpgData sig_data(sig_buffer); - err = CheckGpgError(gpgme_op_verify(ctx_.DefaultContext(), sig_data, - data_in, nullptr)); - } else { - err = CheckGpgError(gpgme_op_verify(ctx_.DefaultContext(), data_in, - nullptr, data_out)); - } + GpgError err; - data_object->Swap({ - GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())), - }); + // Set Singers of this opera + SetSignersImpl(ctx_, signers, ascii); - return err; - }, - "gpgme_op_verify", "2.1.0"); + GpgData data_in(in_buffer); + GpgData data_out; + + auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); + err = CheckGpgError(gpgme_op_sign(ctx, data_in, data_out, mode)); + + data_object->Swap({ + GpgSignResult(gpgme_op_sign_result(ctx)), + data_out.Read2GFBuffer(), + }); + return err; } void GpgBasicOperator::Sign(const KeyArgsList& signers, const GFBuffer& in_buffer, GpgSignMode mode, bool ascii, const GpgOperationCallback& cb) { RunGpgOperaAsync( - [=](const DataObjectPtr& data_object) -> GpgError { - if (signers.empty()) return GPG_ERR_CANCELED; - - GpgError err; - - // Set Singers of this opera - SetSigners(signers, ascii); - - GpgData data_in(in_buffer); - GpgData data_out; - - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - err = CheckGpgError(gpgme_op_sign(ctx, data_in, data_out, mode)); - - data_object->Swap({GpgSignResult(gpgme_op_sign_result(ctx)), - data_out.Read2GFBuffer()}); - return err; + [=](const DataObjectPtr& data_object) { + return SignImpl(ctx_, signers, in_buffer, mode, ascii, data_object); }, cb, "gpgme_op_sign", "2.1.0"); } @@ -255,45 +234,36 @@ auto GpgBasicOperator::SignSync( const KeyArgsList& signers, const GFBuffer& in_buffer, GpgSignMode mode, bool ascii) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( - [=](const DataObjectPtr& data_object) -> GpgError { - if (signers.empty()) return GPG_ERR_CANCELED; + [=](const DataObjectPtr& data_object) { + return SignImpl(ctx_, signers, in_buffer, mode, ascii, data_object); + }, + "gpgme_op_sign", "2.1.0"); +} - GpgError err; +auto DecryptVerifyImpl(GpgContext& ctx_, const GFBuffer& in_buffer, + const DataObjectPtr& data_object) -> GpgError { + GpgError err; - // Set Singers of this opera - SetSigners(signers, ascii); + GpgData data_in(in_buffer); + GpgData data_out; - GpgData data_in(in_buffer); - GpgData data_out; + err = CheckGpgError( + gpgme_op_decrypt_verify(ctx_.DefaultContext(), data_in, data_out)); - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - err = CheckGpgError(gpgme_op_sign(ctx, data_in, data_out, mode)); + data_object->Swap({ + GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())), + GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())), + data_out.Read2GFBuffer(), + }); - data_object->Swap({GpgSignResult(gpgme_op_sign_result(ctx)), - data_out.Read2GFBuffer()}); - return err; - }, - "gpgme_op_sign", "2.1.0"); + return err; } void GpgBasicOperator::DecryptVerify(const GFBuffer& in_buffer, const GpgOperationCallback& cb) { RunGpgOperaAsync( - [=](const DataObjectPtr& data_object) -> GpgError { - GpgError err; - - GpgData data_in(in_buffer); - GpgData data_out; - - err = CheckGpgError( - gpgme_op_decrypt_verify(ctx_.DefaultContext(), data_in, data_out)); - - data_object->Swap( - {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())), - GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())), - data_out.Read2GFBuffer()}); - - return err; + [=](const DataObjectPtr& data_object) { + return DecryptVerifyImpl(ctx_, in_buffer, data_object); }, cb, "gpgme_op_decrypt_verify", "2.1.0"); } @@ -302,22 +272,37 @@ auto GpgBasicOperator::DecryptVerifySync(const GFBuffer& in_buffer) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( [=](const DataObjectPtr& data_object) -> GpgError { - GpgError err; + return DecryptVerifyImpl(ctx_, in_buffer, data_object); + }, + "gpgme_op_decrypt_verify", "2.1.0"); +} - GpgData data_in(in_buffer); - GpgData data_out; +auto EncryptSignImpl(GpgContext& ctx_, const KeyArgsList& keys, + const KeyArgsList& signers, const GFBuffer& in_buffer, + bool ascii, const DataObjectPtr& data_object) -> GpgError { + if (keys.empty() || signers.empty()) return GPG_ERR_CANCELED; - err = CheckGpgError( - gpgme_op_decrypt_verify(ctx_.DefaultContext(), data_in, data_out)); + GpgError err; + QContainer<gpgme_key_t> recipients(keys.begin(), keys.end()); - data_object->Swap( - {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())), - GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())), - data_out.Read2GFBuffer()}); + // Last entry data_in array has to be nullptr + recipients.emplace_back(nullptr); - return err; - }, - "gpgme_op_decrypt_verify", "2.1.0"); + SetSignersImpl(ctx_, signers, ascii); + + GpgData data_in(in_buffer); + GpgData data_out; + + auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); + err = CheckGpgError(gpgme_op_encrypt_sign( + ctx, recipients.data(), GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out)); + + data_object->Swap({ + GpgEncryptResult(gpgme_op_encrypt_result(ctx)), + GpgSignResult(gpgme_op_sign_result(ctx)), + data_out.Read2GFBuffer(), + }); + return err; } void GpgBasicOperator::EncryptSign(const KeyArgsList& keys, @@ -326,28 +311,8 @@ void GpgBasicOperator::EncryptSign(const KeyArgsList& keys, const GpgOperationCallback& cb) { RunGpgOperaAsync( [=](const DataObjectPtr& data_object) -> GpgError { - if (keys.empty() || signers.empty()) return GPG_ERR_CANCELED; - - GpgError err; - std::vector<gpgme_key_t> recipients(keys.begin(), keys.end()); - - // Last entry data_in array has to be nullptr - recipients.emplace_back(nullptr); - - SetSigners(signers, ascii); - - GpgData data_in(in_buffer); - GpgData data_out; - - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - err = CheckGpgError(gpgme_op_encrypt_sign(ctx, recipients.data(), - GPGME_ENCRYPT_ALWAYS_TRUST, - data_in, data_out)); - - data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)), - GpgSignResult(gpgme_op_sign_result(ctx)), - data_out.Read2GFBuffer()}); - return err; + return EncryptSignImpl(ctx_, keys, signers, in_buffer, ascii, + data_object); }, cb, "gpgme_op_encrypt_sign", "2.1.0"); } @@ -358,57 +323,24 @@ auto GpgBasicOperator::EncryptSignSync(const KeyArgsList& keys, -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( [=](const DataObjectPtr& data_object) -> GpgError { - if (keys.empty() || signers.empty()) return GPG_ERR_CANCELED; - - GpgError err; - std::vector<gpgme_key_t> recipients(keys.begin(), keys.end()); - - // Last entry data_in array has to be nullptr - recipients.emplace_back(nullptr); - - SetSigners(signers, ascii); - - GpgData data_in(in_buffer); - GpgData data_out; - - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - err = CheckGpgError(gpgme_op_encrypt_sign(ctx, recipients.data(), - GPGME_ENCRYPT_ALWAYS_TRUST, - data_in, data_out)); - - data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)), - GpgSignResult(gpgme_op_sign_result(ctx)), - data_out.Read2GFBuffer()}); - return err; + return EncryptSignImpl(ctx_, keys, signers, in_buffer, ascii, + data_object); }, "gpgme_op_encrypt_sign", "2.1.0"); } void GpgBasicOperator::SetSigners(const KeyArgsList& signers, bool ascii) { - auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); - - gpgme_signers_clear(ctx); - - for (const GpgKey& key : signers) { - LOG_D() << "signer's key fpr: " << key.GetFingerprint(); - if (key.IsHasActualSigningCapability()) { - auto error = gpgme_signers_add(ctx, gpgme_key_t(key)); - CheckGpgError(error); - } - } - if (signers.size() != gpgme_signers_count(ctx_.DefaultContext())) { - FLOG_D("not all signers added"); - } + SetSignersImpl(ctx_, signers, ascii); } -auto GpgBasicOperator::GetSigners(bool ascii) -> std::unique_ptr<KeyArgsList> { +auto GpgBasicOperator::GetSigners(bool ascii) -> KeyArgsList { auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext(); auto count = gpgme_signers_count(ctx); - auto signers = std::make_unique<std::vector<GpgKey>>(); + auto signers = KeyArgsList{}; for (auto i = 0U; i < count; i++) { auto key = GpgKey(gpgme_signers_enum(ctx, i)); - signers->push_back(GpgKey(std::move(key))); + signers.push_back(GpgKey(std::move(key))); } return signers; } |