aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/suricata/src/util-classification-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/suricata/src/util-classification-config.c')
-rw-r--r--framework/src/suricata/src/util-classification-config.c839
1 files changed, 0 insertions, 839 deletions
diff --git a/framework/src/suricata/src/util-classification-config.c b/framework/src/suricata/src/util-classification-config.c
deleted file mode 100644
index e88d4f20..00000000
--- a/framework/src/suricata/src/util-classification-config.c
+++ /dev/null
@@ -1,839 +0,0 @@
-/* Copyright (C) 2007-2010 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/**
- * \file
- *
- * \author Anoop Saldanha <anoopsaldanha@gmail.com>
- *
- * Used for parsing a classification.config file
- */
-
-#include "suricata-common.h"
-#include "detect.h"
-#include "detect-engine.h"
-#include "util-hash.h"
-
-#include "conf.h"
-#include "util-classification-config.h"
-#include "util-unittest.h"
-#include "util-error.h"
-#include "util-debug.h"
-#include "util-fmemopen.h"
-
-/* Regex to parse the classtype argument from a Signature. The first substring
- * holds the classtype name, the second substring holds the classtype the
- * classtype description, and the third argument holds the priority */
-#define DETECT_CLASSCONFIG_REGEX "^\\s*config\\s*classification\\s*:\\s*([a-zA-Z][a-zA-Z0-9-_]*)\\s*,\\s*(.+)\\s*,\\s*(\\d+)\\s*$"
-
-/* Default path for the classification.config file */
-#if defined OS_WIN32 || defined __CYGWIN__
-#define SC_CLASS_CONF_DEF_CONF_FILEPATH CONFIG_DIR "\\\\classification.config"
-#else
-#define SC_CLASS_CONF_DEF_CONF_FILEPATH CONFIG_DIR "/classification.config"
-#endif
-
-static pcre *regex = NULL;
-static pcre_extra *regex_study = NULL;
-
-uint32_t SCClassConfClasstypeHashFunc(HashTable *ht, void *data, uint16_t datalen);
-char SCClassConfClasstypeHashCompareFunc(void *data1, uint16_t datalen1,
- void *data2, uint16_t datalen2);
-void SCClassConfClasstypeHashFree(void *ch);
-static char *SCClassConfGetConfFilename(const DetectEngineCtx *de_ctx);
-
-void SCClassConfInit(void)
-{
- const char *eb = NULL;
- int eo;
- int opts = 0;
-
- regex = pcre_compile(DETECT_CLASSCONFIG_REGEX, opts, &eb, &eo, NULL);
- if (regex == NULL) {
- SCLogDebug("Compile of \"%s\" failed at offset %" PRId32 ": %s",
- DETECT_CLASSCONFIG_REGEX, eo, eb);
- return;
- }
-
- regex_study = pcre_study(regex, 0, &eb);
- if (eb != NULL) {
- pcre_free(regex);
- regex = NULL;
- SCLogDebug("pcre study failed: %s", eb);
- return;
- }
- return;
-}
-
-void SCClassConfDeinit(void)
-{
- if (regex != NULL) {
- pcre_free(regex);
- regex = NULL;
- }
- if (regex_study != NULL) {
- pcre_free(regex_study);
- regex_study = NULL;
- }
-}
-
-
-/**
- * \brief Inits the context to be used by the Classification Config parsing API.
- *
- * This function initializes the hash table to be used by the Detection
- * Engine Context to hold the data from the classification.config file,
- * obtains the file desc to parse the classification.config file, and
- * inits the regex used to parse the lines from classification.config
- * file.
- *
- * \param de_ctx Pointer to the Detection Engine Context.
- *
- * \retval fp NULL on error
- */
-FILE *SCClassConfInitContextAndLocalResources(DetectEngineCtx *de_ctx, FILE *fd)
-{
- char *filename = NULL;
-
- /* init the hash table to be used by the classification config Classtypes */
- de_ctx->class_conf_ht = HashTableInit(128, SCClassConfClasstypeHashFunc,
- SCClassConfClasstypeHashCompareFunc,
- SCClassConfClasstypeHashFree);
- if (de_ctx->class_conf_ht == NULL) {
- SCLogError(SC_ERR_HASH_TABLE_INIT, "Error initializing the hash "
- "table");
- goto error;
- }
-
- /* if it is not NULL, use the file descriptor. The hack so that we can
- * avoid using a dummy classification file for testing purposes and
- * instead use an input stream against a buffer containing the
- * classification strings */
- if (fd == NULL) {
- filename = SCClassConfGetConfFilename(de_ctx);
- if ( (fd = fopen(filename, "r")) == NULL) {
-#ifdef UNITTESTS
- if (RunmodeIsUnittests())
- goto error; // silently fail
-#endif
- SCLogError(SC_ERR_FOPEN, "Error opening file: \"%s\": %s", filename, strerror(errno));
- goto error;
- }
- }
-
- return fd;
-
- error:
- if (de_ctx->class_conf_ht != NULL) {
- HashTableFree(de_ctx->class_conf_ht);
- de_ctx->class_conf_ht = NULL;
- }
- if (fd != NULL) {
- fclose(fd);
- fd = NULL;
- }
-
- return NULL;
-}
-
-
-/**
- * \brief Returns the path for the Classification Config file. We check if we
- * can retrieve the path from the yaml conf file. If it is not present,
- * return the default path for the classification file which is
- * "./classification.config".
- *
- * \retval log_filename Pointer to a string containing the path for the
- * Classification Config file.
- */
-static char *SCClassConfGetConfFilename(const DetectEngineCtx *de_ctx)
-{
- char *log_filename = NULL;
- char config_value[256] = "";
-
- if (de_ctx != NULL && strlen(de_ctx->config_prefix) > 0) {
- snprintf(config_value, sizeof(config_value),
- "%s.classification-file", de_ctx->config_prefix);
-
- /* try loading prefix setting, fall back to global if that
- * fails. */
- if (ConfGet(config_value, &log_filename) != 1) {
- if (ConfGet("classification-file", &log_filename) != 1) {
- log_filename = (char *)SC_CLASS_CONF_DEF_CONF_FILEPATH;
- }
- }
- } else {
- if (ConfGet("classification-file", &log_filename) != 1) {
- log_filename = (char *)SC_CLASS_CONF_DEF_CONF_FILEPATH;
- }
- }
-
- return log_filename;
-}
-
-/**
- * \brief Releases resources used by the Classification Config API.
- */
-static void SCClassConfDeInitLocalResources(DetectEngineCtx *de_ctx, FILE *fd)
-{
- if (fd != NULL) {
- fclose(fd);
- fd = NULL;
- }
-}
-
-/**
- * \brief Releases resources used by the Classification Config API.
- */
-void SCClassConfDeInitContext(DetectEngineCtx *de_ctx)
-{
- if (de_ctx->class_conf_ht != NULL)
- HashTableFree(de_ctx->class_conf_ht);
-
- de_ctx->class_conf_ht = NULL;
-
- return;
-}
-
-/**
- * \brief Converts a string to lowercase.
- *
- * \param str Pointer to the string to be converted.
- */
-static char *SCClassConfStringToLowercase(const char *str)
-{
- char *new_str = NULL;
- char *temp_str = NULL;
-
- if ( (new_str = SCStrdup(str)) == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
- return NULL;
- }
-
- temp_str = new_str;
- while (*temp_str != '\0') {
- *temp_str = tolower((unsigned char)*temp_str);
- temp_str++;
- }
-
- return new_str;
-}
-
-/**
- * \brief Parses a line from the classification file and adds it to Classtype
- * hash table in DetectEngineCtx, i.e. DetectEngineCtx->class_conf_ht.
- *
- * \param rawstr Pointer to the string to be parsed.
- * \param index Relative index of the string to be parsed.
- * \param de_ctx Pointer to the Detection Engine Context.
- *
- * \retval 0 On success.
- * \retval -1 On failure.
- */
-int SCClassConfAddClasstype(char *rawstr, uint8_t index, DetectEngineCtx *de_ctx)
-{
- char ct_name[64];
- char ct_desc[512];
- char ct_priority_str[16];
- int ct_priority = 0;
- uint8_t ct_id = index;
-
- SCClassConfClasstype *ct_new = NULL;
- SCClassConfClasstype *ct_lookup = NULL;
-
-#define MAX_SUBSTRINGS 30
- int ret = 0;
- int ov[MAX_SUBSTRINGS];
-
- ret = pcre_exec(regex, regex_study, rawstr, strlen(rawstr), 0, 0, ov, 30);
- if (ret < 0) {
- SCLogError(SC_ERR_INVALID_SIGNATURE, "Invalid Classtype in "
- "classification.config file");
- goto error;
- }
-
- /* retrieve the classtype name */
- ret = pcre_copy_substring((char *)rawstr, ov, 30, 1, ct_name, sizeof(ct_name));
- if (ret < 0) {
- SCLogInfo("pcre_copy_substring() failed");
- goto error;
- }
-
- /* retrieve the classtype description */
- ret = pcre_copy_substring((char *)rawstr, ov, 30, 2, ct_desc, sizeof(ct_desc));
- if (ret < 0) {
- SCLogInfo("pcre_copy_substring() failed");
- goto error;
- }
-
- /* retrieve the classtype priority */
- ret = pcre_copy_substring((char *)rawstr, ov, 30, 3, ct_priority_str, sizeof(ct_priority_str));
- if (ret < 0) {
- SCLogInfo("pcre_copy_substring() failed");
- goto error;
- }
- if (strlen(ct_priority_str) == 0) {
- goto error;
- }
-
- ct_priority = atoi(ct_priority_str);
-
- /* Create a new instance of the parsed Classtype string */
- ct_new = SCClassConfAllocClasstype(ct_id, ct_name, ct_desc, ct_priority);
- if (ct_new == NULL)
- goto error;
-
- /* Check if the Classtype is present in the HashTable. In case it's present
- * ignore it, as it is a duplicate. If not present, add it to the table */
- ct_lookup = HashTableLookup(de_ctx->class_conf_ht, ct_new, 0);
- if (ct_lookup == NULL) {
- if (HashTableAdd(de_ctx->class_conf_ht, ct_new, 0) < 0)
- SCLogDebug("HashTable Add failed");
- } else {
- SCLogDebug("Duplicate classtype found inside classification.config");
- if (ct_new->classtype_desc) SCFree(ct_new->classtype_desc);
- if (ct_new->classtype) SCFree(ct_new->classtype);
- SCFree(ct_new);
- }
-
- return 0;
-
- error:
- return -1;
-}
-
-/**
- * \brief Checks if a string is a comment or a blank line.
- *
- * Comments lines are lines of the following format -
- * "# This is a comment string" or
- * " # This is a comment string".
- *
- * \param line String that has to be checked
- *
- * \retval 1 On the argument string being a comment or blank line
- * \retval 0 Otherwise
- */
-static int SCClassConfIsLineBlankOrComment(char *line)
-{
- while (*line != '\0') {
- /* we have a comment */
- if (*line == '#')
- return 1;
-
- /* this line is neither a comment line, nor a blank line */
- if (!isspace((unsigned char)*line))
- return 0;
-
- line++;
- }
-
- /* we have a blank line */
- return 1;
-}
-
-/**
- * \brief Parses the Classification Config file and updates the
- * DetectionEngineCtx->class_conf_ht with the Classtype information.
- *
- * \param de_ctx Pointer to the Detection Engine Context.
- */
-void SCClassConfParseFile(DetectEngineCtx *de_ctx, FILE *fd)
-{
- char line[1024];
- uint8_t i = 1;
-
- while (fgets(line, sizeof(line), fd) != NULL) {
- if (SCClassConfIsLineBlankOrComment(line))
- continue;
-
- SCClassConfAddClasstype(line, i, de_ctx);
- i++;
- }
-
-#ifdef UNITTESTS
- SCLogInfo("Added \"%d\" classification types from the classification file",
- de_ctx->class_conf_ht->count);
-#endif
-
- return;
-}
-
-/**
- * \brief Returns a new SCClassConfClasstype instance. The classtype string
- * is converted into lowercase, before being assigned to the instance.
- *
- * \param classtype Pointer to the classification type.
- * \param classtype_desc Pointer to the classification type description.
- * \param priority Holds the priority for the classification type.
- *
- * \retval ct Pointer to the new instance of SCClassConfClasstype on success;
- * NULL on failure.
- */
-SCClassConfClasstype *SCClassConfAllocClasstype(uint8_t classtype_id,
- const char *classtype,
- const char *classtype_desc,
- int priority)
-{
- SCClassConfClasstype *ct = NULL;
-
- if (classtype == NULL)
- return NULL;
-
- if ( (ct = SCMalloc(sizeof(SCClassConfClasstype))) == NULL)
- return NULL;
- memset(ct, 0, sizeof(SCClassConfClasstype));
-
- if ( (ct->classtype = SCClassConfStringToLowercase(classtype)) == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
-
- SCClassConfDeAllocClasstype(ct);
- return NULL;
- }
-
- if (classtype_desc != NULL &&
- (ct->classtype_desc = SCStrdup(classtype_desc)) == NULL) {
- SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory");
-
- SCClassConfDeAllocClasstype(ct);
- return NULL;
- }
-
- ct->classtype_id = classtype_id;
- ct->priority = priority;
-
- return ct;
-}
-
-/**
- * \brief Frees a SCClassConfClasstype instance
- *
- * \param Pointer to the SCClassConfClasstype instance that has to be freed
- */
-void SCClassConfDeAllocClasstype(SCClassConfClasstype *ct)
-{
- if (ct != NULL) {
- if (ct->classtype != NULL)
- SCFree(ct->classtype);
-
- if (ct->classtype_desc != NULL)
- SCFree(ct->classtype_desc);
-
- SCFree(ct);
- }
-
- return;
-}
-
-/**
- * \brief Hashing function to be used to hash the Classtype name. Would be
- * supplied as an argument to the HashTableInit function for
- * DetectEngineCtx->class_conf_ht.
- *
- * \param ht Pointer to the HashTable.
- * \param data Pointer to the data to be hashed. In this case, the data
- * would be a pointer to a SCClassConfClasstype instance.
- * \param datalen Not used by this function.
- */
-uint32_t SCClassConfClasstypeHashFunc(HashTable *ht, void *data, uint16_t datalen)
-{
- SCClassConfClasstype *ct = (SCClassConfClasstype *)data;
- uint32_t hash = 0;
- int i = 0;
-
- int len = strlen(ct->classtype);
-
- for (i = 0; i < len; i++)
- hash += tolower((unsigned char)(ct->classtype)[i]);
-
- hash = hash % ht->array_size;
-
- return hash;
-}
-
-/**
- * \brief Used to compare two Classtypes that have been stored in the HashTable.
- * This function is supplied as an argument to the HashTableInit function
- * for DetectionEngineCtx->class_conf_ct.
- *
- * \param data1 Pointer to the first SCClassConfClasstype to be compared.
- * \param len1 Not used by this function.
- * \param data2 Pointer to the second SCClassConfClasstype to be compared.
- * \param len2 Not used by this function.
- *
- * \retval 1 On data1 and data2 being equal.
- * \retval 0 On data1 and data2 not being equal.
- */
-char SCClassConfClasstypeHashCompareFunc(void *data1, uint16_t datalen1,
- void *data2, uint16_t datalen2)
-{
- SCClassConfClasstype *ct1 = (SCClassConfClasstype *)data1;
- SCClassConfClasstype *ct2 = (SCClassConfClasstype *)data2;
- int len1 = 0;
- int len2 = 0;
-
- if (ct1 == NULL || ct2 == NULL)
- return 0;
-
- if (ct1->classtype == NULL || ct2->classtype == NULL)
- return 0;
-
- len1 = strlen(ct1->classtype);
- len2 = strlen(ct2->classtype);
-
- if (len1 == len2 && memcmp(ct1->classtype, ct2->classtype, len1) == 0) {
- SCLogDebug("Match found inside Classification-Config hash function");
- return 1;
- }
-
- return 0;
-}
-
-/**
- * \brief Used to free the Classification Config Hash Data that was stored in
- * DetectEngineCtx->class_conf_ht Hashtable.
- *
- * \param ch Pointer to the data that has to be freed.
- */
-void SCClassConfClasstypeHashFree(void *ch)
-{
- SCClassConfDeAllocClasstype(ch);
-
- return;
-}
-
-/**
- * \brief Loads the Classtype info from the classification.config file.
- *
- * The classification.config file contains the different classtypes,
- * that can be used to label Signatures. Each line of the file should
- * have the following format -
- * classtype_name, classtype_description, priority
- * None of the above parameters should hold a quote inside the file.
- *
- * \param de_ctx Pointer to the Detection Engine Context that should be updated
- * with Classtype information.
- */
-void SCClassConfLoadClassficationConfigFile(DetectEngineCtx *de_ctx, FILE *fd)
-{
- fd = SCClassConfInitContextAndLocalResources(de_ctx, fd);
- if (fd == NULL) {
-#ifdef UNITTESTS
- if (RunmodeIsUnittests() && fd == NULL) {
- return;
- }
-#endif
- SCLogError(SC_ERR_OPENING_FILE, "please check the \"classification-file\" "
- "option in your suricata.yaml file");
- return;
- }
-
- SCClassConfParseFile(de_ctx, fd);
- SCClassConfDeInitLocalResources(de_ctx, fd);
-
- return;
-}
-
-/**
- * \brief Gets the classtype from the corresponding hash table stored
- * in the Detection Engine Context's class conf ht, given the
- * classtype name.
- *
- * \param ct_name Pointer to the classtype name that has to be looked up.
- * \param de_ctx Pointer to the Detection Engine Context.
- *
- * \retval lookup_ct_info Pointer to the SCClassConfClasstype instance from
- * the hash table on success; NULL on failure.
- */
-SCClassConfClasstype *SCClassConfGetClasstype(const char *ct_name,
- DetectEngineCtx *de_ctx)
-{
- char name[strlen(ct_name) + 1];
- size_t s;
- for (s = 0; s < strlen(ct_name); s++)
- name[s] = tolower((unsigned char)ct_name[s]);
- name[s] = '\0';
-
- SCClassConfClasstype ct_lookup = {0, name, NULL, 0 };
- SCClassConfClasstype *lookup_ct_info = HashTableLookup(de_ctx->class_conf_ht,
- &ct_lookup, 0);
- return lookup_ct_info;
-}
-
-/*----------------------------------Unittests---------------------------------*/
-
-
-#ifdef UNITTESTS
-
-/**
- * \brief Creates a dummy classification file, with all valid Classtypes, for
- * testing purposes.
- *
- * \file_path Pointer to the file_path for the dummy classification file.
- */
-FILE *SCClassConfGenerateValidDummyClassConfigFD01(void)
-{
- const char *buffer =
- "config classification: nothing-wrong,Nothing Wrong With Us,3\n"
- "config classification: unknown,Unknown are we,3\n"
- "config classification: bad-unknown,We think it's bad, 2\n";
-
- FILE *fd = SCFmemopen((void *)buffer, strlen(buffer), "r");
- if (fd == NULL)
- SCLogDebug("Error with SCFmemopen() called by Classifiation Config test code");
-
- return fd;
-}
-
-/**
- * \brief Creates a dummy classification file, with some valid Classtypes and a
- * couple of invalid Classtypes, for testing purposes.
- *
- * \file_path Pointer to the file_path for the dummy classification file.
- */
-FILE *SCClassConfGenerateInValidDummyClassConfigFD02(void)
-{
- const char *buffer =
- "config classification: not-suspicious,Not Suspicious Traffic,3\n"
- "onfig classification: unknown,Unknown Traffic,3\n"
- "config classification: _badunknown,Potentially Bad Traffic, 2\n"
- "config classification: bamboola1,Unknown Traffic,3\n"
- "config classification: misc-activity,Misc activity,-1\n"
- "config classification: policy-violation,Potential Corporate "
- "config classification: bamboola,Unknown Traffic,3\n";
-
- FILE *fd = SCFmemopen((void *)buffer, strlen(buffer), "r");
- if (fd == NULL)
- SCLogDebug("Error with SCFmemopen() called by Classifiation Config test code");
-
- return fd;
-}
-
-/**
- * \brief Creates a dummy classification file, with all invalid Classtypes, for
- * testing purposes.
- *
- * \file_path Pointer to the file_path for the dummy classification file.
- */
-FILE *SCClassConfGenerateInValidDummyClassConfigFD03(void)
-{
- const char *buffer =
- "conig classification: not-suspicious,Not Suspicious Traffic,3\n"
- "onfig classification: unknown,Unknown Traffic,3\n"
- "config classification: _badunknown,Potentially Bad Traffic, 2\n"
- "config classification: misc-activity,Misc activity,-1\n";
-
- FILE *fd = SCFmemopen((void *)buffer, strlen(buffer), "r");
- if (fd == NULL)
- SCLogDebug("Error with SCFmemopen() called by Classifiation Config test code");
-
- return fd;
-}
-
-/**
- * \test Check that the classification file is loaded and the detection engine
- * content class_conf_hash_table loaded with the classtype data.
- */
-int SCClassConfTest01(void)
-{
- DetectEngineCtx *de_ctx = DetectEngineCtxInit();
- int result = 0;
-
- if (de_ctx == NULL)
- return result;
-
- FILE *fd = SCClassConfGenerateValidDummyClassConfigFD01();
- SCClassConfLoadClassficationConfigFile(de_ctx, fd);
-
- if (de_ctx->class_conf_ht == NULL)
- return result;
-
- result = (de_ctx->class_conf_ht->count == 3);
- if (result == 0) printf("de_ctx->class_conf_ht->count %u: ", de_ctx->class_conf_ht->count);
-
- DetectEngineCtxFree(de_ctx);
-
- return result;
-}
-
-/**
- * \test Check that invalid classtypes present in the classification config file
- * aren't loaded.
- */
-int SCClassConfTest02(void)
-{
- DetectEngineCtx *de_ctx = DetectEngineCtxInit();
- int result = 0;
-
- if (de_ctx == NULL)
- return result;
-
- FILE *fd = SCClassConfGenerateInValidDummyClassConfigFD03();
- SCClassConfLoadClassficationConfigFile(de_ctx, fd);
-
- if (de_ctx->class_conf_ht == NULL)
- return result;
-
- result = (de_ctx->class_conf_ht->count == 0);
-
- DetectEngineCtxFree(de_ctx);
-
- return result;
-}
-
-/**
- * \test Check that only valid classtypes are loaded into the hash table from
- * the classfication.config file.
- */
-int SCClassConfTest03(void)
-{
- DetectEngineCtx *de_ctx = DetectEngineCtxInit();
- int result = 0;
-
- if (de_ctx == NULL)
- return result;
-
- FILE *fd = SCClassConfGenerateInValidDummyClassConfigFD02();
- SCClassConfLoadClassficationConfigFile(de_ctx, fd);
-
- if (de_ctx->class_conf_ht == NULL)
- return result;
-
- result = (de_ctx->class_conf_ht->count == 3);
-
- DetectEngineCtxFree(de_ctx);
-
- return result;
-}
-
-/**
- * \test Check if the classtype info from the classification.config file have
- * been loaded into the hash table.
- */
-int SCClassConfTest04(void)
-{
- DetectEngineCtx *de_ctx = DetectEngineCtxInit();
- int result = 1;
-
- if (de_ctx == NULL)
- return 0;
-
- FILE *fd = SCClassConfGenerateValidDummyClassConfigFD01();
- SCClassConfLoadClassficationConfigFile(de_ctx, fd);
-
- if (de_ctx->class_conf_ht == NULL)
- return 0;
-
- result = (de_ctx->class_conf_ht->count == 3);
-
- result &= (SCClassConfGetClasstype("unknown", de_ctx) != NULL);
- result &= (SCClassConfGetClasstype("unKnoWn", de_ctx) != NULL);
- result &= (SCClassConfGetClasstype("bamboo", de_ctx) == NULL);
- result &= (SCClassConfGetClasstype("bad-unknown", de_ctx) != NULL);
- result &= (SCClassConfGetClasstype("BAD-UNKnOWN", de_ctx) != NULL);
- result &= (SCClassConfGetClasstype("bed-unknown", de_ctx) == NULL);
-
- DetectEngineCtxFree(de_ctx);
-
- return result;
-}
-
-/**
- * \test Check if the classtype info from the invalid classification.config file
- * have not been loaded into the hash table, and cross verify to check
- * that the hash table contains no classtype data.
- */
-int SCClassConfTest05(void)
-{
- DetectEngineCtx *de_ctx = DetectEngineCtxInit();
- int result = 1;
-
- if (de_ctx == NULL)
- return 0;
-
- FILE *fd = SCClassConfGenerateInValidDummyClassConfigFD03();
- SCClassConfLoadClassficationConfigFile(de_ctx, fd);
-
- if (de_ctx->class_conf_ht == NULL)
- return 0;
-
- result = (de_ctx->class_conf_ht->count == 0);
-
- result &= (SCClassConfGetClasstype("unknown", de_ctx) == NULL);
- result &= (SCClassConfGetClasstype("unKnoWn", de_ctx) == NULL);
- result &= (SCClassConfGetClasstype("bamboo", de_ctx) == NULL);
- result &= (SCClassConfGetClasstype("bad-unknown", de_ctx) == NULL);
- result &= (SCClassConfGetClasstype("BAD-UNKnOWN", de_ctx) == NULL);
- result &= (SCClassConfGetClasstype("bed-unknown", de_ctx) == NULL);
-
- DetectEngineCtxFree(de_ctx);
-
- return result;
-}
-
-/**
- * \test Check if the classtype info from the classification.config file have
- * been loaded into the hash table.
- */
-int SCClassConfTest06(void)
-{
- DetectEngineCtx *de_ctx = DetectEngineCtxInit();
- int result = 1;
-
- if (de_ctx == NULL)
- return 0;
-
- FILE *fd = SCClassConfGenerateInValidDummyClassConfigFD02();
- SCClassConfLoadClassficationConfigFile(de_ctx, fd);
-
- if (de_ctx->class_conf_ht == NULL)
- return 0;
-
- result = (de_ctx->class_conf_ht->count == 3);
-
- result &= (SCClassConfGetClasstype("unknown", de_ctx) == NULL);
- result &= (SCClassConfGetClasstype("not-suspicious", de_ctx) != NULL);
- result &= (SCClassConfGetClasstype("bamboola1", de_ctx) != NULL);
- result &= (SCClassConfGetClasstype("bamboola1", de_ctx) != NULL);
- result &= (SCClassConfGetClasstype("BAMBOolA1", de_ctx) != NULL);
- result &= (SCClassConfGetClasstype("unkNOwn", de_ctx) == NULL);
-
- DetectEngineCtxFree(de_ctx);
-
- return result;
-}
-
-#endif /* UNITTESTS */
-
-/**
- * \brief This function registers unit tests for Classification Config API.
- */
-void SCClassConfRegisterTests(void)
-{
-
-#ifdef UNITTESTS
-
- UtRegisterTest("SCClassConfTest01", SCClassConfTest01, 1);
- UtRegisterTest("SCClassConfTest02", SCClassConfTest02, 1);
- UtRegisterTest("SCClassConfTest03", SCClassConfTest03, 1);
- UtRegisterTest("SCClassConfTest04", SCClassConfTest04, 1);
- UtRegisterTest("SCClassConfTest05", SCClassConfTest05, 1);
- UtRegisterTest("SCClassConfTest06", SCClassConfTest06, 1);
-
-#endif /* UNITTESTS */
-
-}