public static void Main(string[] args) { var p = new OptionSet() { { "name=", "the name of the person requesting the license", v => _name = v }, // Mandatory { "email=", "the email address of the person requesting the license", v => _email = v }, // Mandatory { "company=", "the company name of the person requesting the license", v => _company = v }, // Mandatory { "expiry=", "the license expiry date in yyyy-mm-dd format", v => _expires = v }, // Mandatory { "?|help", "display this help and exit", v => _showHelp = true }, // Optional }; // Process the command-line arguments List <string> options; try { options = p.Parse(args); } catch (OptionException e) { System.Console.Write("keygen: "); System.Console.WriteLine(e.Message); System.Console.WriteLine("Try `keygen --help' for more information."); return; } // Command line option "--help" if (_showHelp) { ShowHelp(p); return; } // Check that the mandatory input arguments were specified. if (_name == null || _email == null || _company == null || _expires == null) { Console.WriteLine("You did not specify all the arguments. Try `keygen --help' for more information."); return; } /* ---------- PROCESS EXPIRY DATE ---------- */ // Parse the input date. try { _expiryDate = DateTime.ParseExact(_expires, "yyyy-MM-dd", CultureInfo.InvariantCulture); } catch { Console.WriteLine("Invalid expiry date format. Date must be in yyyy-mm-dd format."); return; } // If the expiry date is in the past, then throw an error. DateTime currentDate = DateTime.Now; if (_expiryDate.CompareTo(currentDate) == -1) { // -1 is earlier Console.WriteLine("Expiry date cannot be in the past."); return; } /* ---------- PRIVATE KEY ---------- */ string privateKeyFile = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\private.key"; if (File.Exists(privateKeyFile) == false) { Console.WriteLine("Could not find \"private.key\". This file is needed to generate a license key."); return; } string privateKey = File.ReadAllText(privateKeyFile); /* ---------- CREATE LICENSE TEMPLATE ---------- */ // This is mostly a cut-and-paste from \SoftActivate Licensing SDK Standard\samples\CS\KeyGenCS // Note that the template will have to be duplicated in the C++ code that checks the key. // This is a demo key. Replace this key with your purchased key. SDKRegistration.SetLicenseKey("SLDMX-3GK7N-NRZKM-5SECA-TV25K"); // The license key template specifies what the license key will look like, what data will it contain and // how secure the license key will be. KeyTemplate tmpl = new KeyTemplate(); tmpl.NumberOfGroups = 6; tmpl.CharactersPerGroup = 5; tmpl.Encoding = LicenseKeyEncoding.Base32X; tmpl.GroupSeparator = "-"; tmpl.DataSize = 30; // the license keys will hold 30 bits of data tmpl.SignatureSize = 120; // 120 bits = ((characters per group * number of groups) * bits per character) - //data size ; 120 = ((6 * 5) * 5) - 30 tmpl.ValidationDataSize = 100 * 8; // If the field size (as specified in the template) is smaller than the // data size, the data is truncated to fit the field. // Set the private key used to generate the license keys. This is previously obtained by a call to // LicenseKeyTemplate.GenerateSigningKeyPair(). tmpl.SetPrivateKey(privateKey); // TODO: replace demo key "w9Oz5xMOwkYv" in file with real key. tmpl.SetPublicKey("doxzyMNu7n46whM="); // needed to check that the license generated successfully. // Define the data portion of the license key. Keep in mind that the field names are not included in the // license keys. Only the field values are included. // Add a 14-bit field specifying the product expiration date, between 1/1/2010 and 12/31/2041 tmpl.AddDataField("ExpirationDate", // field name LicenseKeyFieldType.Integer, // field is regarded as an integer 14, // field is 14 bits long (4 bits for month, 5 bits for day, 5 bits for year) 0 // field starts at position 0 in license key data bits ); tmpl.AddValidationField("Name", LicenseKeyFieldType.String, 40 * 8, 0); tmpl.AddValidationField("Company", LicenseKeyFieldType.String, 20 * 8, 40); tmpl.AddValidationField("Email", LicenseKeyFieldType.String, 40 * 8, 80); // create a key generator based on the template above KeyGenerator keyGen = new KeyGenerator(tmpl); /* ---------- ADD LICENSE PROPERTIES AND GENERATE KEY ---------- */ // add an expiration date for this license key int packedDate = PackDate(_expiryDate); keyGen.SetKeyData("ExpirationDate", packedDate); keyGen.SetValidationData("Name", _name); keyGen.SetValidationData("Company", _company); keyGen.SetValidationData("Email", _email); // now generate the license key string licenseKey = keyGen.GenerateKey(); /* ---------- CHECK THE GENERATED KEY ---------- */ // validate the generated key. This sequence of code is also used in the actual product to validate the // entered license key KeyValidator keyVal = new KeyValidator(tmpl); keyVal.SetKey(licenseKey); keyVal.SetValidationData("Name", _name); // the key will not be valid if you set a different user name than the one you have set at key generation keyVal.SetValidationData("Company", _company); keyVal.SetValidationData("Email", _email); if (keyVal.IsKeyValid()) { Console.WriteLine("\nThe generated license key is: " + licenseKey); // now read the expiration date from the license key int expirationDate = keyVal.QueryIntKeyData("ExpirationDate"); Console.WriteLine("The expiration date is " + UnpackDate(expirationDate).ToString("MMMM dd, yyyy")); _licenseXml = new XElement("license", new XElement("name", _name), new XElement("company", _company), new XElement("email", _email), new XElement("key", licenseKey), new XElement("expires", _expires) ); Console.WriteLine(_licenseXml.ToString()); } else { Console.WriteLine("Error creating/validating license key !\n"); } return; }