1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
package cvss
// Calculated scores
type CalcScores struct {
Base float32 `json:"base,omitempty"`
Temporal float32 `json:"temp,omitempty"`
Env float32 `json:"env,omitempty"`
}
// Calculated severities
type CalcSeverities struct {
Base string `json:"base,omitempty"`
Temporal string `json:"temp,omitempty"`
Env string `json:"env,omitempty"`
}
// Row returned by Calc().
type CalcRow struct {
// Input string
String string `json:"string"`
// vector error
Error string `json:"error,omitempty"`
// CVSS version
Version string `json:"version,omitempty"`
// CVSS scores
Scores CalcScores `json:"scores,omitempty"`
// severities
Severities CalcSeverities `json:"severities,omitempty"`
}
// Parse CVSS vector strings and extract the relevant attributes.
func Calc(args []string) []CalcRow {
rows := make([]CalcRow, len(args))
for i, s := range(args) {
// parse vector
if vec, err := NewVector(s); err != nil {
// parse failed
rows[i] = CalcRow {
String: s,
Error: err.Error(),
}
} else {
// parse scores
if scores, err := vec.Scores(); err != nil {
// parse scores failed
rows[i] = CalcRow {
String: s,
Error: err.Error(),
Version: vec.Version().String(),
}
} else {
// parse scores succeeded, add to results
rows[i] = CalcRow {
String: s,
Version: vec.Version().String(),
Scores: CalcScores {
Base: scores.Base.Float(),
Temporal: scores.Temporal.Float(),
Env: scores.Env.Float(),
},
Severities: CalcSeverities {
Base: scores.Base.Severity().String(),
Temporal: scores.Temporal.Severity().String(),
Env: scores.Env.Severity().String(),
},
}
}
}
}
// return results
return rows
}
|