Example #1
0
        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();
        }