diff options
Diffstat (limited to 'src/core/function/gpg/GpgBasicOperator.cpp')
-rw-r--r-- | src/core/function/gpg/GpgBasicOperator.cpp | 408 |
1 files changed, 175 insertions, 233 deletions
diff --git a/src/core/function/gpg/GpgBasicOperator.cpp b/src/core/function/gpg/GpgBasicOperator.cpp index 661c1283..cb933d33 100644 --- a/src/core/function/gpg/GpgBasicOperator.cpp +++ b/src/core/function/gpg/GpgBasicOperator.cpp @@ -43,29 +43,51 @@ 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(); - QContainer<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.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"); + } +} + +auto EncryptImpl(GpgContext& ctx_, const KeyArgsList& keys, + const GFBuffer& in_buffer, bool ascii, + const DataObjectPtr& data_object) -> GpgError { + if (keys.empty()) return GPG_ERR_CANCELED; + + QContainer<gpgme_key_t> recipients(keys.begin(), keys.end()); - GpgData data_in(in_buffer); - GpgData data_out; + // Last entry data_in array has to be nullptr + recipients.emplace_back(nullptr); - 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; + + 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; +} - 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,43 +96,32 @@ 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; - - QContainer<gpgme_key_t> recipients(keys.begin(), keys.end()); - - // Last entry data_in array has to be nullptr - recipients.emplace_back(nullptr); + [=](const DataObjectPtr& data_object) { + return EncryptImpl(ctx_, keys, in_buffer, ascii, data_object); + }, + "gpgme_op_encrypt", "2.1.0"); +} - GpgData data_in(in_buffer); - GpgData data_out; +auto EncryptSymmetricImpl(GpgContext& ctx_, const GFBuffer& in_buffer, + bool ascii, + 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, recipients.data(), - GPGME_ENCRYPT_ALWAYS_TRUST, - data_in, data_out)); - data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)), - data_out.Read2GFBuffer()}); + 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; - }, - "gpgme_op_encrypt", "2.1.0"); + return err; } 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 EncryptSymmetricImpl(ctx_, in_buffer, ascii, data_object); }, cb, "gpgme_op_encrypt_symmetric", "2.1.0"); } @@ -119,35 +130,31 @@ 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 EncryptSymmetricImpl(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 +162,42 @@ 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())), + }); + + 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 +206,39 @@ 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 +247,35 @@ 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 +284,35 @@ 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 +321,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; - QContainer<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,47 +333,14 @@ 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; - QContainer<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) -> KeyArgsList { |