aboutsummaryrefslogtreecommitdiff
path: root/cvss/calc.go
blob: 7f222492562f98d8419fe30faa3ca31b86f44c4e (plain)
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
}