diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-06-11 19:26:49 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-06-11 19:26:49 +0100 |
commit | 9d6477913e50e2c73efbede6f01a37b615cae335 (patch) | |
tree | 09b4bd10866e2d5206fa19947ffba33fef58a2a1 /src/libserver/dkim.c | |
parent | 86ab98690846566a9efafe3d39c2f194f87a238d (diff) | |
download | rspamd-9d6477913e50e2c73efbede6f01a37b615cae335.tar.gz rspamd-9d6477913e50e2c73efbede6f01a37b615cae335.zip |
[Feature] Allow to match private and public keys for DKIM signatures
Diffstat (limited to 'src/libserver/dkim.c')
-rw-r--r-- | src/libserver/dkim.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c index 4dc16fd1e..3104428a9 100644 --- a/src/libserver/dkim.c +++ b/src/libserver/dkim.c @@ -2997,3 +2997,39 @@ rspamd_dkim_sign (struct rspamd_task *task, const gchar *selector, return hdr; } + +gboolean +rspamd_dkim_match_keys (rspamd_dkim_key_t *pk, + rspamd_dkim_sign_key_t *sk, + GError **err) +{ + const BIGNUM *n1, *n2; + + if (pk == NULL || sk == NULL) { + g_set_error (err, dkim_error_quark (), DKIM_SIGERROR_KEYFAIL, + "missing public or private key"); + return FALSE; + } + + if (pk->type != RSPAMD_DKIM_KEY_RSA) { + g_set_error (err, dkim_error_quark (), DKIM_SIGERROR_KEYFAIL, + "pubkey is not RSA key"); + return FALSE; + } + +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + RSA_get0_key (pk->key.key_rsa, &n1, NULL, NULL); + n2 = RSA_get0_key (sk->key_rsa, &n2, NULL, NULL); +#else + n1 = pk->key.key_rsa->n; + n2 = sk->key_rsa->n; +#endif + + if (BN_cmp (n1, n2) != 0) { + g_set_error (err, dkim_error_quark (), DKIM_SIGERROR_KEYHASHMISMATCH, + "pubkey does not match private key"); + return FALSE; + } + + return TRUE; +}
\ No newline at end of file |