struct rspamd_fuzzy_encrypted_cmd *enccmd = NULL;
struct fuzzy_cmd_io *io;
- if (rule->peer_key) {
+ if (rule->peer_key || rule->read_peer_key) {
enccmd = rspamd_mempool_alloc0(pool, sizeof(*enccmd));
cmd = &enccmd->cmd;
}
struct rspamd_fuzzy_encrypted_cmd *enccmd = NULL;
struct fuzzy_cmd_io *io;
- if (rule->peer_key) {
+ if (rule->peer_key || rule->read_peer_key) {
enccmd = rspamd_mempool_alloc0(pool, sizeof(*enccmd));
cmd = &enccmd->cmd;
}
struct rspamd_fuzzy_encrypted_cmd *enccmd = NULL;
struct fuzzy_cmd_io *io;
- if (rule->peer_key) {
+ if (rule->peer_key || rule->read_peer_key || rule->write_peer_key) {
enccmd = rspamd_mempool_alloc0(pool, sizeof(*enccmd));
cmd = &enccmd->cmd;
}
io->flags = 0;
- if (rule->peer_key) {
+ if (rule->peer_key || rule->read_peer_key || rule->write_peer_key) {
/* Select keys based on operation type */
struct rspamd_cryptobox_keypair *local_key;
struct rspamd_cryptobox_pubkey *peer_key;
additional_length = fuzzy_cmd_extension_length(task, rule);
- if (rule->peer_key) {
+ if (rule->peer_key || rule->read_peer_key || rule->write_peer_key) {
enccmd = rspamd_mempool_alloc0(task->task_pool,
sizeof(*enccmd) + additional_length);
cmd = &enccmd->cmd;
additional_length);
}
- if (rule->peer_key) {
+ if (rule->peer_key || rule->read_peer_key || rule->write_peer_key) {
/* Select keys based on operation type */
struct rspamd_cryptobox_keypair *local_key;
struct rspamd_cryptobox_pubkey *peer_key;
struct rspamd_fuzzy_encrypted_reply encrep;
gboolean found = FALSE;
- if (rule->peer_key) {
+ if (rule->peer_key || rule->read_peer_key || rule->write_peer_key) {
required_size = sizeof(encrep);
}
else {
return NULL;
}
- if (rule->peer_key) {
+ if (rule->peer_key || rule->read_peer_key || rule->write_peer_key) {
memcpy(&encrep, p, sizeof(encrep));
*pos += required_size;
*r -= required_size;
+ /* Find matching command to determine operation type */
+ struct rspamd_cryptobox_keypair *local_key = NULL;
+ struct rspamd_cryptobox_pubkey *peer_key = NULL;
+
+ for (i = 0; i < req->len; i++) {
+ io = g_ptr_array_index(req, i);
+ if (io->tag == encrep.rep.v1.tag) {
+ /* Determine which keys to use based on command type */
+ if (io->cmd.cmd == FUZZY_DEL || io->cmd.cmd == FUZZY_WRITE) {
+ /* Write operation */
+ local_key = rule->write_local_key ? rule->write_local_key : rule->local_key;
+ peer_key = rule->write_peer_key ? rule->write_peer_key : rule->peer_key;
+ }
+ else {
+ /* Read operation (CHECK, STAT, PING, etc.) */
+ local_key = rule->read_local_key ? rule->read_local_key : rule->local_key;
+ peer_key = rule->read_peer_key ? rule->read_peer_key : rule->peer_key;
+ }
+ break;
+ }
+ }
+
+ if (!local_key || !peer_key) {
+ /* Fallback to common keys if command not found or keys not set */
+ local_key = rule->local_key;
+ peer_key = rule->peer_key;
+ }
+
/* Try to decrypt reply */
rspamd_keypair_cache_process(rule->ctx->keypairs_cache,
- rule->local_key, rule->peer_key);
+ local_key, peer_key);
if (!rspamd_cryptobox_decrypt_nm_inplace((unsigned char *) &encrep.rep,
sizeof(encrep.rep),
encrep.hdr.nonce,
- rspamd_pubkey_get_nm(rule->peer_key, rule->local_key),
+ rspamd_pubkey_get_nm(peer_key, local_key),
encrep.hdr.mac)) {
msg_info("cannot decrypt reply");
return NULL;