pkg/utils/grafeas.go (208 lines of code) (raw):

// Copyright 2023 Google LLC // // 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 utils import ( "strings" g "google.golang.org/genproto/googleapis/grafeas/v1" ) func ToGrafeasSeverity(s string) g.Severity { if s == "" { return g.Severity_SEVERITY_UNSPECIFIED } switch strings.ToUpper(s) { case "CRITICAL": return g.Severity_CRITICAL case "HIGH": return g.Severity_HIGH case "MEDIUM": return g.Severity_MEDIUM case "LOW": return g.Severity_LOW case "MINOR": return g.Severity_MINIMAL default: return g.Severity_SEVERITY_UNSPECIFIED } } func toCVSSv3AttackVector(v string) g.CVSSv3_AttackVector { switch v { case "N": return g.CVSSv3_ATTACK_VECTOR_NETWORK case "A": return g.CVSSv3_ATTACK_VECTOR_ADJACENT case "L": return g.CVSSv3_ATTACK_VECTOR_LOCAL case "P": return g.CVSSv3_ATTACK_VECTOR_PHYSICAL } return g.CVSSv3_ATTACK_VECTOR_UNSPECIFIED } func toCVSSAttackVector(v string) g.CVSS_AttackVector { switch v { case "N": return g.CVSS_ATTACK_VECTOR_NETWORK case "A": return g.CVSS_ATTACK_VECTOR_ADJACENT case "L": return g.CVSS_ATTACK_VECTOR_LOCAL case "P": return g.CVSS_ATTACK_VECTOR_PHYSICAL } return g.CVSS_ATTACK_VECTOR_UNSPECIFIED } func toCVSSv3AttackComplexity(v string) g.CVSSv3_AttackComplexity { switch v { case "L": return g.CVSSv3_ATTACK_COMPLEXITY_LOW case "H": return g.CVSSv3_ATTACK_COMPLEXITY_HIGH } return g.CVSSv3_ATTACK_COMPLEXITY_UNSPECIFIED } func toCVSSAttackComplexity(v string) g.CVSS_AttackComplexity { switch v { case "L": return g.CVSS_ATTACK_COMPLEXITY_LOW case "H": return g.CVSS_ATTACK_COMPLEXITY_HIGH } return g.CVSS_ATTACK_COMPLEXITY_UNSPECIFIED } func toCVSSv3PrivilegesRequired(v string) g.CVSSv3_PrivilegesRequired { switch v { case "L": return g.CVSSv3_PRIVILEGES_REQUIRED_LOW case "H": return g.CVSSv3_PRIVILEGES_REQUIRED_HIGH case "N": return g.CVSSv3_PRIVILEGES_REQUIRED_NONE } return g.CVSSv3_PRIVILEGES_REQUIRED_UNSPECIFIED } func toCVSSPrivilegesRequired(v string) g.CVSS_PrivilegesRequired { switch v { case "L": return g.CVSS_PRIVILEGES_REQUIRED_LOW case "H": return g.CVSS_PRIVILEGES_REQUIRED_HIGH case "N": return g.CVSS_PRIVILEGES_REQUIRED_NONE } return g.CVSS_PRIVILEGES_REQUIRED_UNSPECIFIED } func toCVSSv3UserInteraction(v string) g.CVSSv3_UserInteraction { switch v { case "N": return g.CVSSv3_USER_INTERACTION_NONE case "R": return g.CVSSv3_USER_INTERACTION_REQUIRED } return g.CVSSv3_USER_INTERACTION_UNSPECIFIED } func toCVSSUserInteraction(v string) g.CVSS_UserInteraction { switch v { case "N": return g.CVSS_USER_INTERACTION_NONE case "R": return g.CVSS_USER_INTERACTION_REQUIRED } return g.CVSS_USER_INTERACTION_UNSPECIFIED } func toCVSSv3Scope(v string) g.CVSSv3_Scope { switch v { case "U": return g.CVSSv3_SCOPE_UNCHANGED case "C": return g.CVSSv3_SCOPE_CHANGED } return g.CVSSv3_SCOPE_UNSPECIFIED } func toCVSSScope(v string) g.CVSS_Scope { switch v { case "U": return g.CVSS_SCOPE_UNCHANGED case "C": return g.CVSS_SCOPE_CHANGED } return g.CVSS_SCOPE_UNSPECIFIED } func toCVSSv3Impact(v string) g.CVSSv3_Impact { switch v { case "H": return g.CVSSv3_IMPACT_HIGH case "L": return g.CVSSv3_IMPACT_LOW case "N": return g.CVSSv3_IMPACT_NONE } return g.CVSSv3_IMPACT_UNSPECIFIED } func toCVSSImpact(v string) g.CVSS_Impact { switch v { case "H": return g.CVSS_IMPACT_HIGH case "L": return g.CVSS_IMPACT_LOW case "N": return g.CVSS_IMPACT_NONE } return g.CVSS_IMPACT_UNSPECIFIED } func ToCVSSv3(baseScore float32, vector string) *g.CVSSv3 { c := g.CVSSv3{ BaseScore: baseScore, } for _, v := range strings.Split(vector, "/") { tokens := strings.Split(v, ":") if len(tokens) != 2 { continue } switch tokens[0] { case "AV": c.AttackVector = toCVSSv3AttackVector(tokens[1]) case "AC": c.AttackComplexity = toCVSSv3AttackComplexity(tokens[1]) case "PR": c.PrivilegesRequired = toCVSSv3PrivilegesRequired(tokens[1]) case "UI": c.UserInteraction = toCVSSv3UserInteraction(tokens[1]) case "S": c.Scope = toCVSSv3Scope(tokens[1]) case "C": c.ConfidentialityImpact = toCVSSv3Impact(tokens[1]) case "I": c.IntegrityImpact = toCVSSv3Impact(tokens[1]) case "A": c.AvailabilityImpact = toCVSSv3Impact(tokens[1]) } } return &c } func ToCVSS(baseScore float32, vector string) *g.CVSS { c := g.CVSS{ BaseScore: baseScore, } for _, v := range strings.Split(vector, "/") { tokens := strings.Split(v, ":") if len(tokens) != 2 { continue } switch tokens[0] { case "AV": c.AttackVector = toCVSSAttackVector(tokens[1]) case "AC": c.AttackComplexity = toCVSSAttackComplexity(tokens[1]) case "PR": c.PrivilegesRequired = toCVSSPrivilegesRequired(tokens[1]) case "UI": c.UserInteraction = toCVSSUserInteraction(tokens[1]) case "S": c.Scope = toCVSSScope(tokens[1]) case "C": c.ConfidentialityImpact = toCVSSImpact(tokens[1]) case "I": c.IntegrityImpact = toCVSSImpact(tokens[1]) case "A": c.AvailabilityImpact = toCVSSImpact(tokens[1]) } } return &c }