private static void Validate(string license, DateTime releaseDate, string projectNamespace) { if (license == null || projectNamespace == null) { throw new InvalidLicenseException("License and project namespace cannot be null or empty"); } var licenseParts = license.Trim().Split('-'); if (licenseParts.Length != 2) { throw new InvalidLicenseException("License text is invalid"); } var licenseIdData = licenseParts[0]; var licenseDetailsData = licenseParts[1]; int licenseId; if (!int.TryParse(licenseIdData, NumberStyles.Integer, CultureInfo.InvariantCulture, out licenseId)) { throw new InvalidLicenseException("License text is invalid"); } byte[] licenseAsBytes; try { licenseAsBytes = Convert.FromBase64String(licenseDetailsData); } catch { throw new InvalidLicenseException("License text is invalid"); } var stream = new MemoryStream(licenseAsBytes, SigningDataLength, licenseAsBytes.Length - SigningDataLength); var parsedLicenseDetails = new StreamReader(stream).ReadToEnd(); var parsedLicenseParts = parsedLicenseDetails.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (parsedLicenseParts.Length != 6) { throw new InvalidLicenseException("License details are invalid"); } DateTime expiryDate; if (!DateTime.TryParseExact(parsedLicenseParts[1], "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out expiryDate)) { throw new InvalidLicenseException("License expiry date is invalid"); } int parsedLicenseId; if (!int.TryParse(parsedLicenseParts[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out parsedLicenseId)) { throw new InvalidLicenseException("License ID is invalid"); } var licenseDetails = new LicenseDetails { Id = parsedLicenseId, ExpiryDate = expiryDate, User = parsedLicenseParts[2], InformationDetails = parsedLicenseParts[3], Type = parsedLicenseParts[4], NamespacePrefix = parsedLicenseParts[5] }; var parsedSigningData = licenseDetails.GetSignificateData(); var cryptoProvider = new RSACryptoServiceProvider(1024) { PersistKeyInCsp = false }; cryptoProvider.ImportCspBlob(Convert.FromBase64String(PublicKey)); var signingData = new byte[SigningDataLength]; Array.Copy(licenseAsBytes, signingData, SigningDataLength); if (!cryptoProvider.VerifyData(parsedSigningData, SHA1.Create(), signingData)) { throw new InvalidLicenseException("License text does not match signature"); } if (licenseDetails.Id != licenseId) { throw new InvalidLicenseException("License ID does not match signature license ID"); } if (licenseDetails.ExpiryDate < releaseDate) { throw new InvalidLicenseException($"License is not valid for this version of My Tested ASP.NET Core MVC. License expired on {licenseDetails.ExpiryDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}. This version of My Tested ASP.NET Core MVC was released on {releaseDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}"); } if (licenseDetails.NamespacePrefix != "." && !projectNamespace.StartsWith(licenseDetails.NamespacePrefix)) { throw new InvalidLicenseException($"License is not valid for '{projectNamespace}' test project"); } if (licenseDetails.Type == LicenseType.Internal) { throw new InvalidLicenseException("License is for internal use only"); } registeredLicenses.Add(licenseDetails); }
private static void Validate(string license, DateTime releaseDate, string projectNamespace) { if (license == null || projectNamespace == null) { throw new InvalidLicenseException("License and project namespace cannot be null or empty"); } var licenseParts = license.Trim().Split('-'); if (licenseParts.Length != 2) { throw new InvalidLicenseException("License text is invalid"); } var licenseIdData = licenseParts[0]; var licenseDetailsData = licenseParts[1]; int licenseId; if (!int.TryParse(licenseIdData, NumberStyles.Integer, CultureInfo.InvariantCulture, out licenseId)) { throw new InvalidLicenseException("License text is invalid"); } byte[] licenseAsBytes; try { licenseAsBytes = Convert.FromBase64String(licenseDetailsData); } catch { throw new InvalidLicenseException("License text is invalid"); } var stream = new MemoryStream(licenseAsBytes, SigningDataLength, licenseAsBytes.Length - SigningDataLength); var parsedLicenseDetails = new StreamReader(stream).ReadToEnd(); var parsedLicenseParts = parsedLicenseDetails.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (parsedLicenseParts.Length != 6) { throw new InvalidLicenseException("License details are invalid"); } DateTime expiryDate; if (!DateTime.TryParseExact(parsedLicenseParts[1], "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out expiryDate)) { throw new InvalidLicenseException("License expiry date is invalid"); } int parsedLicenseId; if (!int.TryParse(parsedLicenseParts[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out parsedLicenseId)) { throw new InvalidLicenseException("License ID is invalid"); } var licenseDetails = new LicenseDetails { Id = parsedLicenseId, ExpiryDate = expiryDate, User = parsedLicenseParts[2], InformationDetails = parsedLicenseParts[3], Type = parsedLicenseParts[4], NamespacePrefix = parsedLicenseParts[5] }; var parsedSigningData = licenseDetails.GetSignificateData(); var cryptoProvider = new RSACryptoServiceProvider(1024) { PersistKeyInCsp = false }; cryptoProvider.ImportCspBlob(Convert.FromBase64String(PublicKey)); var signingData = new byte[SigningDataLength]; Array.Copy(licenseAsBytes, signingData, SigningDataLength); if (!cryptoProvider.VerifyData(parsedSigningData, SHA1.Create(), signingData)) { throw new InvalidLicenseException("License text does not match signature"); } if (licenseDetails.Id != licenseId) { throw new InvalidLicenseException("License ID does not match signature license ID"); } if (licenseDetails.ExpiryDate < releaseDate) { throw new InvalidLicenseException($"License is not valid for this version of My Tested ASP.NET Core MVC. License expired on {licenseDetails.ExpiryDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}. This version of My Tested ASP.NET Core MVC was released on {releaseDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}"); } if (licenseDetails.NamespacePrefix != "." && !projectNamespace.StartsWith(licenseDetails.NamespacePrefix)) { throw new InvalidLicenseException($"License is not valid for '{projectNamespace}' test project"); } if (licenseDetails.Type == LicenseType.Internal) { throw new InvalidLicenseException("License is for internal use only"); } registeredLicenses.Add(licenseDetails); }