summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2020-11-20 12:43:14 +0300
committerdefanor <defanor@uberspace.net>2020-11-20 12:43:14 +0300
commit74b672b8ca65079ba5d46bbb1203ede95a29aea3 (patch)
tree7ccc3301357138bc10be5e7e2d9b89db2fe64470
parent53e218af8591f209644c63032f264fcbd154b827 (diff)
Don't include own JID into <signcrypt/>, always encrypt for self
-rw-r--r--examples/weechat.c5
-rw-r--r--src/rexmpp_openpgp.c64
2 files changed, 40 insertions, 29 deletions
diff --git a/examples/weechat.c b/examples/weechat.c
index b2cee3a..2e9b57e 100644
--- a/examples/weechat.c
+++ b/examples/weechat.c
@@ -471,9 +471,8 @@ command_sc_cb (const void *wr_ptr, void *data,
xmlNodeAddContent(body, argv_eol[1]);
char *rcpt[3];
- rcpt[0] = s->initial_jid.bare;
- rcpt[1] = to;
- rcpt[2] = NULL;
+ rcpt[0] = to;
+ rcpt[1] = NULL;
char *b64 = rexmpp_openpgp_encrypt_sign(s, body, rcpt);
if (b64 == NULL) {
diff --git a/src/rexmpp_openpgp.c b/src/rexmpp_openpgp.c
index 983946c..35d85b1 100644
--- a/src/rexmpp_openpgp.c
+++ b/src/rexmpp_openpgp.c
@@ -356,6 +356,36 @@ rexmpp_openpgp_decrypt_verify (rexmpp_t *s,
return elem;
}
+void rexmpp_openpgp_add_keys (rexmpp_t *s,
+ char *jid,
+ gpgme_key_t **keys,
+ int *nkeys,
+ int *allocated)
+{
+ gpgme_error_t err;
+ xmlNodePtr metadata;
+ for (metadata = rexmpp_published_fingerprints(s, jid);
+ metadata != NULL;
+ metadata = xmlNextElementSibling(metadata)) {
+ char *fingerprint = xmlGetProp(metadata, "v4-fingerprint");
+ err = gpgme_get_key(s->pgp_ctx, fingerprint, &(*keys)[*nkeys], 0);
+ if (gpg_err_code(err) == GPG_ERR_NO_ERROR) {
+ *nkeys = *nkeys + 1;
+ if (*nkeys == *allocated) {
+ *allocated = *allocated * 2;
+ *keys = realloc(*keys, sizeof(gpgme_key_t *) * *allocated);
+ }
+ (*keys)[*nkeys] = NULL;
+ } else if (gpg_err_code(err) == GPG_ERR_EOF) {
+ rexmpp_log(s, LOG_WARNING, "No key %s for %s found",
+ fingerprint, jid);
+ } else {
+ rexmpp_log(s, LOG_ERR, "Failed to read key %s: %s",
+ fingerprint, gpgme_strerror(err));
+ }
+ free(fingerprint);
+ }
+}
char *rexmpp_openpgp_encrypt_sign (rexmpp_t *s,
xmlNodePtr payload,
@@ -367,33 +397,15 @@ char *rexmpp_openpgp_encrypt_sign (rexmpp_t *s,
/* Locate keys. */
gpgme_key_t *keys = malloc(sizeof(gpgme_key_t *) * allocated);
keys[0] = NULL;
- xmlNodePtr metadata;
+
+ /* Add own keys for encryption and signing. */
+ rexmpp_openpgp_add_keys(s, s->initial_jid.bare, &keys, &nkeys, &allocated);
+ for (i = 0; i < nkeys; i++) {
+ gpgme_signers_add(s->pgp_ctx, keys[i]);
+ }
+ /* Add recipients' keys for encryption. */
for (i = 0; recipients[i] != NULL; i++) {
- for (metadata = rexmpp_published_fingerprints(s, recipients[i]);
- metadata != NULL;
- metadata = xmlNextElementSibling(metadata)) {
- char *fingerprint = xmlGetProp(metadata, "v4-fingerprint");
- err = gpgme_get_key(s->pgp_ctx, fingerprint, &keys[nkeys], 0);
- if (gpg_err_code(err) == GPG_ERR_NO_ERROR) {
- if (strcmp(recipients[i], s->initial_jid.bare) == 0) {
- /* Own keys: also add them for signing. */
- gpgme_signers_add(s->pgp_ctx, keys[nkeys]);
- }
- nkeys++;
- if (nkeys == allocated) {
- allocated *= 2;
- keys = realloc(keys, sizeof(gpgme_key_t *) * allocated);
- }
- keys[nkeys] = NULL;
- } else if (gpg_err_code(err) == GPG_ERR_EOF) {
- rexmpp_log(s, LOG_WARNING, "No key %s for %s found",
- fingerprint, recipients[i]);
- } else {
- rexmpp_log(s, LOG_ERR, "Failed to read key %s: %s",
- fingerprint, gpgme_strerror(err));
- }
- free(fingerprint);
- }
+ rexmpp_openpgp_add_keys(s, recipients[i], &keys, &nkeys, &allocated);
}
/* Prepare a signcrypt element. */