summaryrefslogtreecommitdiffstats
path: root/src/libcryptobox
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-06-29 11:24:43 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-06-29 11:24:43 +0100
commitc4ccac7afb09784d15a38a27ec1b4c167cb031c5 (patch)
tree6fed6fb64529498175c57190582c975a63d3ec6d /src/libcryptobox
parent53632b619666d67d14640b1dc0832b2ab6eb8aa8 (diff)
downloadrspamd-c4ccac7afb09784d15a38a27ec1b4c167cb031c5.tar.gz
rspamd-c4ccac7afb09784d15a38a27ec1b4c167cb031c5.zip
[CritFix] Check NM part of pubkey to match it with rotating keypairs
Diffstat (limited to 'src/libcryptobox')
-rw-r--r--src/libcryptobox/keypair.c12
-rw-r--r--src/libcryptobox/keypair.h3
-rw-r--r--src/libcryptobox/keypair_private.h1
3 files changed, 13 insertions, 3 deletions
diff --git a/src/libcryptobox/keypair.c b/src/libcryptobox/keypair.c
index c8fa5633a..ee9fa4649 100644
--- a/src/libcryptobox/keypair.c
+++ b/src/libcryptobox/keypair.c
@@ -444,12 +444,19 @@ rspamd_pubkey_from_bin (const guchar *raw,
const guchar *
-rspamd_pubkey_get_nm (struct rspamd_cryptobox_pubkey *p)
+rspamd_pubkey_get_nm (struct rspamd_cryptobox_pubkey *p,
+ struct rspamd_cryptobox_keypair *kp)
{
g_assert (p != NULL);
if (p->nm) {
- return p->nm->nm;
+ if (memcmp (kp->id, (const guchar *)&p->nm->sk_id, sizeof (guint64)) == 0) {
+ return p->nm->nm;
+ }
+
+ /* Wrong ID, need to recalculate */
+ REF_RELEASE (p->nm);
+ p->nm = NULL;
}
return NULL;
@@ -468,6 +475,7 @@ rspamd_pubkey_calculate_nm (struct rspamd_cryptobox_pubkey *p,
abort ();
}
+ memcpy (&p->nm->sk_id, kp->id, sizeof (guint64));
REF_INIT_RETAIN (p->nm, rspamd_cryptobox_nm_dtor);
}
diff --git a/src/libcryptobox/keypair.h b/src/libcryptobox/keypair.h
index d7c386b91..92af13b68 100644
--- a/src/libcryptobox/keypair.h
+++ b/src/libcryptobox/keypair.h
@@ -139,7 +139,8 @@ enum rspamd_cryptobox_mode rspamd_pubkey_alg (struct rspamd_cryptobox_pubkey *p)
* @param p
* @return
*/
-const guchar * rspamd_pubkey_get_nm (struct rspamd_cryptobox_pubkey *p);
+const guchar * rspamd_pubkey_get_nm (struct rspamd_cryptobox_pubkey *p,
+ struct rspamd_cryptobox_keypair *kp);
/**
* Calculate and store nm value for the specified local key (performs ECDH)
diff --git a/src/libcryptobox/keypair_private.h b/src/libcryptobox/keypair_private.h
index d91d1c68e..78b894d38 100644
--- a/src/libcryptobox/keypair_private.h
+++ b/src/libcryptobox/keypair_private.h
@@ -25,6 +25,7 @@
*/
struct RSPAMD_ALIGNED(32) rspamd_cryptobox_nm {
guchar RSPAMD_ALIGNED(32) nm[rspamd_cryptobox_MAX_NMBYTES];
+ guint64 sk_id; /* Used to store secret key id */
ref_entry_t ref;
};