ADAPT / src / attack_repertoire.c
attack_repertoire.c
Raw
#define _XOPEN_SOURCE 600

#include "attack_repertoire.h"

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

void attack_step_init(struct attack_step *a_s, char *name,  char *MATTACK, cap_execute run, cap_guard guard)
{
    strncpy(a_s->name, name, sizeof(a_s->name));
    strncpy(a_s->MATTACK, MATTACK, sizeof(a_s->MATTACK));
    a_s->run = run;
    a_s->guard = guard;
}

void attack_step_print(struct attack_step *a_s)
{
    printf("%s:\n", a_s->name);
    printf(" - MITRE ATTCK: %s\n", a_s->MATTACK);
    
}


void attack_pattern_init(struct attack_pattern *a_p, char *name,
			 enum ATTACK_VECTOR a_v, enum ATTACK_COMPLEXITY a_c,
			 enum PRIVILEGES_REQUIRED p_r,  enum USER_INTERACTION u_i,
			 enum RUNNING_TIME r_t)
{
    strncpy(a_p->name, name, sizeof(a_p->name));
    a_p->a_v = a_v;
    a_p-> a_c = a_c;
    a_p->p_r = p_r;
    a_p->u_i = u_i;
    a_p->r_t = r_t;

    a_p->num_steps = 0;
    a_p->max_steps = ATTACK_PATTERN_INIT_NUM_STEPS;
    a_p->a_steps = malloc(a_p->max_steps * sizeof(char*));
	    
}



void attack_pattern_add_step(struct attack_pattern *a_p, char *a_s)
{
    if(a_p->num_steps >= a_p->max_steps)
    {
	a_p->max_steps *= 2;
	a_p->a_steps = realloc(a_p->a_steps,a_p->max_steps * sizeof(char*));
    }

    a_p->a_steps[a_p->num_steps] = strdup(a_s);
    a_p->num_steps++;
}

void attack_pattern_destroy(struct attack_pattern *a_p)
{

    for(size_t i = 0 ; i < a_p->num_steps;i++)
    {
	free(a_p->a_steps[i]);
    }
    
    free(a_p->a_steps);
}


void attack_pattern_print(struct attack_pattern *a_p)
{
    printf("%s:\n",a_p->name);
    printf(" - AV: %g\n",attack_vector_score(a_p->a_v));
    printf(" - AC: %g\n",attack_complexity_score(a_p->a_c));
    printf(" - PR: %g\n",privileges_required_score(a_p->p_r));
    printf(" - UI: %g\n",user_interaction_score(a_p->u_i));
    printf(" - RT: %g\n",running_time_score(a_p->r_t));


    //prettify this if needed, for now let it be
    printf(" -steps:\n");
    for(size_t i=0;i<a_p->num_steps;i++)
    {
	printf("      %zu: %s\n",i,a_p->a_steps[i]);
    }
    
}



void attack_repertoire_init(struct attack_repertoire *a_r)
{
    a_r->num_attack_steps = 0;
    a_r->max_attack_steps = ATTACK_REPERTOIRE_INIT_NUM_STEPS;
    a_r->a_steps = malloc(a_r->max_attack_steps * sizeof(struct attack_step));

    a_r->num_attack_patterns = 0;
    a_r->max_attack_patterns = ATTACK_REPERTOIRE_INIT_NUM_PATTERNS;
    a_r->a_patterns = malloc(a_r->max_attack_patterns * sizeof(struct attack_pattern));
    
}

void attack_repertoire_add_pattern(struct attack_repertoire *a_r, struct attack_pattern *a_p)
{
    if(a_r->num_attack_patterns >= a_r->max_attack_patterns)
    {
	a_r->max_attack_patterns *= 2;
	a_r->a_patterns = realloc(a_r->a_patterns, a_r->max_attack_patterns * sizeof(struct attack_pattern));
    }

    a_r->a_patterns[a_r->num_attack_patterns] = *a_p;
    a_r->num_attack_patterns++;
    
}


void attack_repertoire_add_step(struct attack_repertoire *a_r, struct attack_step *a_s)
{
    if(a_r->num_attack_steps >= a_r->max_attack_steps)
    {
	a_r->max_attack_steps *= 2;
	a_r->a_steps = realloc(a_r->a_steps, a_r->max_attack_steps * sizeof(struct attack_step));
    }

    a_r->a_steps[a_r->num_attack_steps] = *a_s;
    a_r->num_attack_steps++;
    
}

void attack_repertoire_destroy(struct attack_repertoire *a_r)
{
    //cleanup patterns
    for(size_t i=0;i<a_r->num_attack_patterns;i++)
    {
	struct attack_pattern *a_p = &a_r->a_patterns[i];
	attack_pattern_destroy(a_p);
    }
    free(a_r->a_patterns);

    //cleanup steps
    free(a_r->a_steps);
}

void attack_repertoire_print(struct attack_repertoire *a_r)
{
    printf("[Steps]\n");
    for(size_t i=0;i<a_r->num_attack_steps;i++)
    {
	attack_step_print(&a_r->a_steps[i]);
    }
    printf("[Patterns]\n");
    for(size_t i=0;i<a_r->num_attack_patterns;i++)
    {
	attack_pattern_print(&a_r->a_patterns[i]);
    }
}


struct attack_pattern *attack_repertoire_get_pattern(struct attack_repertoire *a_r, char *attack)
{
    for(size_t i=0;i < a_r->num_attack_patterns;i++)
    {
	if(strcmp(a_r->a_patterns[i].name, attack) == 0)
	{
	    return &a_r->a_patterns[i];
	}
    }

    return NULL;
}


struct attack_step *attack_repertoire_get_attack_step(struct attack_repertoire *a_r, char *step)
{
    for(size_t i=0;i < a_r->num_attack_steps;i++)
    {
	if(strcmp(a_r->a_steps[i].name, step) == 0)
	{
	    return &a_r->a_steps[i];
	}
    }

    return NULL;
}