cvss3/base_metrics.go (225 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 cvss3
import "fmt"
type BaseMetrics struct {
AttackVector
AttackComplexity
PrivilegesRequired
UserInteraction
Scope
Confidentiality
Integrity
Availability
}
type AttackVector int
const (
AttackVectorNetwork AttackVector = iota + 1
AttackVectorAdjecent
AttackVectorLocal
AttackVectorPhysical
)
var (
weightsAttackVector = []float64{0, 0.85, 0.62, 0.55, 0.2}
codeAttackVector = []string{"", "N", "A", "L", "P"}
)
func (av AttackVector) defined() bool {
return int(av) != 0
}
func (av AttackVector) weight() float64 {
return weightsAttackVector[av]
}
func (av AttackVector) String() string {
return codeAttackVector[av]
}
func (av *AttackVector) parse(str string) error {
idx, found := findIndex(str, codeAttackVector)
if found {
*av = AttackVector(idx)
return nil
}
return fmt.Errorf("illegal attack vector code %s", str)
}
type AttackComplexity int
const (
AttackComplexityLow AttackComplexity = iota + 1
AttackComplexityHigh
)
var (
weightsAttackComplexity = []float64{0, 0.77, 0.44}
codeAttackComplexity = []string{"", "L", "H"}
)
func (ac AttackComplexity) defined() bool {
return int(ac) != 0
}
func (ac AttackComplexity) weight() float64 {
return weightsAttackComplexity[ac]
}
func (ac AttackComplexity) String() string {
return codeAttackComplexity[ac]
}
func (ac *AttackComplexity) parse(str string) error {
idx, found := findIndex(str, codeAttackComplexity)
if found {
*ac = AttackComplexity(idx)
return nil
}
return fmt.Errorf("illegal attack complexity code %s", str)
}
type PrivilegesRequired int
const (
PrivilegesRequiredNone PrivilegesRequired = iota + 1
PrivilegesRequiredLow
PrivilegesRequiredHigh
)
var (
weightsPrivilegesRequired = map[bool][]float64{
false: {0, 0.85, 0.62, 0.27},
true: {0, 0.85, 0.68, 0.5},
}
codePrivilegesRequired = []string{"", "N", "L", "H"}
)
func (pr PrivilegesRequired) defined() bool {
return int(pr) != 0
}
func (pr PrivilegesRequired) weight(scopeChanged bool) float64 {
return weightsPrivilegesRequired[scopeChanged][pr]
}
func (pr PrivilegesRequired) String() string {
return codePrivilegesRequired[pr]
}
func (pr *PrivilegesRequired) parse(str string) error {
idx, found := findIndex(str, codePrivilegesRequired)
if found {
*pr = PrivilegesRequired(idx)
return nil
}
return fmt.Errorf("illegal privileges required code %s", str)
}
type UserInteraction int
const (
UserInteractionNone UserInteraction = iota + 1
UserInteractionRequired
)
var (
weightsUserInteraction = []float64{0, 0.85, 0.62}
codeUserInteraction = []string{"", "N", "R"}
)
func (ui UserInteraction) defined() bool {
return int(ui) != 0
}
func (ui UserInteraction) weight() float64 {
return weightsUserInteraction[ui]
}
func (ui UserInteraction) String() string {
return codeUserInteraction[ui]
}
func (ui *UserInteraction) parse(str string) error {
idx, found := findIndex(str, codeUserInteraction)
if found {
*ui = UserInteraction(idx)
return nil
}
return fmt.Errorf("illegal user interaction code %s", str)
}
type Scope int
const (
ScopeUnchanged Scope = iota + 1
ScopeChanged
)
var (
codeScope = []string{"", "U", "C"}
)
func (s Scope) defined() bool {
return int(s) != 0
}
func (s Scope) String() string {
return codeScope[s]
}
func (s *Scope) parse(str string) error {
idx, found := findIndex(str, codeScope)
if found {
*s = Scope(idx)
return nil
}
return fmt.Errorf("illegal scope code %s", str)
}
type Confidentiality int
const (
ConfidentialityHigh Confidentiality = iota + 1
ConfidentialityLow
ConfidentialityNone
)
var (
weightsConfidentiality = []float64{0, 0.56, 0.22, 0.0}
codeConfidentiality = []string{"", "H", "L", "N"}
)
func (c Confidentiality) defined() bool {
return int(c) != 0
}
func (c Confidentiality) weight() float64 {
return weightsConfidentiality[c]
}
func (c Confidentiality) String() string {
return codeConfidentiality[c]
}
func (c *Confidentiality) parse(str string) error {
idx, found := findIndex(str, codeConfidentiality)
if found {
*c = Confidentiality(idx)
return nil
}
return fmt.Errorf("illegal confidentiality code %s", str)
}
type Integrity int
const (
IntegrityHigh Integrity = iota + 1
IntegrityLow
IntegrityNone
)
var (
weightsIntegrity = []float64{0, 0.56, 0.22, 0.0}
codeIntegrity = []string{"", "H", "L", "N"}
)
func (i Integrity) defined() bool {
return int(i) != 0
}
func (i Integrity) weight() float64 {
return weightsIntegrity[i]
}
func (i Integrity) String() string {
return codeIntegrity[i]
}
func (i *Integrity) parse(str string) error {
idx, found := findIndex(str, codeIntegrity)
if found {
*i = Integrity(idx)
return nil
}
return fmt.Errorf("illegal integrity code %s", str)
}
type Availability int
const (
AvailabilityHigh Availability = iota + 1
AvailabilityLow
AvailabilityNone
)
var (
weightsAvailability = []float64{0, 0.56, 0.22, 0.0}
codeAvailability = []string{"", "H", "L", "N"}
)
func (a Availability) defined() bool {
return int(a) != 0
}
func (a Availability) weight() float64 {
return weightsAvailability[a]
}
func (a Availability) String() string {
return codeAvailability[a]
}
func (a *Availability) parse(str string) error {
idx, found := findIndex(str, codeAvailability)
if found {
*a = Availability(idx)
return nil
}
return fmt.Errorf("illegal availability code %s", str)
}