Blame utils/oscap-cvss.c

Packit 517ee8
/*
Packit 517ee8
 * Copyright 2010 Red Hat Inc., Durham, North Carolina.
Packit 517ee8
 * All Rights Reserved.
Packit 517ee8
 *
Packit 517ee8
 * This library is free software; you can redistribute it and/or
Packit 517ee8
 * modify it under the terms of the GNU Lesser General Public
Packit 517ee8
 * License as published by the Free Software Foundation; either
Packit 517ee8
 * version 2.1 of the License, or (at your option) any later version.
Packit 517ee8
 *
Packit 517ee8
 * This library is distributed in the hope that it will be useful,
Packit 517ee8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 517ee8
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 517ee8
 * Lesser General Public License for more details.
Packit 517ee8
 *
Packit 517ee8
 * You should have received a copy of the GNU Lesser General Public
Packit 517ee8
 * License along with this library; if not, write to the Free Software
Packit 517ee8
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Packit 517ee8
 *
Packit 517ee8
 * Authors:
Packit 517ee8
 *      Maros Barabas  <mbarabas@redhat.com>
Packit 517ee8
 */
Packit 517ee8
Packit 517ee8
#ifdef HAVE_CONFIG_H
Packit 517ee8
#include <config.h>
Packit 517ee8
#endif
Packit 517ee8
Packit 517ee8
/* Standard header files */
Packit 517ee8
#include <stdio.h>
Packit 517ee8
#include <stdlib.h>
Packit 517ee8
#include <string.h>
Packit 517ee8
#ifdef HAVE_GETOPT_H
Packit 517ee8
#include <getopt.h>
Packit 517ee8
#endif
Packit 517ee8
#include <assert.h>
Packit 517ee8
#include <math.h>
Packit 517ee8
Packit 517ee8
#include <cvss_score.h>
Packit 517ee8
#include <xccdf_session.h>
Packit 517ee8
Packit 517ee8
#include "oscap-tool.h"
Packit 517ee8
Packit 517ee8
static bool getopt_cvss(int argc, char **argv, struct oscap_action *action);
Packit 517ee8
static int app_cvss_score(const struct oscap_action *action);
Packit 517ee8
static int app_cvss_describe(const struct oscap_action *action);
Packit 517ee8
Packit 517ee8
#define CVSS_SUBMODULES_NUM 3 /* See actual CVSS_SUBMODULES array
Packit 517ee8
				initialization below. */
Packit 517ee8
static struct oscap_module* CVSS_SUBMODULES[CVSS_SUBMODULES_NUM];
Packit 517ee8
Packit 517ee8
struct oscap_module OSCAP_CVSS_MODULE = {
Packit 517ee8
    .name = "cvss",
Packit 517ee8
    .parent = &OSCAP_ROOT_MODULE,
Packit 517ee8
    .summary = "Common Vulnerability Scoring System",
Packit 517ee8
    .submodules = CVSS_SUBMODULES
Packit 517ee8
};
Packit 517ee8
Packit 517ee8
static struct oscap_module CVSS_SCORE_MODULE = {
Packit 517ee8
    .name = "score",
Packit 517ee8
    .parent = &OSCAP_CVSS_MODULE,
Packit 517ee8
    .summary = "CVSS score from a CVSS vector",
Packit 517ee8
    .usage = "vector",
Packit 517ee8
    .help = "Calculates CVSS score\n"
Packit 517ee8
            "(base / temporal / environmental, depends on supplied metrics).",
Packit 517ee8
    .opt_parser = getopt_cvss,
Packit 517ee8
    .func = app_cvss_score
Packit 517ee8
};
Packit 517ee8
Packit 517ee8
static struct oscap_module CVSS_DESCRIBE_MODULE = {
Packit 517ee8
    .name = "describe",
Packit 517ee8
    .parent = &OSCAP_CVSS_MODULE,
Packit 517ee8
    .summary = "Describe a CVSS vector",
Packit 517ee8
    .usage = "vector",
Packit 517ee8
    .help = "Describes individual components of a CVSS vector\n",
Packit 517ee8
    .opt_parser = getopt_cvss,
Packit 517ee8
    .func = app_cvss_describe
Packit 517ee8
};
Packit 517ee8
Packit 517ee8
static struct oscap_module* CVSS_SUBMODULES[CVSS_SUBMODULES_NUM] = {
Packit 517ee8
    &CVSS_SCORE_MODULE,
Packit 517ee8
    &CVSS_DESCRIBE_MODULE,
Packit 517ee8
    NULL
Packit 517ee8
};
Packit 517ee8
Packit 517ee8
static inline bool print_score(const char *type, float score)
Packit 517ee8
{
Packit 517ee8
    if (score >= 0.0 && score <= 10.0) {
Packit 517ee8
        printf("%15s %4.1f\n", type, score);
Packit 517ee8
        return true;
Packit 517ee8
    }
Packit 517ee8
    else return false;
Packit 517ee8
}
Packit 517ee8
Packit 517ee8
int app_cvss_score(const struct oscap_action *action)
Packit 517ee8
{
Packit 517ee8
    assert(action->cvss_vector);
Packit 517ee8
Packit 517ee8
    bool ok = false;
Packit 517ee8
    struct cvss_impact *impact = cvss_impact_new_from_vector(action->cvss_vector);
Packit 517ee8
Packit 517ee8
    if (impact == NULL) goto err;
Packit 517ee8
Packit 517ee8
    ok |= print_score("base",          cvss_impact_base_score(impact));
Packit 517ee8
    ok |= print_score("temporal",      cvss_impact_temporal_score(impact));
Packit 517ee8
    ok |= print_score("environmental", cvss_impact_environmental_score(impact));
Packit 517ee8
Packit 517ee8
    if (!ok) goto err;
Packit 517ee8
Packit 517ee8
    cvss_impact_free(impact);
Packit 517ee8
    return OSCAP_OK;
Packit 517ee8
Packit 517ee8
err:
Packit 517ee8
    cvss_impact_free(impact);
Packit 517ee8
    fprintf(stderr, "Invalid input CVSS vector\n");
Packit 517ee8
    return OSCAP_ERROR;
Packit 517ee8
}
Packit 517ee8
Packit 517ee8
static int app_cvss_describe(const struct oscap_action *action)
Packit 517ee8
{
Packit 517ee8
    assert(action->cvss_vector);
Packit 517ee8
Packit 517ee8
    struct cvss_impact *impact = cvss_impact_new_from_vector(action->cvss_vector);
Packit 517ee8
Packit 517ee8
    if (impact) {
Packit 517ee8
        cvss_impact_describe(impact, stdout);
Packit 517ee8
        cvss_impact_free(impact);
Packit 517ee8
        return OSCAP_OK;
Packit 517ee8
    }
Packit 517ee8
    else {
Packit 517ee8
        fprintf(stderr, "Invalid input CVSS vector\n");
Packit 517ee8
        return OSCAP_ERROR;
Packit 517ee8
    }
Packit 517ee8
}
Packit 517ee8
Packit 517ee8
bool getopt_cvss(int argc, char **argv, struct oscap_action *action)
Packit 517ee8
{
Packit 517ee8
    if (optind < argc) action->cvss_vector = argv[optind];
Packit 517ee8
Packit 517ee8
	if ((action->module == &CVSS_SCORE_MODULE) && action->cvss_vector == NULL)
Packit 517ee8
        return oscap_module_usage(action->module, stderr, "CVSS vector not supplied");
Packit 517ee8
Packit 517ee8
	return true;
Packit 517ee8
}
Packit 517ee8