struct rspamd_dkim_key_s {
guint8 *keydata;
+ guint8 *raw_key;
gsize keylen;
gsize decoded_len;
gchar key_id[RSPAMD_DKIM_KEY_ID_LEN];
key = g_malloc0 (sizeof (rspamd_dkim_key_t));
REF_INIT_RETAIN (key, rspamd_dkim_key_free);
key->keydata = g_malloc0 (keylen + 1);
+ key->raw_key = g_malloc (keylen);
key->decoded_len = keylen;
- key->keylen = keylen;
key->type = type;
- if (!rspamd_cryptobox_base64_decode (keydata, keylen, key->keydata,
+ /* Copy key skipping all spaces and newlines */
+ const char *h = keydata;
+ guint8 *t = key->raw_key;
+
+ while (h - keydata < keylen) {
+ if (!g_ascii_isspace(*h)) {
+ *t++ = *h++;
+ }
+ else {
+ h++;
+ }
+ }
+
+ key->keylen = t - key->raw_key;
+
+ if (!rspamd_cryptobox_base64_decode (key->raw_key, key->keylen, key->keydata,
&key->decoded_len)) {
REF_RELEASE (key);
g_set_error (err,
BIO_free (key->key_bio);
}
+ g_free (key->raw_key);
g_free (key->keydata);
g_free (key);
}
tag = '\0';
p++;
}
- else if (g_ascii_isspace (*p)) {
- klen = p - c;
- key = c;
- state = skip_spaces;
- next_state = read_tag;
- tag = '\0';
- }
else {
p ++;
}