aboutsummaryrefslogtreecommitdiff
path: root/cvss
diff options
context:
space:
mode:
Diffstat (limited to 'cvss')
-rw-r--r--cvss/calc.go80
1 files changed, 80 insertions, 0 deletions
diff --git a/cvss/calc.go b/cvss/calc.go
new file mode 100644
index 0000000..7f22249
--- /dev/null
+++ b/cvss/calc.go
@@ -0,0 +1,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
+}