RSPAMD_CL_ESTATE,
RSPAMD_CL_ENESTED,
RSPAMD_CL_EMACRO,
- RSPAMD_CL_ERECURSION
+ RSPAMD_CL_ERECURSION,
+ RSPAMD_CL_EINTERNAL,
+ RSPAMD_CL_ESSL
};
enum rspamd_cl_type {
*/
guchar *rspamd_cl_object_emit (rspamd_cl_object_t *obj, enum rspamd_cl_emitter emit_type);
+/**
+ * Add new public key to parser for signatures check
+ * @param parser parser object
+ * @param key PEM representation of a key
+ * @param len length of the key
+ * @param err if *err is NULL it is set to parser error
+ * @return TRUE if a key has been successfully added
+ */
+gboolean rspamd_cl_pubkey_add (struct rspamd_cl_parser *parser, const guchar *key, gsize len, GError **err);
+
#endif /* RCL_H_ */
#include "rcl.h"
#include "utlist.h"
+#ifdef HAVE_OPENSSL
+#include <openssl/evp.h>
+#endif
/**
* @file rcl_internal.h
struct rspamd_cl_chunk *next;
};
+#ifdef HAVE_OPENSSL
+struct rspamd_cl_pubkey {
+ EVP_PKEY *key;
+ struct rspamd_cl_pubkey *next;
+};
+#else
+struct rspamd_cl_pubkey {
+ struct rspamd_cl_pubkey *next;
+};
+#endif
+
struct rspamd_cl_parser {
enum rspamd_cl_parser_state state;
enum rspamd_cl_parser_state prev_state;
struct rspamd_cl_stack *stack;
struct rspamd_cl_chunk *chunks;
guint recursion;
+ struct rspamd_cl_pubkey *keys;
};
/**
*/
void rspamd_cl_unescape_json_string (gchar *str);
+/**
+ * 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);
+
+/**
+ * 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);
+
#endif /* RCL_INTERNAL_H_ */
return TRUE;
}
-/**
- * Handle include macro
- * @param data include data
- * @param len length of data
- * @param ud user data
- * @param err error ptr
- * @return
- */
-static gboolean
-rspamd_cl_include_handler (const guchar *data, gsize len, gpointer ud, GError **err)
-{
- return TRUE;
-}
-
-/**
- * Handle includes macro
- * @param data include data
- * @param len length of data
- * @param ud user data
- * @param err error ptr
- * @return
- */
-static gboolean
-rspamd_cl_includes_handler (const guchar *data, gsize len, gpointer ud, GError **err)
-{
- return TRUE;
-}
-
/**
* Return multiplier for a character
* @param c multiplier character
#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
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);
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;
+}