diff options
Diffstat (limited to 'src/gpg/function/BasicOperator.cpp')
-rw-r--r-- | src/gpg/function/BasicOperator.cpp | 312 |
1 files changed, 142 insertions, 170 deletions
diff --git a/src/gpg/function/BasicOperator.cpp b/src/gpg/function/BasicOperator.cpp index f81e9f71..c76f581a 100644 --- a/src/gpg/function/BasicOperator.cpp +++ b/src/gpg/function/BasicOperator.cpp @@ -25,230 +25,202 @@ #include "gpg/function/BasicOperator.h" #include "gpg/function/GpgKeyGetter.h" -/** - * Read gpgme-Data to QByteArray - * mainly from http://basket.kde.org/ (kgpgme.cpp) - */ -#define BUF_SIZE (32 * 1024) - -gpgme_error_t read_2_buffer(gpgme_data_t data_in, GpgFrontend::BypeArrayPtr &out_buffer) { - gpgme_off_t ret = gpgme_data_seek(data_in, 0, SEEK_SET); - gpgme_error_t err = gpg_error(GPG_ERR_NO_ERROR); - - if (ret) { - err = gpgme_err_code_from_errno(errno); - GpgFrontend::check_gpg_error(err, "failed data_seek data_in read_2_buffer"); - } else { - char buf[BUF_SIZE + 2]; - - while ((ret = gpgme_data_read(data_in, buf, BUF_SIZE)) > 0) { - const size_t size = out_buffer->size(); - out_buffer->resize(static_cast<int>(size + ret)); - memcpy(out_buffer->data() + size, buf, ret); - } - if (ret < 0) { - err = gpgme_err_code_from_errno(errno); - GpgFrontend::check_gpg_error(err, "failed data_read data_in read_2_buffer"); - } - } - return err; -} - -gpg_error_t GpgFrontend::BasicOperator::encrypt(std::vector<GpgKey> &keys, GpgFrontend::BypeArrayRef in_buffer, - GpgFrontend::BypeArrayPtr &out_buffer, - GpgFrontend::GpgEncrResult &result) { +GpgFrontend::GpgError GpgFrontend::BasicOperator::Encrypt( + std::vector<GpgKey> &keys, GpgFrontend::BypeArrayRef in_buffer, + GpgFrontend::BypeArrayPtr &out_buffer, GpgFrontend::GpgEncrResult &result) { - gpgme_data_t data_in = nullptr, data_out = nullptr; - out_buffer->resize(0); + // gpgme_encrypt_result_t e_result; + gpgme_key_t recipients[keys.size() + 1]; - // gpgme_encrypt_result_t e_result; - gpgme_key_t recipients[keys.size() + 1]; + int index = 0; + for (const auto &key : keys) + recipients[index++] = gpgme_key_t(key); - int index = 0; - for (const auto &key : keys) recipients[index++] = gpgme_key_t(key); + // Last entry data_in array has to be nullptr + recipients[keys.size()] = nullptr; - // Last entry data_in array has to be nullptr - recipients[keys.size()] = nullptr; + GpgData data_in(in_buffer.data(), in_buffer.size()), data_out; - gpgme_error_t err; + gpgme_error_t err = check_gpg_error(gpgme_op_encrypt( + ctx, recipients, GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out)); - // If the last parameter isnt 0, a private copy of data is made - check_gpg_error(gpgme_data_new_from_mem(&data_in, in_buffer.data(), in_buffer.size(), 1)); - check_gpg_error(gpgme_data_new(&data_out)); - err = check_gpg_error(gpgme_op_encrypt(ctx, recipients, GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out)); - check_gpg_error(read_2_buffer(data_out, out_buffer)); + auto temp_data_out = data_out.Read2Buffer(); + std::swap(temp_data_out, out_buffer); - if (data_in) gpgme_data_release(data_in); - if (data_out) gpgme_data_release(data_out); + auto temp_result = GpgEncrResult( + gpgme_op_encrypt_result(ctx), + [&](gpgme_encrypt_result_t res) { gpgme_result_unref(res); }); + std::swap(result, temp_result); - result = GpgEncrResult(gpgme_op_encrypt_result(ctx), [&](gpgme_encrypt_result_t res) { gpgme_result_unref(res); }); - return err; + return err; } -gpgme_error_t GpgFrontend::BasicOperator::decrypt(BypeArrayRef in_buffer, GpgFrontend::BypeArrayPtr &out_buffer, - GpgFrontend::GpgDecrResult &result) { - gpgme_data_t data_in = nullptr, data_out = nullptr; - out_buffer->resize(0); +GpgFrontend::GpgError +GpgFrontend::BasicOperator::Decrypt(BypeArrayRef in_buffer, + GpgFrontend::BypeArrayPtr &out_buffer, + GpgFrontend::GpgDecrResult &result) { - gpgme_error_t err; + gpgme_error_t err; - check_gpg_error(gpgme_data_new_from_mem(&data_in, in_buffer.data(), in_buffer.size(), 1)); - check_gpg_error(gpgme_data_new(&data_out)); - err = check_gpg_error(gpgme_op_decrypt(ctx, data_in, data_out)); - check_gpg_error(read_2_buffer(data_out, out_buffer)); + GpgData data_in(in_buffer.data(), in_buffer.size()), data_out; + err = check_gpg_error(gpgme_op_decrypt(ctx, data_in, data_out)); - if (data_in) gpgme_data_release(data_in); - if (data_out) gpgme_data_release(data_out); + auto temp_data_out = data_out.Read2Buffer(); + std::swap(temp_data_out, out_buffer); - result = GpgDecrResult(gpgme_op_decrypt_result(ctx), [&](gpgme_decrypt_result_t res) { gpgme_result_unref(res); }); + auto temp_result = GpgDecrResult( + gpgme_op_decrypt_result(ctx), + [&](gpgme_decrypt_result_t res) { gpgme_result_unref(res); }); + std::swap(result, temp_result); - return err; + return err; } -gpgme_error_t GpgFrontend::BasicOperator::verify(QByteArray &in_buffer, QByteArray &sig_buffer, - GpgFrontend::GpgVerifyResult &result) const { - gpgme_data_t data_in; - gpgme_error_t err; - gpgme_verify_result_t m_result; +GpgFrontend::GpgError +GpgFrontend::BasicOperator::Verify(QByteArray &in_buffer, + BypeArrayPtr &sig_buffer, + GpgVerifyResult &result) const { + gpgme_error_t err; + gpgme_verify_result_t m_result; - check_gpg_error(gpgme_data_new_from_mem(&data_in, in_buffer.data(), in_buffer.size(), 1)); + GpgData data_in(in_buffer.data(), in_buffer.size()); - if (sig_buffer != nullptr) { - gpgme_data_t sig_data; - check_gpg_error(gpgme_data_new_from_mem(&sig_data, sig_buffer.data(), sig_buffer.size(), 1)); - err = check_gpg_error(gpgme_op_verify(ctx, sig_data, data_in, nullptr)); - } else - err = check_gpg_error(gpgme_op_verify(ctx, data_in, nullptr, data_in)); + if (sig_buffer != nullptr) { + GpgData sig_data(sig_buffer->data(), sig_buffer->size()); + err = check_gpg_error(gpgme_op_verify(ctx, sig_data, data_in, nullptr)); + } else + err = check_gpg_error(gpgme_op_verify(ctx, data_in, nullptr, data_in)); - result = GpgVerifyResult(gpgme_op_verify_result(ctx), [&](gpgme_verify_result_t res) { gpgme_result_unref(res); }); + auto temp_result = GpgVerifyResult( + gpgme_op_verify_result(ctx), + [&](gpgme_verify_result_t res) { gpgme_result_unref(res); }); + std::swap(result, temp_result); - return err; + return err; } -gpg_error_t -GpgFrontend::BasicOperator::sign(KeyFprArgsList key_fprs, BypeArrayRef in_buffer, BypeArrayPtr &out_buffer, - gpgme_sig_mode_t mode, GpgSignResult &result) { - gpgme_error_t err; - gpgme_data_t data_in, data_out; +GpgFrontend::GpgError GpgFrontend::BasicOperator::Sign(KeyArgsList &keys, + BypeArrayRef in_buffer, + BypeArrayPtr &out_buffer, + gpgme_sig_mode_t mode, + GpgSignResult &result) { + gpgme_error_t err; - out_buffer->resize(0); + // Set Singers of this opera + SetSigners(keys); - std::vector<GpgKey> keys; - auto &key_getter = GpgKeyGetter::getInstance(); + GpgData data_in(in_buffer.data(), in_buffer.size()), data_out; - for (const auto &key_fpr : key_fprs) - keys.push_back(key_getter.getKey(key_fpr)); + /** + `GPGME_SIG_MODE_NORMAL' + A normal signature is made, the output includes the plaintext + and the signature. - // Set Singers of this opera - setSigners(keys); + `GPGME_SIG_MODE_DETACH' + A detached signature is made. - check_gpg_error(gpgme_data_new_from_mem(&data_in, in_buffer.data(), in_buffer.size(), 1)); - check_gpg_error(gpgme_data_new(&data_out)); + `GPGME_SIG_MODE_CLEAR' + A clear text signature is made. The ASCII armor and text + mode settings of the context are ignored. + */ - /** - `GPGME_SIG_MODE_NORMAL' - A normal signature is made, the output includes the plaintext - and the signature. + err = check_gpg_error(gpgme_op_sign(ctx, data_in, data_out, mode)); - `GPGME_SIG_MODE_DETACH' - A detached signature is made. + auto temp_data_out = data_out.Read2Buffer(); + std::swap(temp_data_out, out_buffer); - `GPGME_SIG_MODE_CLEAR' - A clear text signature is made. The ASCII armor and text - mode settings of the context are ignored. - */ + auto temp_result = + GpgSignResult(gpgme_op_sign_result(ctx), + [&](gpgme_sign_result_t res) { gpgme_result_unref(res); }); - err = check_gpg_error(gpgme_op_sign(ctx, data_in, data_out, mode)); - check_gpg_error(read_2_buffer(data_out, out_buffer)); + std::swap(result, temp_result); - gpgme_data_release(data_in); - gpgme_data_release(data_out); - - result = GpgSignResult(gpgme_op_sign_result(ctx), [&](gpgme_sign_result_t res) { gpgme_result_unref(res); }); - - return err; + return err; } -gpgme_error_t -GpgFrontend::BasicOperator::decryptVerify(const BypeArrayRef in_buffer, BypeArrayPtr &out_buffer, - GpgDecrResult &decrypt_result, GpgVerifyResult &verify_result) { - gpgme_error_t err; - gpgme_data_t data_in, data_out; - out_buffer->resize(0); +gpgme_error_t GpgFrontend::BasicOperator::DecryptVerify( + BypeArrayRef in_buffer, BypeArrayPtr &out_buffer, + GpgDecrResult &decrypt_result, GpgVerifyResult &verify_result) { + gpgme_error_t err; - check_gpg_error(gpgme_data_new_from_mem(&data_in, in_buffer.data(), in_buffer.size(), 1)); - check_gpg_error(gpgme_data_new(&data_out)); - err = check_gpg_error(gpgme_op_decrypt_verify(ctx, data_in, data_out)); + GpgData data_in(in_buffer.data(), in_buffer.size()), data_out; - check_gpg_error(read_2_buffer(data_out, out_buffer)); + err = check_gpg_error(gpgme_op_decrypt_verify(ctx, data_in, data_out)); - if (data_in) gpgme_data_release(data_in); - if (data_out) gpgme_data_release(data_out); + auto temp_data_out = data_out.Read2Buffer(); + std::swap(temp_data_out, out_buffer); - decrypt_result = GpgDecrResult(gpgme_op_decrypt_result(ctx), - [&](gpgme_decrypt_result_t res) { gpgme_result_unref(res); }); - verify_result = GpgVerifyResult(gpgme_op_verify_result(ctx), - [&](gpgme_verify_result_t res) { gpgme_result_unref(res); }); + auto temp_decr_result = GpgDecrResult( + gpgme_op_decrypt_result(ctx), + [&](gpgme_decrypt_result_t res) { gpgme_result_unref(res); }); + std::swap(decrypt_result, temp_decr_result); + auto temp_verify_result = GpgVerifyResult( + gpgme_op_verify_result(ctx), + [&](gpgme_verify_result_t res) { gpgme_result_unref(res); }); + std::swap(verify_result, temp_verify_result); - return err; + return err; } -gpgme_error_t GpgFrontend::BasicOperator::encryptSign(std::vector<GpgKey> &keys, std::vector<GpgKey> &signers, - BypeArrayRef in_buffer, - BypeArrayPtr &out_buffer, GpgEncrResult &encr_result, - GpgSignResult &sign_result) { - gpgme_error_t err; - gpgme_data_t data_in, data_out; - out_buffer->resize(0); +gpgme_error_t GpgFrontend::BasicOperator::EncryptSign( + std::vector<GpgKey> &keys, std::vector<GpgKey> &signers, + BypeArrayRef in_buffer, BypeArrayPtr &out_buffer, + GpgEncrResult &encr_result, GpgSignResult &sign_result) { + gpgme_error_t err; + SetSigners(signers); - setSigners(signers); + // gpgme_encrypt_result_t e_result; + gpgme_key_t recipients[keys.size() + 1]; - //gpgme_encrypt_result_t e_result; - gpgme_key_t recipients[keys.size() + 1]; + // set key for user + int index = 0; + for (const auto &key : keys) + recipients[index++] = gpgme_key_t(key); - // set key for user - int index = 0; - for (const auto &key : keys) recipients[index++] = gpgme_key_t(key); + // Last entry dataIn array has to be nullptr + recipients[keys.size()] = nullptr; - // Last entry dataIn array has to be nullptr - recipients[keys.size()] = nullptr; + GpgData data_in(in_buffer.data(), in_buffer.size()), data_out; - // If the last parameter isnt 0, a private copy of data is made - check_gpg_error(gpgme_data_new_from_mem(&data_in, in_buffer.data(), in_buffer.size(), 1)); - check_gpg_error(gpgme_data_new(&data_out)); - err = check_gpg_error(gpgme_op_encrypt_sign(ctx, recipients, GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out)); + // If the last parameter isnt 0, a private copy of data is made + err = check_gpg_error(gpgme_op_encrypt_sign( + ctx, recipients, GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out)); - check_gpg_error(read_2_buffer(data_out, out_buffer)); + auto temp_data_out = data_out.Read2Buffer(); + std::swap(temp_data_out, out_buffer); - if (data_in) gpgme_data_release(data_in); - if (data_out) gpgme_data_release(data_out); + auto temp_encr_result = GpgEncrResult( + gpgme_op_encrypt_result(ctx), + [&](gpgme_encrypt_result_t res) { gpgme_result_unref(res); }); + swap(encr_result, temp_encr_result); + auto temp_sign_result = + GpgSignResult(gpgme_op_sign_result(ctx), + [&](gpgme_sign_result_t res) { gpgme_result_unref(res); }); + swap(sign_result, temp_sign_result); - encr_result = GpgEncrResult(gpgme_op_encrypt_result(ctx), - [&](gpgme_encrypt_result_t res) { gpgme_result_unref(res); }); - sign_result = GpgSignResult(gpgme_op_sign_result(ctx), [&](gpgme_sign_result_t res) { gpgme_result_unref(res); }); - - return err; + return err; } -void GpgFrontend::BasicOperator::setSigners(KeyArgsList keys) { - gpgme_signers_clear(ctx); - for (const GpgKey &key : keys) { - if (key.canSignActual()) { - auto gpgmeError = gpgme_signers_add(ctx, gpgme_key_t(key)); - check_gpg_error(gpgmeError); - } +void GpgFrontend::BasicOperator::SetSigners(KeyArgsList &keys) { + gpgme_signers_clear(ctx); + for (const GpgKey &key : keys) { + if (key.CanSignActual()) { + auto gpgmeError = gpgme_signers_add(ctx, gpgme_key_t(key)); + check_gpg_error(gpgmeError); } - if (keys.size() != gpgme_signers_count(ctx)) - qDebug() << "No All Signers Added"; + } + if (keys.size() != gpgme_signers_count(ctx)) + qDebug() << "No All Signers Added"; } -std::unique_ptr<std::vector<GpgFrontend::GpgKey>> GpgFrontend::BasicOperator::getSigners() { - auto count = gpgme_signers_count(ctx); - auto signers = std::make_unique<std::vector<GpgKey>>(); - for (auto i = 0; i < count; i++) { - auto key = GpgKey(gpgme_signers_enum(ctx, i)); - signers->push_back(std::move(GpgKey(std::move(key)))); - } - return signers; +std::unique_ptr<std::vector<GpgFrontend::GpgKey>> +GpgFrontend::BasicOperator::GetSigners() { + auto count = gpgme_signers_count(ctx); + auto signers = std::make_unique<std::vector<GpgKey>>(); + for (auto i = 0; i < count; i++) { + auto key = GpgKey(gpgme_signers_enum(ctx, i)); + signers->push_back(std::move(GpgKey(std::move(key)))); + } + return signers; } |