diff options
Diffstat (limited to 'src/rcl/rcl_util.c')
-rw-r--r-- | src/rcl/rcl_util.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/rcl/rcl_util.c b/src/rcl/rcl_util.c index 1c9d6a652..2cb35a199 100644 --- a/src/rcl/rcl_util.c +++ b/src/rcl/rcl_util.c @@ -25,6 +25,14 @@ #include "rcl.h" #include "rcl_internal.h" +#ifdef HAVE_OPENSSL +#include <openssl/err.h> +#include <openssl/sha.h> +#include <openssl/rsa.h> +#include <openssl/ssl.h> +#include <openssl/evp.h> +#endif + /** * @file rcl_util.c * Utilities for rcl parsing @@ -178,6 +186,7 @@ rspamd_cl_parser_free (struct rspamd_cl_parser *parser) struct rspamd_cl_stack *stack, *stmp; struct rspamd_cl_macro *macro, *mtmp; struct rspamd_cl_chunk *chunk, *ctmp; + struct rspamd_cl_pubkey *key, *ktmp; if (parser->top_obj != NULL) { rspamd_cl_obj_free (parser->top_obj); @@ -192,6 +201,66 @@ rspamd_cl_parser_free (struct rspamd_cl_parser *parser) LL_FOREACH_SAFE (parser->chunks, chunk, ctmp) { g_slice_free1 (sizeof (struct rspamd_cl_chunk), chunk); } + LL_FOREACH_SAFE (parser->keys, key, ktmp) { + g_slice_free1 (sizeof (struct rspamd_cl_pubkey), key); + } g_slice_free1 (sizeof (struct rspamd_cl_parser), parser); } + +gboolean +rspamd_cl_pubkey_add (struct rspamd_cl_parser *parser, const guchar *key, gsize len, GError **err) +{ + struct rspamd_cl_pubkey *nkey; +#ifndef HAVE_OPENSSL + g_set_error (err, RCL_ERROR, RSPAMD_CL_EINTERNAL, "cannot check signatures without openssl"); + return FALSE; +#else + BIO *mem; + + mem = BIO_new_mem_buf ((void *)key, len); + nkey = g_slice_alloc0 (sizeof (struct rspamd_cl_pubkey)); + nkey->key = PEM_read_bio_PUBKEY (mem, &nkey->key, NULL, NULL); + BIO_free (mem); + if (nkey->key == NULL) { + g_slice_free1 (sizeof (struct rspamd_cl_pubkey), nkey); + g_set_error (err, RCL_ERROR, RSPAMD_CL_ESSL, "%s", + ERR_error_string (ERR_get_error (), NULL)); + return FALSE; + } + LL_PREPEND (parser->keys, nkey); +#endif + return TRUE; +} + +/** + * Handle include macro + * @param data include data + * @param len length of data + * @param ud user data + * @param err error ptr + * @return + */ +gboolean +rspamd_cl_include_handler (const guchar *data, gsize len, gpointer ud, GError **err) +{ + struct rspamd_cl_parser *parser = ud; + + return TRUE; +} + +/** + * Handle includes macro + * @param data include data + * @param len length of data + * @param ud user data + * @param err error ptr + * @return + */ +gboolean +rspamd_cl_includes_handler (const guchar *data, gsize len, gpointer ud, GError **err) +{ + struct rspamd_cl_parser *parser = ud; + + return TRUE; +} |