public LicenseCriteria Validate(License license, CryptoKey publicKey, IEnumerable <ILicenseValidationRule> validationRules)
        {
            if (license == null)
            {
                throw new ArgumentNullException(nameof(license));
            }
            if (publicKey == null)
            {
                throw new ArgumentNullException(nameof(publicKey));
            }
            if (validationRules == null)
            {
                throw new ArgumentNullException(nameof(validationRules));
            }

            var documentSigning = new DocumentSigning();

            if (!documentSigning.Validate(license.Document, publicKey))
            {
                throw new InvalidLicenseException();
            }

            var serializer      = new LicenseCriteriaSerializer();
            var licenseCriteria = serializer.Deserialize(license.Document);

            var exceptions = new List <Exception>();

            foreach (var rule in validationRules)
            {
                try
                {
                    rule.Validate(licenseCriteria);
                }
                catch (Exception exception)
                {
                    exceptions.Add(exception);
                }
            }

            if (exceptions.Count > 0)
            {
                throw new AggregateException(exceptions);
            }

            return(licenseCriteria);
        }
        public License Generate(CryptoKey privateKey, LicenseCriteria licenseCriteria)
        {
            if (privateKey == null)
            {
                throw new ArgumentNullException(nameof(privateKey));
            }
            if (licenseCriteria == null)
            {
                throw new ArgumentNullException(nameof(licenseCriteria));
            }

            var serializer = new LicenseCriteriaSerializer();
            var document   = serializer.Serialize(licenseCriteria);

            var documentSigning = new DocumentSigning();

            documentSigning.Sign(document, privateKey);

            return(new License(document));
        }