diff options
Diffstat (limited to 'lang/cpp/src/context.cpp')
-rw-r--r-- | lang/cpp/src/context.cpp | 71 |
1 files changed, 33 insertions, 38 deletions
diff --git a/lang/cpp/src/context.cpp b/lang/cpp/src/context.cpp index d63573f0..1a2741eb 100644 --- a/lang/cpp/src/context.cpp +++ b/lang/cpp/src/context.cpp @@ -1109,26 +1109,36 @@ static gpgme_encrypt_flags_t encryptflags2encryptflags(Context::EncryptionFlags return static_cast<gpgme_encrypt_flags_t>(result); } -EncryptionResult Context::encrypt(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags) +gpgme_key_t *const Context::getKeysFromRecipients(const std::vector<Key> &recipients) { - d->lastop = Private::Encrypt; - if (flags & NoEncryptTo) { - return EncryptionResult(Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED))); + if (recipients.empty()) { + return nullptr; } - const Data::Private *const pdp = plainText.impl(); - Data::Private *const cdp = cipherText.impl(); - gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ]; - gpgme_key_t *keys_it = keys; + gpgme_key_t *ret = new gpgme_key_t[ recipients.size() + 1 ]; + gpgme_key_t *keys_it = ret; for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) { if (it->impl()) { *keys_it++ = it->impl(); } } *keys_it++ = 0; - d->lasterr = gpgme_op_encrypt(d->ctx, recipients.empty() ? nullptr : keys, - encryptflags2encryptflags(flags), + return ret; +} + +EncryptionResult Context::encrypt(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags) +{ + d->lastop = Private::Encrypt; + if (flags & NoEncryptTo) { + return EncryptionResult(Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED))); + } + const Data::Private *const pdp = plainText.impl(); + Data::Private *const cdp = cipherText.impl(); + gpgme_key_t *const keys = getKeysFromRecipients(recipients); + d->lasterr = gpgme_op_encrypt(d->ctx, keys, encryptflags2encryptflags(flags), pdp ? pdp->data : 0, cdp ? cdp->data : 0); - delete[] keys; + if (keys) { + delete[] keys; + } return EncryptionResult(d->ctx, Error(d->lasterr)); } @@ -1149,17 +1159,12 @@ Error Context::startEncryption(const std::vector<Key> &recipients, const Data &p } const Data::Private *const pdp = plainText.impl(); Data::Private *const cdp = cipherText.impl(); - gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ]; - gpgme_key_t *keys_it = keys; - for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) { - if (it->impl()) { - *keys_it++ = it->impl(); - } - } - *keys_it++ = 0; + gpgme_key_t *const keys = getKeysFromRecipients(recipients); d->lasterr = gpgme_op_encrypt_start(d->ctx, keys, encryptflags2encryptflags(flags), pdp ? pdp->data : 0, cdp ? cdp->data : 0); - delete[] keys; + if (keys) { + delete[] keys; + } return Error(d->lasterr); } @@ -1177,17 +1182,12 @@ std::pair<SigningResult, EncryptionResult> Context::signAndEncrypt(const std::ve d->lastop = Private::SignAndEncrypt; const Data::Private *const pdp = plainText.impl(); Data::Private *const cdp = cipherText.impl(); - gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ]; - gpgme_key_t *keys_it = keys; - for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) { - if (it->impl()) { - *keys_it++ = it->impl(); - } - } - *keys_it++ = 0; + gpgme_key_t *const keys = getKeysFromRecipients(recipients); d->lasterr = gpgme_op_encrypt_sign(d->ctx, keys, encryptflags2encryptflags(flags), pdp ? pdp->data : 0, cdp ? cdp->data : 0); - delete[] keys; + if (keys) { + delete[] keys; + } return std::make_pair(SigningResult(d->ctx, Error(d->lasterr)), EncryptionResult(d->ctx, Error(d->lasterr))); } @@ -1197,17 +1197,12 @@ Error Context::startCombinedSigningAndEncryption(const std::vector<Key> &recipie d->lastop = Private::SignAndEncrypt; const Data::Private *const pdp = plainText.impl(); Data::Private *const cdp = cipherText.impl(); - gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ]; - gpgme_key_t *keys_it = keys; - for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) { - if (it->impl()) { - *keys_it++ = it->impl(); - } - } - *keys_it++ = 0; + gpgme_key_t *const keys = getKeysFromRecipients(recipients); d->lasterr = gpgme_op_encrypt_sign_start(d->ctx, keys, encryptflags2encryptflags(flags), pdp ? pdp->data : 0, cdp ? cdp->data : 0); - delete[] keys; + if (keys) { + delete[] keys; + } return Error(d->lasterr); } |