Skip to content

Commit

Permalink
Merge pull request #29 from goark/debug-and-refactoring
Browse files Browse the repository at this point in the history
Fixed error code if metric.*.Encode method is error (issue #28)
  • Loading branch information
spiegel-im-spiegel authored Feb 1, 2023
2 parents 290d6f8 + aaed9a2 commit 808b26d
Show file tree
Hide file tree
Showing 11 changed files with 136 additions and 89 deletions.
19 changes: 10 additions & 9 deletions cvsserr/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ package cvsserr
import "errors"

var (
ErrNullPointer = errors.New("Null reference instance")
ErrUndefinedMetric = errors.New("undefined metric")
ErrInvalidVector = errors.New("invalid vector")
ErrNotSupportVer = errors.New("not support version")
ErrNotSupportMetric = errors.New("not support metric")
ErrInvalidTemplate = errors.New("invalid templete string")
ErrSameMetric = errors.New("exist same metric")
ErrInvalidValue = errors.New("invalid value of metric")
ErrNoMetrics = errors.New("no metrics")
ErrNullPointer = errors.New("Null reference instance")
ErrInvalidVector = errors.New("invalid vector")
ErrNotSupportVer = errors.New("not support version")
ErrNotSupportMetric = errors.New("not support metric")
ErrInvalidTemplate = errors.New("invalid templete string")
ErrSameMetric = errors.New("exist same metric")
ErrInvalidValue = errors.New("invalid value of metric")
ErrNoBaseMetrics = errors.New("no Base metrics")
ErrNoTemporalMetrics = errors.New("no Temporal metrics")
ErrNoEnvironmentalMetrics = errors.New("no Environmental metrics")
)

/* Copyright 2018-2023 Spiegel
Expand Down
38 changes: 25 additions & 13 deletions v2/metric/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,29 +114,41 @@ func (m *Base) decodeOne(str string) error {
// GetError returns error instance if unknown metric
func (m *Base) GetError() error {
if m == nil {
return errs.Wrap(cvsserr.ErrNoMetrics)
return errs.Wrap(cvsserr.ErrNoBaseMetrics)
}
switch true {
case !m.AV.IsUnknown(), !m.AC.IsUnknown(), !m.Au.IsUnknown(), !m.C.IsUnknown(), !m.I.IsUnknown(), !m.A.IsUnknown():
return errs.Wrap(cvsserr.ErrNoMetrics)
return errs.Wrap(cvsserr.ErrNoBaseMetrics)
default:
return nil
}
}

// Encode returns CVSSv2 vector string
func (m *Base) Encode() (string, error) {
if err := m.GetError(); err != nil {
return "", err
}
r := &strings.Builder{}
r.WriteString(fmt.Sprintf("%s:%v", metricAV, m.AV)) // Access Vector
r.WriteString(fmt.Sprintf("/%s:%v", metricAC, m.AC)) // Access Complexity
r.WriteString(fmt.Sprintf("/%s:%v", metricAu, m.Au)) // Authentication
r.WriteString(fmt.Sprintf("/%s:%v", metricC, m.C)) // Confidentiality Impact
r.WriteString(fmt.Sprintf("/%s:%v", metricI, m.I)) // Integrity Impact
r.WriteString(fmt.Sprintf("/%s:%v", metricA, m.A)) // Availability Impact
return r.String(), nil
if m == nil {
return "", errs.Wrap(cvsserr.ErrNoBaseMetrics)
}
r := []string{}
if m.names[metricAV] {
r = append(r, fmt.Sprintf("%s:%v", metricAV, m.AV)) // Access Vector
}
if m.names[metricAC] {
r = append(r, fmt.Sprintf("%s:%v", metricAC, m.AC)) // Access Complexity
}
if m.names[metricAu] {
r = append(r, fmt.Sprintf("%s:%v", metricAu, m.Au)) // Authentication
}
if m.names[metricC] {
r = append(r, fmt.Sprintf("%s:%v", metricC, m.C)) // Confidentiality Impact
}
if m.names[metricI] {
r = append(r, fmt.Sprintf("%s:%v", metricI, m.I)) // Integrity Impact
}
if m.names[metricA] {
r = append(r, fmt.Sprintf("%s:%v", metricA, m.A)) // Availability Impact
}
return strings.Join(r, "/"), m.GetError()
}

// String is stringer method.
Expand Down
33 changes: 19 additions & 14 deletions v2/metric/environmental.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,38 +115,43 @@ func (m *Environmental) decodeOne(str string) error {
// GetError returns error instance if undefined metric
func (m *Environmental) GetError() error {
if m == nil {
return errs.Wrap(cvsserr.ErrNoMetrics)
return errs.Wrap(cvsserr.ErrNoEnvironmentalMetrics)
}
if err := m.Temporal.GetError(); err != nil {
return errs.Wrap(err)
}
switch true {
case !m.CDP.IsValid(), !m.TD.IsValid(), !m.CR.IsValid(), !m.IR.IsValid(), !m.AR.IsValid():
return errs.Wrap(cvsserr.ErrNoMetrics)
return errs.Wrap(cvsserr.ErrNoEnvironmentalMetrics)
default:
return nil
}
}

// Encode returns CVSSv2 vector string
func (m *Environmental) Encode() (string, error) {
if err := m.GetError(); err != nil {
return "", err
}
ts, err := m.Temporal.Encode()
if err != nil {
return "", errs.Wrap(err)
if m == nil {
return "", errs.Wrap(cvsserr.ErrNoBaseMetrics)
}
ts, _ := m.Temporal.Encode()
r := &strings.Builder{}
r.WriteString(ts) //Vector of Temporal metrics
if m.names[metricCDP] || m.names[metricTD] || m.names[metricCR] || m.names[metricIR] || m.names[metricAR] {
if m.names[metricCDP] {
r.WriteString(fmt.Sprintf("/%s:%v", metricCDP, m.CDP)) // Collateral Damage Potential
r.WriteString(fmt.Sprintf("/%s:%v", metricTD, m.TD)) // Target Distribution
r.WriteString(fmt.Sprintf("/%s:%v", metricCR, m.CR)) // Confidentiality Requirement
r.WriteString(fmt.Sprintf("/%s:%v", metricIR, m.IR)) // Integrity Requirement
r.WriteString(fmt.Sprintf("/%s:%v", metricAR, m.AR)) // Availability Requirement
}
return r.String(), nil
if m.names[metricTD] {
r.WriteString(fmt.Sprintf("/%s:%v", metricTD, m.TD)) // Target Distribution
}
if m.names[metricCR] {
r.WriteString(fmt.Sprintf("/%s:%v", metricCR, m.CR)) // Confidentiality Requirement
}
if m.names[metricIR] {
r.WriteString(fmt.Sprintf("/%s:%v", metricIR, m.IR)) // Integrity Requirement
}
if m.names[metricAR] {
r.WriteString(fmt.Sprintf("/%s:%v", metricAR, m.AR)) // Availability Requirement
}
return r.String(), m.GetError()
}

// String is stringer method.
Expand Down
16 changes: 12 additions & 4 deletions v2/metric/metric_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func TestValidationBase(t *testing.T) {
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:", err: cvsserr.ErrInvalidVector},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/:", err: cvsserr.ErrInvalidVector},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/X:X", err: cvsserr.ErrNotSupportMetric},
{vec: "AV:N/AC:H/Au:M/C:C/I:N", err: cvsserr.ErrNoMetrics},
{vec: "AV:N/AC:H/Au:M/C:C/I:N", err: cvsserr.ErrNoBaseMetrics},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:0", err: cvsserr.ErrInvalidValue},
{vec: "AV:N/AC:H/Au:M/C:C/I:0/A:C", err: cvsserr.ErrInvalidValue},
{vec: "AV:N/AC:H/Au:M/C:0/I:N/A:C", err: cvsserr.ErrInvalidValue},
Expand All @@ -40,11 +40,12 @@ func TestValidationTemporal(t *testing.T) {
}{
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:U/RL:ND/RC:", err: cvsserr.ErrInvalidVector},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:U/RL:ND/:", err: cvsserr.ErrInvalidVector},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:U/RL:ND", err: cvsserr.ErrNoMetrics},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:U/RL:ND/X:X", err: cvsserr.ErrNotSupportMetric},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:U/RL:ND/RC:0", err: cvsserr.ErrInvalidValue},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:U/RL:0/RC:ND", err: cvsserr.ErrInvalidValue},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:0/RL:ND/RC:ND", err: cvsserr.ErrInvalidValue},
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:U/RL:ND", err: cvsserr.ErrNoTemporalMetrics},
{vec: "AV:N/AC:L/Au:N/C:N/I:N/E:U/RL:ND/RC:ND", err: cvsserr.ErrNoBaseMetrics},
{vec: "AV:N/AC:L/Au:N/C:N/I:N/A:C/E:U/RL:ND/RC:ND", err: nil},
}

Expand All @@ -71,8 +72,9 @@ func TestValidationEnvironmental(t *testing.T) {
{vec: "AV:N/AC:H/Au:M/C:C/I:N/A:C/E:U/RL:ND/RC:ND/CDP:0/TD:H/CR:M/IR:M/AR:H", err: cvsserr.ErrInvalidValue},
{vec: "av:n/ac:l/au:n/c:n/i:n/a:c/e:u/rl:nd/rc:nd/cdp:h/td:h/cr:m/ir:m/ar:h", err: cvsserr.ErrNotSupportMetric},
{vec: "AV:N/AC:L/AU:N/C:N/I:N/A:C/E:U/RL:ND/RC:ND/CDP:H/TD:H/CR:M/IR:M/AR:H", err: cvsserr.ErrNotSupportMetric},
{vec: "AV:N/AC:L/Au:N/C:N/I:N/A:C/E:U/RL:ND/RC:ND/CDP:H/TD:H/CR:M/IR:M", err: cvsserr.ErrNoMetrics},
{vec: "AV:N/AC:L/Au:N/C:N/I:N/A:C/E:U/RL:ND/CDP:H/TD:H/CR:M/IR:M/AR:H", err: cvsserr.ErrNoMetrics},
{vec: "AV:N/AC:L/Au:N/C:N/I:N/A:C/E:U/RL:ND/RC:ND/CDP:H/TD:H/CR:M/IR:M", err: cvsserr.ErrNoEnvironmentalMetrics},
{vec: "AV:N/AC:L/Au:N/C:N/I:N/A:C/E:U/RL:ND/CDP:H/TD:H/CR:M/IR:M/AR:H", err: cvsserr.ErrNoTemporalMetrics},
{vec: "AV:N/AC:L/Au:N/C:N/I:N/E:U/RL:ND/RC:ND/CDP:H/TD:H/CR:M/IR:M/AR:H", err: cvsserr.ErrNoBaseMetrics},
{vec: "AV:N/AC:L/Au:N/C:N/I:N/A:C/E:U/RL:ND/RC:ND/CDP:H/TD:H/CR:M/IR:M/AR:H", err: nil},
}

Expand Down Expand Up @@ -169,6 +171,9 @@ func TestBaseTemporalScore(t *testing.T) {
if got := m.Score(); got != tt.temp {
t.Errorf("Metrics.Score() = %v, want %v", got, tt.temp)
}
if got := m.String(); tt.vector != got {
t.Errorf("Metrics.String() = %v, want %v", got, tt.temp)
}
}
})
}
Expand Down Expand Up @@ -219,6 +224,9 @@ func TestEnvEnvironmentalScore(t *testing.T) {
if got := m.Score(); got != tt.env {
t.Errorf("Metrics.EnvironmentalScore() = %v, want %v", got, tt.temp)
}
if got := m.String(); tt.vector != got {
t.Errorf("Metrics.String() = %v, want %v", got, tt.temp)
}
}

})
Expand Down
23 changes: 12 additions & 11 deletions v2/metric/temporal.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,36 +99,37 @@ func (m *Temporal) decodeOne(str string) error {
// GetError returns error instance if undefined metric
func (m *Temporal) GetError() error {
if m == nil {
return errs.Wrap(cvsserr.ErrNoMetrics)
return errs.Wrap(cvsserr.ErrNoTemporalMetrics)
}
if err := m.Base.GetError(); err != nil {
return errs.Wrap(err)
}
switch true {
case !m.E.IsValid(), !m.RL.IsValid(), !m.RC.IsValid():
return errs.Wrap(cvsserr.ErrNoMetrics)
return errs.Wrap(cvsserr.ErrNoTemporalMetrics)
default:
return nil
}
}

// Encode returns CVSSv2 vector string
func (m *Temporal) Encode() (string, error) {
if err := m.GetError(); err != nil {
return "", err
}
bs, err := m.Base.Encode()
if err != nil {
return "", errs.Wrap(err)
if m == nil {
return "", errs.Wrap(cvsserr.ErrNoBaseMetrics)
}
bs, _ := m.Base.Encode()
r := &strings.Builder{}
r.WriteString(bs) //Vector of Base metrics
if m.names[metricE] || m.names[metricRL] || m.names[metricRC] {
r.WriteString(fmt.Sprintf("/%s:%v", metricE, m.E)) // Exploitability
if m.names[metricE] {
r.WriteString(fmt.Sprintf("/%s:%v", metricE, m.E)) // Exploitability
}
if m.names[metricRL] {
r.WriteString(fmt.Sprintf("/%s:%v", metricRL, m.RL)) // Remediation Level
}
if m.names[metricRC] {
r.WriteString(fmt.Sprintf("/%s:%v", metricRC, m.RC)) // Report Conf
}
return r.String(), nil
return r.String(), m.GetError()
}

// String is stringer method.
Expand Down
54 changes: 37 additions & 17 deletions v3/metric/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,32 +139,52 @@ func (bm *Base) decodeOne(str string) error {
// GetError returns error instance if undefined metric
func (bm *Base) GetError() error {
if bm == nil {
return errs.Wrap(cvsserr.ErrNoMetrics)
return errs.Wrap(cvsserr.ErrNoBaseMetrics)
}
switch true {
case bm.Ver == VUnknown, bm.AV.IsUnknown(), bm.AC.IsUnknown(), bm.PR.IsUnknown(), bm.UI.IsUnknown(), bm.S.IsUnknown(), bm.C.IsUnknown(), bm.I.IsUnknown(), bm.A.IsUnknown():
return errs.Wrap(cvsserr.ErrNoMetrics)
case bm.Ver == VUnknown:
return errs.Wrap(cvsserr.ErrNotSupportVer)
case bm.AV.IsUnknown(), bm.AC.IsUnknown(), bm.PR.IsUnknown(), bm.UI.IsUnknown(), bm.S.IsUnknown(), bm.C.IsUnknown(), bm.I.IsUnknown(), bm.A.IsUnknown():
return errs.Wrap(cvsserr.ErrNoBaseMetrics)
default:
return nil
}
}

// Encode returns CVSSv3 vector string
func (bm *Base) Encode() (string, error) {
if err := bm.GetError(); err != nil {
return "", err
}
r := &strings.Builder{}
r.WriteString(fmt.Sprintf("%v:%v", nameCVSS, bm.Ver)) //CVSS Version
r.WriteString(fmt.Sprintf("/%v:%v", metricAV, bm.AV)) //Attack Vector
r.WriteString(fmt.Sprintf("/%v:%v", metricAC, bm.AC)) //Attack Complexity
r.WriteString(fmt.Sprintf("/%v:%v", metricPR, bm.PR)) //Privileges Required
r.WriteString(fmt.Sprintf("/%v:%v", metricUI, bm.UI)) //User Interaction
r.WriteString(fmt.Sprintf("/%v:%v", metricS, bm.S)) //Scope
r.WriteString(fmt.Sprintf("/%v:%v", metricC, bm.C)) //Confidentiality Impact
r.WriteString(fmt.Sprintf("/%v:%v", metricI, bm.I)) //Integrity Impact
r.WriteString(fmt.Sprintf("/%v:%v", metricA, bm.A)) //Availability Impact
return r.String(), nil
if bm == nil {
return "", errs.Wrap(cvsserr.ErrNoBaseMetrics)
}
r := []string{}
if bm.Ver != VUnknown {
r = append(r, fmt.Sprintf("%v:%v", nameCVSS, bm.Ver)) //CVSS Version
}
if bm.names[metricAV] {
r = append(r, fmt.Sprintf("%v:%v", metricAV, bm.AV)) //Attack Vector
}
if bm.names[metricAC] {
r = append(r, fmt.Sprintf("%v:%v", metricAC, bm.AC)) //Attack Complexity
}
if bm.names[metricPR] {
r = append(r, fmt.Sprintf("%v:%v", metricPR, bm.PR)) //Privileges Required
}
if bm.names[metricUI] {
r = append(r, fmt.Sprintf("%v:%v", metricUI, bm.UI)) //User Interaction
}
if bm.names[metricS] {
r = append(r, fmt.Sprintf("%v:%v", metricS, bm.S)) //Scope
}
if bm.names[metricC] {
r = append(r, fmt.Sprintf("%v:%v", metricC, bm.C)) //Confidentiality Impact
}
if bm.names[metricI] {
r = append(r, fmt.Sprintf("%v:%v", metricI, bm.I)) //Integrity Impact
}
if bm.names[metricA] {
r = append(r, fmt.Sprintf("%v:%v", metricA, bm.A)) //Availability Impact
}
return strings.Join(r, "/"), bm.GetError()
}

// String is stringer method.
Expand Down
7 changes: 5 additions & 2 deletions v3/metric/base_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func TestDecodeError(t *testing.T) {
{vector: "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:0/A:H", err: cvsserr.ErrInvalidValue},
{vector: "CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H/A:H", err: cvsserr.ErrSameMetric},
{vector: "CVSS:2.0/AV:P/AC:H/PR:H/UI:R/S:U/C:N/I:N/A:N", err: cvsserr.ErrNotSupportVer},
{vector: "CVSS:3.1", err: cvsserr.ErrNoMetrics},
{vector: "CVSS:3.1", err: cvsserr.ErrNoBaseMetrics},
{vector: "CVSS3.1/AV:X/AC:H/PR:H/UI:R/S:U/C:N/I:N/A:N", err: cvsserr.ErrInvalidVector},
{vector: "CVSS:3.1/AV:P/AC:H/PR:H/UI:R/S:U/C:N/I:N/A-N", err: cvsserr.ErrInvalidVector},
{vector: "CVSS:3.1/AV:P/AC:H/PR:H/UI:R/S:U/C:N/I:N/A:", err: cvsserr.ErrInvalidVector},
Expand Down Expand Up @@ -90,7 +90,7 @@ func TestScore(t *testing.T) {
score float64
severity Severity
}{
{vector: "CVSS:3.0/AV:P/AC:H/PR:H/UI:R/S:U/C:N/I:N/A:X", score: 0.0, severity: SeverityNone}, //error
{vector: "CVSS:3.0/AV:P/AC:H/PR:H/UI:R/S:U/C:N/I:N", score: 0.0, severity: SeverityNone}, //error
//CVSSv3.0
{vector: "CVSS:3.0/AV:P/AC:H/PR:H/UI:R/S:U/C:N/I:N/A:N", score: 0.0, severity: SeverityNone}, //Zero metrics
{vector: "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N", score: 7.5, severity: SeverityHigh}, //CVE-2015-8252
Expand Down Expand Up @@ -142,6 +142,9 @@ func TestScore(t *testing.T) {
for _, tc := range testCases {
m, _ := NewBase().Decode(tc.vector)
score := m.Score()
if got := m.String(); got != tc.vector {
t.Errorf("String() = %v, want %v.", got, tc.vector)
}
if score != tc.score {
t.Errorf("Score(%s) = %v, want %v.", tc.vector, score, tc.score)
}
Expand Down
16 changes: 8 additions & 8 deletions v3/metric/environmental.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,31 +170,31 @@ func (em *Environmental) decodeOne(str string) error {
// GetError returns error instance if undefined metric
func (em *Environmental) GetError() error {
if em == nil {
return errs.Wrap(cvsserr.ErrNoMetrics)
return errs.Wrap(cvsserr.ErrNoEnvironmentalMetrics)
}
if err := em.Temporal.GetError(); err != nil {
return errs.Wrap(err)
}
switch true {
case !em.CR.IsValid(), !em.IR.IsValid(), !em.AR.IsValid(), !em.MAV.IsValid(), !em.MAC.IsValid(), !em.MPR.IsValid(), !em.MUI.IsValid(),
!em.MS.IsValid(), !em.MC.IsValid(), !em.MI.IsValid(), !em.MA.IsValid():
return errs.Wrap(cvsserr.ErrUndefinedMetric)
return errs.Wrap(cvsserr.ErrInvalidValue)
default:
return nil
}
}

// Encode returns CVSSv3 vector string
func (em *Environmental) Encode() (string, error) {
if err := em.GetError(); err != nil {
return "", errs.Wrap(err)
if em == nil {
return "", errs.Wrap(cvsserr.ErrNoEnvironmentalMetrics)
}
bs, err := em.Temporal.Encode()
if err != nil {
if err := em.GetError(); err != nil {
return "", errs.Wrap(err)
}
ts, _ := em.Temporal.Encode()
r := &strings.Builder{}
r.WriteString(bs) //Vector of Temporal metrics
r.WriteString(ts) //Vector of Temporal metrics
r.WriteString(fmt.Sprintf("/%v:%v", metricCR, em.CR)) //Confidentiality Requirement
r.WriteString(fmt.Sprintf("/%v:%v", metricIR, em.IR)) //Integrity Requirement
r.WriteString(fmt.Sprintf("/%v:%v", metricAR, em.AR)) //Availability Requirement
Expand All @@ -206,7 +206,7 @@ func (em *Environmental) Encode() (string, error) {
r.WriteString(fmt.Sprintf("/%v:%v", metricMC, em.MC)) //Modified Confidentiality Impact
r.WriteString(fmt.Sprintf("/%v:%v", metricMI, em.MI)) //Modified Integrity Impact
r.WriteString(fmt.Sprintf("/%v:%v", metricMA, em.MA)) //Modified Availability Impact
return r.String(), nil
return r.String(), em.GetError()
}

// String is stringer method.
Expand Down
2 changes: 1 addition & 1 deletion v3/metric/environmental_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func TestEnvironmentalScore(t *testing.T) {
}{
{vector: "XXXX:3.1/AV:A/AC:H/PR:L/UI:N/S:C/C:L/I:H/A:L/E:P/RL:O/RC:U/CR:L/IR:M/AR:L/MAV:P/MAC:L/MPR:L/MUI:R/MS:C/MC:H/MI:H/MA:H", err: cvsserr.ErrInvalidVector, score: 0, sav: SeverityNone},
{vector: "CVSS:1.0/S:U/AV:N/AC:L/PR:H/UI:N/C:L/I:L/A:N", err: cvsserr.ErrNotSupportVer, score: 0, sav: SeverityNone},
{vector: "CVSS:3.0/AV:N/AC:L/PR:H/UI:N/C:L/I:L/A:N", err: cvsserr.ErrNoMetrics, score: 0, sav: SeverityNone},
{vector: "CVSS:3.0/AV:N/AC:L/PR:H/UI:N/C:L/I:L/A:N", err: cvsserr.ErrNoBaseMetrics, score: 0, sav: SeverityNone},
{vector: "CVSS:3.0/S:U/AV:N/AC:L/PR:H/UI:N/C:L/I:L/X:N", err: cvsserr.ErrNotSupportMetric, score: 0, sav: SeverityNone},
{vector: "CVSS:3.1/AV:A/AC:H/PR:L/UI:N/S:C/C:H/I:L/A:L/RC:", err: cvsserr.ErrInvalidVector, score: 0, sav: SeverityNone},
{vector: "CVSS:3.1/AV:A/AC:H/PR:L/UI:N/S:C/C:H/I:L/A:L/MC:", err: cvsserr.ErrInvalidVector, score: 0, sav: SeverityNone},
Expand Down
Loading

0 comments on commit 808b26d

Please # to comment.