cvss2/base_metrics.go (172 lines of code) (raw):

// Copyright (c) Facebook, Inc. and its affiliates. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package cvss2 import "fmt" type BaseMetrics struct { AccessVector AccessComplexity Authentication ConfidentialityImpact IntegrityImpact AvailabilityImpact } type AccessVector int const ( AccessVectorLocal AccessVector = iota + 1 AccessVectorAdjecentNetwork AccessVectorNetwork ) var ( weightsAccessVector = []float64{0, 0.395, 0.646, 1} codeAccessVector = []string{"", "L", "A", "N"} ) func (av AccessVector) defined() bool { return int(av) != 0 } func (av AccessVector) weight() float64 { return weightsAccessVector[av] } func (av AccessVector) String() string { return codeAccessVector[av] } func (av *AccessVector) parse(str string) error { idx, found := findIndex(str, codeAccessVector) if found { *av = AccessVector(idx) return nil } return fmt.Errorf("illegal access vector code %s", str) } type AccessComplexity int const ( AccessComplexityHigh AccessComplexity = iota + 1 AccessComplexityMedium AccessComplexityLow ) var ( weightsAccessComplexity = []float64{0, 0.35, 0.61, 0.71} codeAccessComplexity = []string{"", "H", "M", "L"} ) func (ac AccessComplexity) defined() bool { return int(ac) != 0 } func (ac AccessComplexity) weight() float64 { return weightsAccessComplexity[ac] } func (ac AccessComplexity) String() string { return codeAccessComplexity[ac] } func (ac *AccessComplexity) parse(str string) error { idx, found := findIndex(str, codeAccessComplexity) if found { *ac = AccessComplexity(idx) return nil } return fmt.Errorf("illegal access complexity code %s", str) } type Authentication int const ( AuthenticationMultiple Authentication = iota + 1 AuthenticationSingle AuthenticationNone ) var ( weightsAuthentication = []float64{0, 0.45, 0.56, 0.704} codeAuthentication = []string{"", "M", "S", "N"} ) func (au Authentication) defined() bool { return int(au) != 0 } func (au Authentication) weight() float64 { return weightsAuthentication[au] } func (au Authentication) String() string { return codeAuthentication[au] } func (au *Authentication) parse(str string) error { idx, found := findIndex(str, codeAuthentication) if found { *au = Authentication(idx) return nil } return fmt.Errorf("illegal authentication code %s", str) } type ConfidentialityImpact int const ( ConfidentialityImpactNone ConfidentialityImpact = iota + 1 ConfidentialityImpactPartial ConfidentialityImpactComplete ) var ( weightsConfidentialityImpact = []float64{0, 0, 0.275, 0.66} codeConfidentialityImpact = []string{"", "N", "P", "C"} ) func (ci ConfidentialityImpact) defined() bool { return int(ci) != 0 } func (ci ConfidentialityImpact) weight() float64 { return weightsConfidentialityImpact[ci] } func (ci ConfidentialityImpact) String() string { return codeConfidentialityImpact[ci] } func (ci *ConfidentialityImpact) parse(str string) error { idx, found := findIndex(str, codeConfidentialityImpact) if found { *ci = ConfidentialityImpact(idx) return nil } return fmt.Errorf("illegal confidentiality impact %s", str) } type IntegrityImpact int const ( IntegerityImpactNone IntegrityImpact = iota + 1 IntegrityImpactPartial IntegrityImpactComplete ) var ( weightsIntegrityImpact = []float64{0, 0, 0.275, 0.66} codeIntegrityImpact = []string{"", "N", "P", "C"} ) func (ii IntegrityImpact) defined() bool { return int(ii) != 0 } func (ii IntegrityImpact) weight() float64 { return weightsIntegrityImpact[ii] } func (ii IntegrityImpact) String() string { return codeIntegrityImpact[ii] } func (ii *IntegrityImpact) parse(str string) error { idx, found := findIndex(str, codeIntegrityImpact) if found { *ii = IntegrityImpact(idx) return nil } return fmt.Errorf("illegal integrity impact code %s", str) } type AvailabilityImpact int const ( AvailabilityImpactNone AvailabilityImpact = iota + 1 AvailabilityImpactPartial AvailabilityImpactComplete ) var ( weightsAvailabilityImpact = []float64{0, 0, 0.275, 0.66} codeAvailabilityImpact = []string{"", "N", "P", "C"} ) func (ai AvailabilityImpact) defined() bool { return int(ai) != 0 } func (ai AvailabilityImpact) weight() float64 { return weightsAvailabilityImpact[ai] } func (ai AvailabilityImpact) String() string { return codeAvailabilityImpact[ai] } func (ai *AvailabilityImpact) parse(str string) error { idx, found := findIndex(str, codeAvailabilityImpact) if found { *ai = AvailabilityImpact(idx) return nil } return fmt.Errorf("illegal availability impact code %s", str) }