public CvssV3(string vector) { vector = vector.Trim('/', ' '); if (!vector.StartsWith(VectorPrefix)) { throw new ArgumentException($"Vector must begin with prefix \"{VectorPrefix}\"", nameof(vector)); } var metricParts = vector.Split('/').Skip(1); var metricRegex = new Regex("[A-Za-z]+:[A-Za-z]{1}"); var parsedMetrics = new List <string>(); foreach (var metricVector in metricParts) { if (!metricRegex.IsMatch(metricVector)) { throw new ArgumentException($"Invalid vector-part \"{metricVector}\"", nameof(vector)); } var kv = metricVector.Split(':'); var value = kv[1]; var key = kv[0].ToUpperInvariant(); parsedMetrics.Add(key); switch (key) { case "AV": AttackVector = EnumParser.AttackVector(value); break; case "AC": AttackComplexity = EnumParser.AttackComplexity(value); break; case "PR": PrivilegesRequired = EnumParser.PrivilegesRequired(value); break; case "UI": UserInteraction = EnumParser.UserInteraction(value); break; case "S": Scope = EnumParser.Scope(value); break; case "C": ConfidentialityImpact = EnumParser.Impact(value, "C"); break; case "I": IntegrityImpact = EnumParser.Impact(value, "I"); break; case "A": AvailabilityImpact = EnumParser.Impact(value, "A"); break; case "E": ExploitCodeMaturity = EnumParser.ExploitCodeMaturity(value); break; case "RL": RemediationLevel = EnumParser.RemediationLevel(value); break; case "RC": ReportConfidence = EnumParser.ReportConfidence(value); break; case "CR": ConfidentialityRequirement = EnumParser.SecurityRequirement(value, "CR"); break; case "IR": IntegrityRequirement = EnumParser.SecurityRequirement(value, "IR"); break; case "AR": AvailabilityRequirement = EnumParser.SecurityRequirement(value, "AR"); break; case "MAV": ModifiedAttackVector = EnumParser.Modified(value, "MAV", EnumParser.AttackVector); break; case "MAC": ModifiedAttackComplexity = EnumParser.Modified(value, "MAC", EnumParser.AttackComplexity); break; case "MPR": ModifiedPrivilegesRequired = EnumParser.Modified(value, "MPR", EnumParser.PrivilegesRequired); break; case "MUI": ModifiedUserInteraction = EnumParser.Modified(value, "MUI", EnumParser.UserInteraction); break; case "MS": ModifiedScope = EnumParser.Modified(value, "MS", EnumParser.Scope); break; case "MC": ModifiedConfidentialityImpact = EnumParser.Modified(value, "MC", EnumParser.Impact); break; case "MI": ModifiedIntegrityImpact = EnumParser.Modified(value, "MI", EnumParser.Impact); break; case "MA": ModifiedAvailabilityImpact = EnumParser.Modified(value, "MA", EnumParser.Impact); break; } } CheckRequiredMetrics(parsedMetrics); CalculateScores(); }