CVSS
view release on metacpan or search on metacpan
lib/CVSS/v4.pm view on Meta::CPAN
$eq3eq6_next_lower_macro_left = join '', ($eq1, $eq2, $eq3, $eq4, $eq5, $eq6 + 1);
$eq3eq6_next_lower_macro_right = join '', ($eq1, $eq2, $eq3 + 1, $eq4, $eq5, $eq6);
}
else {
$eq3eq6_next_lower_macro = join '', ($eq1, $eq2, $eq3 + 1, $eq4, $eq5, $eq6 + 1);
}
my $eq4_next_lower_macro = join '', ($eq1, $eq2, $eq3, $eq4 + 1, $eq5, $eq6);
my $eq5_next_lower_macro = join '', ($eq1, $eq2, $eq3, $eq4, $eq5 + 1, $eq6);
my $score_eq1_next_lower_macro = $CVSS_LOOKUP_GLOBAL->{$eq1_next_lower_macro} || 'NaN';
my $score_eq2_next_lower_macro = $CVSS_LOOKUP_GLOBAL->{$eq2_next_lower_macro} || 'NaN';
my $score_eq3eq6_next_lower_macro_left = undef;
my $score_eq3eq6_next_lower_macro_right = undef;
my $score_eq3eq6_next_lower_macro = undef;
if ($eq3 == 0 && $eq6 == 0) {
# multiple path take the one with higher score
$score_eq3eq6_next_lower_macro_left = $CVSS_LOOKUP_GLOBAL->{$eq3eq6_next_lower_macro_left} || 'NaN';
$score_eq3eq6_next_lower_macro_right = $CVSS_LOOKUP_GLOBAL->{$eq3eq6_next_lower_macro_right} || 'NaN';
$score_eq3eq6_next_lower_macro = max($score_eq3eq6_next_lower_macro_left, $score_eq3eq6_next_lower_macro_right);
}
else {
$score_eq3eq6_next_lower_macro = $CVSS_LOOKUP_GLOBAL->{$eq3eq6_next_lower_macro} || 'NaN';
}
my $score_eq4_next_lower_macro = $CVSS_LOOKUP_GLOBAL->{$eq4_next_lower_macro} || 'NaN';
my $score_eq5_next_lower_macro = $CVSS_LOOKUP_GLOBAL->{$eq5_next_lower_macro} || 'NaN';
# b. The severity distance of the to-be scored vector from a
# highest severity vector in the same MacroVector is determined.
my $eq1_maxes = $MAX_COMPOSED->{eq1}->{$eq1};
my $eq2_maxes = $MAX_COMPOSED->{eq2}->{$eq2};
my $eq3_eq6_maxes = $MAX_COMPOSED->{eq3}->{$eq3}->{$eq6};
my $eq4_maxes = $MAX_COMPOSED->{eq4}->{$eq4};
my $eq5_maxes = $MAX_COMPOSED->{eq5}->{$eq5};
# compose them
lib/CVSS/v4.pm view on Meta::CPAN
# c. The proportion of the distance is determined by dividing
# the severity distance of the to-be-scored vector by the depth
# of the MacroVector.
# d. The maximal scoring difference is multiplied by the proportion of
# distance.
my $n_existing_lower = 0;
if (!isNaN($available_distance_eq1) && $available_distance_eq1 >= 0) {
$n_existing_lower += 1;
$percent_to_next_eq1_severity = ($current_severity_distance_eq1) / $max_severity_eq1;
$normalized_severity_eq1 = $available_distance_eq1 * $percent_to_next_eq1_severity;
}
if (!isNaN($available_distance_eq2) && $available_distance_eq2 >= 0) {
$n_existing_lower += 1;
$percent_to_next_eq2_severity = ($current_severity_distance_eq2) / $max_severity_eq2;
$normalized_severity_eq2 = $available_distance_eq2 * $percent_to_next_eq2_severity;
}
if (!isNaN($available_distance_eq3eq6) && $available_distance_eq3eq6 >= 0) {
$n_existing_lower += 1;
$percent_to_next_eq3eq6_severity = ($current_severity_distance_eq3eq6) / $max_severity_eq3eq6;
$normalized_severity_eq3eq6 = $available_distance_eq3eq6 * $percent_to_next_eq3eq6_severity;
}
if (!isNaN($available_distance_eq4) && $available_distance_eq4 >= 0) {
$n_existing_lower += 1;
$percent_to_next_eq4_severity = ($current_severity_distance_eq4) / $max_severity_eq4;
$normalized_severity_eq4 = $available_distance_eq4 * $percent_to_next_eq4_severity;
}
if (!isNaN($available_distance_eq5) && $available_distance_eq5 >= 0) {
$n_existing_lower += 1;
$percent_to_next_eq5_severity = 0;
$normalized_severity_eq5 = $available_distance_eq5 * $percent_to_next_eq5_severity;
}
my $mean_distance = undef;
# 2. The mean of the above computed proportional distances is computed.
if ($n_existing_lower == 0) {
$mean_distance = 0;
lib/CVSS/v4.pm view on Meta::CPAN
return 1;
}
sub extract_value_metric {
my ($self, $metric, $vector_string) = @_;
my %metrics = split /[\/:]/, $vector_string;
return $metrics{$metric};
}
sub isNaN { !defined($_[0] <=> 9**9**9) }
sub to_xml {
my ($self) = @_;
my $metric_value_names = $self->METRIC_NAMES;
$self->calculate_score unless ($self->base_score);
my $version = $self->version;
( run in 0.228 second using v1.01-cache-2.11-cpan-4d50c553e7e )