private void btnValidateLicense_Click(object sender, EventArgs e)
        {
            LicenseInformation info = LicenseEncryption.Decrypt(txtLicense.Text, txtPublicKey.Text);

            txtProduct.Text    = info.Product;
            txtExpiration.Text = info.Expiration.HasValue ? info.Expiration.Value.ToString("yyyy-MM-dd HH:mm:ss") : "never";
            txtIsValid.Text    = info.IsValid.ToString();
        }
        internal static LicenseInformation Decrypt(string license, string publicKey)
        {
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                rsa.PersistKeyInCsp = false;
                rsa.FromXmlString(publicKey);

                var doc = XDocument.Parse(license);
                if (doc.Root.Name != "license")
                {
                    throw new Exception("Invalid XML root: " + doc.Root.Name);
                }

                string product          = doc.Root.Attribute("product").Value;
                string expirationString = doc.Root.Attribute("expires").Value;
                string signatureText    = doc.Root.Attribute("signature").Value;
                byte[] signature        = Convert.FromBase64String(signatureText);

                DateTime?expiration;
                if (expirationString == "never")
                {
                    expiration = null;
                }
                else
                {
                    expiration = DateTime.Parse(expirationString);
                }

                LicenseInformation info = new LicenseInformation
                {
                    Product    = product,
                    Expiration = expiration
                };

                byte[] sourceBytes = GetSourceBytes(product, expiration);

                info.IsValid = rsa.VerifyData(sourceBytes, CryptoConfig.MapNameToOID("SHA512"), signature);

                return(info);
            }
        }