diff --git a/server/biz/KeyFactory.cs b/server/biz/KeyFactory.cs
index 63c57d0..87af5fc 100644
--- a/server/biz/KeyFactory.cs
+++ b/server/biz/KeyFactory.cs
@@ -240,7 +240,7 @@ namespace Sockeye.Biz
- public static string GenFetchCode()
+ private static string GenFetchCode()
{
//sufficient for this purpose
@@ -304,7 +304,7 @@ namespace Sockeye.Biz
/// This is called by both regular and trial license key routes
///
///
- private static void genKey(License l)
+ internal static void GenerateAndSetV7Key(License l)
{
StringBuilder sbKey = new StringBuilder();
diff --git a/server/biz/LicenseBiz.cs b/server/biz/LicenseBiz.cs
index c9f9c6f..a063464 100644
--- a/server/biz/LicenseBiz.cs
+++ b/server/biz/LicenseBiz.cs
@@ -492,19 +492,15 @@ namespace Sockeye.Biz
}
switch(l.PGroup){
- case ProductGroup.RavenPerpetual:
- {
-
- }
- break;
+ case ProductGroup.RavenPerpetual:
case ProductGroup.RavenSubscription:
{
-
+ RavenKeyFactory.GenerateAndSetRavenKey(l);
}
break;
case ProductGroup.AyaNova7:
{
-
+ KeyFactory.GenerateAndSetV7Key(l);
}
break;
}
diff --git a/server/biz/RavenKeyFactory.cs b/server/biz/RavenKeyFactory.cs
index 559e714..7c42b26 100644
--- a/server/biz/RavenKeyFactory.cs
+++ b/server/biz/RavenKeyFactory.cs
@@ -6,6 +6,7 @@ using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.OpenSsl;
using Sockeye.Util;
+using Sockeye.Models;
@@ -41,217 +42,379 @@ namespace Sockeye.Biz
//This feature name means it's a trial key
private const string TRIAL_FEATURE_NAME = "TrialMode";
+ ///
+ /// RAVEN key generator
+ ///
+ ///
+ internal static void GenerateAndSetRavenKey(License l)
+ {
+ if (string.IsNullOrWhiteSpace(l.RegTo))
+ throw new ArgumentException("RegisteredTo is required", "RegisteredTo");
+ if (string.IsNullOrWhiteSpace(l.DbId))
+ throw new ArgumentException("DBId is required", "DbId");
+
+ //license serial number
+ var vv = Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
+ string sId = vv.ToString();
+ if (sId.Contains(","))
+ sId = sId.Split('.')[0];
+
+ StringBuilder sbKey = new StringBuilder();
+ StringWriter sw = new StringWriter(sbKey);
+
+ using (Newtonsoft.Json.JsonWriter w = new Newtonsoft.Json.JsonTextWriter(sw))
+ {
+ w.Formatting = Newtonsoft.Json.Formatting.Indented;
+
+ //outer object start
+ w.WriteStartObject();
+
+ w.WritePropertyName("Key");
+
+ w.WriteStartObject();//start of key object
+
+ w.WritePropertyName("LicenseFormat");
+ w.WriteValue("8");
+
+ w.WritePropertyName("Id");
+ w.WriteValue(sId);
+
+ w.WritePropertyName("RegisteredTo");
+ w.WriteValue(l.RegTo);
+
+ w.WritePropertyName("DBID");
+ w.WriteValue(l.DbId);
+
+ w.WritePropertyName("Perpetual");
+ w.WriteValue(l.PGroup == ProductGroup.RavenPerpetual);
+
+ w.WritePropertyName("LicenseExpiration");
+ w.WriteValue(l.LicenseExpire);
+
+ w.WritePropertyName("MaintenanceExpiration");
+ w.WriteValue(l.MaintenanceExpire);
+
+ //FEATURES
+ w.WritePropertyName("Features");
+ w.WriteStartArray();
+
+ if (l.TrialMode)
+ {
+ w.WriteStartObject();
+ w.WritePropertyName("Name");
+ w.WriteValue(TRIAL_FEATURE_NAME);
+ w.WriteEndObject();
+ }
+
+ //USERS
+ w.WriteStartObject();
+ w.WritePropertyName("Name");
+ w.WriteValue(ACTIVE_INTERNAL_USERS_FEATURE_NAME);
+ w.WritePropertyName("Count");
+ w.WriteValue(l.Users);
+ w.WriteEndObject();
+
+ if (l.PGroup == ProductGroup.RavenSubscription)
+ {
+ //CUSTOMER USERS
+ w.WriteStartObject();
+ w.WritePropertyName("Name");
+ w.WriteValue(ACTIVE_CUSTOMER_USERS_FEATURE_NAME);
+ w.WritePropertyName("Count");
+ w.WriteValue(l.CustomerUsers);
+ w.WriteEndObject();
+
+ //MAX DATA GB
+ w.WriteStartObject();
+ w.WritePropertyName("Name");
+ w.WriteValue(MAXIMUM_DATA_GB_FEATURE_NAME);
+ w.WritePropertyName("Count");
+ w.WriteValue(l.MaxDataGB);
+ w.WriteEndObject();
+
+ }
+
+ //end of features array
+ w.WriteEnd();
+
+ //End of "Key" property
+ w.WriteEndObject();
+
+ //close outer 'wrapper' object brace }
+ w.WriteEndObject();
+
+ }//end of using statement
+
+
+ // ## CALCULATE SIGNATURE
+
+ //GET JSON as a string with whitespace stripped outside of delimited strings
+ //http://stackoverflow.com/questions/8913138/minify-indented-json-string-in-net
+ string keyNoWS = System.Text.RegularExpressions.Regex.Replace(sbKey.ToString(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1");
+
+
+ //**** Note this is our real 2016 private key
+ var privatePEM = @"-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAz7wrvLDcKVMZ31HFGBnLWL08IodYIV5VJkKy1Z0n2snprhSi
+u3izxTyz+SLpftvKHJpky027ii7l/pL9Bo3JcjU5rKrxXavnE7TuYPjXn16dNLd0
+K/ERSU+pXLmUaVN0nUWuGuUMoGJMEXoulS6pJiG11yu3BM9fL2Nbj0C6a+UwzEHF
+mns3J/daZOb4gAzMUdJfh9OJ0+wRGzR8ZxyC99Na2gDmqYglUkSMjwLTL/HbgwF4
+OwmoQYJBcET0Wa6Gfb17SaF8XRBV5ZtpCsbStkthGeoXZkFriB9c1eFQLKpBYQo2
+DW3H1MPG2nAlQZLbkJj5cSh7/t1bRF08m6P+EQIDAQABAoIBAQCGvTpxLRXgB/Kk
+EtmQBEsMx9EVZEwZeKIqKuDsBP8wvf4/10ql5mhT6kehtK9WhSDW5J2z8DtQKZMs
+SBKuCZE77qH2CPp9E17SPWzQoRbaW/gDlWpYhgf8URs89XH5zxO4XtXKw/4omRlV
+zLYiNR2pifv0EHqpOAg5KGzewdEo4VgXgtRWpHZLMpH2Q0/5ZIKMhstI6vFHP1p7
+jmU4YI6uxiu7rVrZDmIUsAGoTdMabNqK/N8hKaoBiIto0Jn1ck26g+emLg8m160y
+Xciu5yFUU+PP1SJMUs+k1UnAWf4p46X9jRLQCBRue9o0Ntiq/75aljRoDvgdwDsR
+mg4ZANqxAoGBAPBoM5KoMZ4sv8ZFv8V+V8hgL5xiLgGoiwQl91mRsHRM/NQU5A/w
+tH8nmwUrJOrksV7kX9228smKmoliTptyGGyi1NPmSkA7cN9YYnENoOEBHCVNK9vh
+P+bkbMYUDNMW4fgOj09oXtQtMl5E2B3OTGoNwZ2w13YQJ8RIniLPsX7nAoGBAN01
+eQNcUzQk9YrFGTznOs8udDLBfigDxaNnawvPueulJdBy6ZXDDrKmkQQA7xxl8YPr
+dNtBq2lOgnb6+smC15TaAfV/fb8BLmkSwdn4Fy0FApIXIEOnLq+wjkte98nuezl8
+9KXDzaqNI9hPuk2i36tJuLLMH8hzldveWbWjSlRHAoGBAKRPE7CQtBjfjNL+qOta
+RrT0yJWhpMANabYUHNJi+K8ET2jEPnuGkFa3wwPtUPYaCABLJhprB9Unnid3wTIM
+8RSO1ddd9jGgbqy3w9Bw+BvQnmQAMpG9iedNB+r5mSpM4XSgvuIO+4EYwuwbMXpt
+nVx+um4Eh75xnDxTRYGVYkLRAoGAaZVpUlpR+HSfooHbPv+bSWKB4ewLPCw4vHrT
+VErtEfW8q9b9eRcmP81TMFcFykc6VN4g47pfh58KlKHM7DwAjDLWdohIy89TiKGE
+V3acEUfv5y0UoFX+6ara8Ey+9upWdKUY3Lotw3ckoc3EPeQ84DQK7YSSswnAgLaL
+mS/8fWcCgYBjRefVbEep161d2DGruk4X7eNI9TFJ278h6ydW5kK9aTJuxkrtKIp4
+CYf6emoB4mLXFPvAmnsalkhN2iB29hUZCXXSUjpKZrpijL54Wdu2S6ynm7aT97NF
+oArP0E2Vbow3JMxq/oeXmHbrLMLQfYyXwFmciLFigOtkd45bfHdrbA==
+-----END RSA PRIVATE KEY-----";
+
+ PemReader pr = new PemReader(new StringReader(privatePEM));
+ AsymmetricCipherKeyPair keys = (AsymmetricCipherKeyPair)pr.ReadObject();
+ var encoder = new UTF8Encoding(false, true);
+ var inputData = encoder.GetBytes(keyNoWS);
+ var signer = SignerUtilities.GetSigner("SHA256WITHRSA");
+ signer.Init(true, keys.Private);
+ signer.BlockUpdate(inputData, 0, inputData.Length);
+ var sign = signer.GenerateSignature();
+ var signature = Convert.ToBase64String(sign);
+
+ System.Text.StringBuilder sbOut = new StringBuilder();
+ sbOut.AppendLine("[KEY");
+ sbOut.AppendLine(sbKey.ToString());
+ sbOut.AppendLine("KEY]");
+ sbOut.AppendLine("[SIGNATURE");
+ sbOut.AppendLine(signature);
+ sbOut.AppendLine("SIGNATURE]");
+
+ l.Key = sbOut.ToString();
+
+ }
+
+
+ #region old stuff
#region license classes
- //DTO object returned on license query
- public class LicenseFeature
- {
- //name of feature / product
- public string Feature { get; set; }
+ // //DTO object returned on license query
+ // public class LicenseFeature
+ // {
+ // //name of feature / product
+ // public string Feature { get; set; }
- //Optional count for items that require it
- public long Count { get; set; }
+ // //Optional count for items that require it
+ // public long Count { get; set; }
- }
+ // }
- //DTO object for parsed key
- internal class AyaNovaLicenseKey
- {
- public AyaNovaLicenseKey()
- {
- Features = new List();
- RegisteredTo = UNLICENSED_TOKEN;
- //Id = RegisteredTo;
- LicenseFormat = "8";
+ // //DTO object for parsed key
+ // internal class AyaNovaLicenseKey
+ // {
+ // public AyaNovaLicenseKey()
+ // {
+ // Features = new List();
+ // RegisteredTo = UNLICENSED_TOKEN;
+ // //Id = RegisteredTo;
+ // LicenseFormat = "8";
- var vv = Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
- string sId = vv.ToString();
- if (sId.Contains(","))
- sId = sId.Split('.')[0];
- Id = sId;
- }
+ // var vv = Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
+ // string sId = vv.ToString();
+ // if (sId.Contains(","))
+ // sId = sId.Split('.')[0];
+ // Id = sId;
+ // }
- public override string ToString()
- {
+ // public override string ToString()
+ // {
- System.Text.StringBuilder sb = new StringBuilder();
- sb.AppendLine($"Registered to: {RegisteredTo}");
- sb.AppendLine($"Database id: {DbId}");
- sb.AppendLine($"Type: {(Perpetual ? "Perpetual" : "Subscription")}");
- if (WillExpire)
- sb.AppendLine($"Available for use until: {LicenseExpiration.ToLongDateString()}");
- if (Perpetual)
- sb.AppendLine($"Support and updates available until: {MaintenanceExpiration.ToLongDateString()}");
- foreach (LicenseFeature f in Features)
- {
- if (f.Feature == TRIAL_FEATURE_NAME)
- {
- sb.AppendLine("Temporary license for evaluation");
- continue;
- }
+ // System.Text.StringBuilder sb = new StringBuilder();
+ // sb.AppendLine($"Registered to: {RegisteredTo}");
+ // sb.AppendLine($"Database id: {DbId}");
+ // sb.AppendLine($"Type: {(Perpetual ? "Perpetual" : "Subscription")}");
+ // if (WillExpire)
+ // sb.AppendLine($"Available for use until: {LicenseExpiration.ToLongDateString()}");
+ // if (Perpetual)
+ // sb.AppendLine($"Support and updates available until: {MaintenanceExpiration.ToLongDateString()}");
+ // foreach (LicenseFeature f in Features)
+ // {
+ // if (f.Feature == TRIAL_FEATURE_NAME)
+ // {
+ // sb.AppendLine("Temporary license for evaluation");
+ // continue;
+ // }
- //default for items added later not tokenized
- if (f.Count > 0)
- sb.AppendLine($"{f.Feature}: {f.Count}");
- else
- sb.AppendLine($"{f.Feature}");
- }
- return sb.ToString();
- }
+ // //default for items added later not tokenized
+ // if (f.Count > 0)
+ // sb.AppendLine($"{f.Feature}: {f.Count}");
+ // else
+ // sb.AppendLine($"{f.Feature}");
+ // }
+ // return sb.ToString();
+ // }
- public bool IsEmpty
- {
- get
- {
- //Key is empty if it's not registered to anyone or there are no features in it
- return string.IsNullOrWhiteSpace(RegisteredTo) || (Features == null || Features.Count == 0);
- }
- }
+ // public bool IsEmpty
+ // {
+ // get
+ // {
+ // //Key is empty if it's not registered to anyone or there are no features in it
+ // return string.IsNullOrWhiteSpace(RegisteredTo) || (Features == null || Features.Count == 0);
+ // }
+ // }
- ///
- /// Fetch the license status of the feature in question
- ///
- ///
- /// LicenseFeature object or null if there is no license
- public LicenseFeature GetLicenseFeature(string Feature)
- {
- if (IsEmpty)
- return null;
+ // ///
+ // /// Fetch the license status of the feature in question
+ // ///
+ // ///
+ // /// LicenseFeature object or null if there is no license
+ // public LicenseFeature GetLicenseFeature(string Feature)
+ // {
+ // if (IsEmpty)
+ // return null;
- string lFeature = Feature.ToLowerInvariant();
+ // string lFeature = Feature.ToLowerInvariant();
- foreach (LicenseFeature l in Features)
- {
- if (l.Feature.ToLowerInvariant() == lFeature)
- {
- return l;
- }
- }
- return null;
- }
+ // foreach (LicenseFeature l in Features)
+ // {
+ // if (l.Feature.ToLowerInvariant() == lFeature)
+ // {
+ // return l;
+ // }
+ // }
+ // return null;
+ // }
- ///
- /// Check for the existance of license feature
- ///
- ///
- /// bool
- public bool HasLicenseFeature(string Feature)
- {
- if (IsEmpty)
- return false;
+ // ///
+ // /// Check for the existance of license feature
+ // ///
+ // ///
+ // /// bool
+ // public bool HasLicenseFeature(string Feature)
+ // {
+ // if (IsEmpty)
+ // return false;
- string lFeature = Feature.ToLowerInvariant();
+ // string lFeature = Feature.ToLowerInvariant();
- foreach (LicenseFeature l in Features)
- {
- if (l.Feature.ToLowerInvariant() == lFeature)
- {
- return true;
- }
- }
- return false;
- }
+ // foreach (LicenseFeature l in Features)
+ // {
+ // if (l.Feature.ToLowerInvariant() == lFeature)
+ // {
+ // return true;
+ // }
+ // }
+ // return false;
+ // }
- public bool WillExpire
- {
- get
- {
- return LicenseExpiration < DateUtil.EmptyDateValue;
- }
- }
+ // public bool WillExpire
+ // {
+ // get
+ // {
+ // return LicenseExpiration < DateUtil.EmptyDateValue;
+ // }
+ // }
- public bool LicenseExpired
- {
- get
- {
- return LicenseExpiration > DateTime.Now;
- }
- }
+ // public bool LicenseExpired
+ // {
+ // get
+ // {
+ // return LicenseExpiration > DateTime.Now;
+ // }
+ // }
- public bool MaintenanceExpired
- {
- get
- {
- return MaintenanceExpiration > DateTime.Now;
- }
- }
+ // public bool MaintenanceExpired
+ // {
+ // get
+ // {
+ // return MaintenanceExpiration > DateTime.Now;
+ // }
+ // }
- public bool TrialLicense
- {
- get
- {
- return HasLicenseFeature(TRIAL_FEATURE_NAME);
- }
- }
+ // public bool TrialLicense
+ // {
+ // get
+ // {
+ // return HasLicenseFeature(TRIAL_FEATURE_NAME);
+ // }
+ // }
- public string LicenseFormat { get; set; }
- public string Id { get; set; }
- public string RegisteredTo { get; set; }
- public string DbId { get; set; }
- public bool Perpetual { get; set; }
- public DateTime LicenseExpiration { get; set; }
- public DateTime MaintenanceExpiration { get; set; }
- public List Features { get; set; }
+ // public string LicenseFormat { get; set; }
+ // public string Id { get; set; }
+ // public string RegisteredTo { get; set; }
+ // public string DbId { get; set; }
+ // public bool Perpetual { get; set; }
+ // public DateTime LicenseExpiration { get; set; }
+ // public DateTime MaintenanceExpiration { get; set; }
+ // public List Features { get; set; }
- }
+ // }
#endregion
+ // public static string GetRavenTrialKey(License l)//string dbid, string CompanyName, bool Perpetual)
+ // {
- public static string GetRavenTrialKey(string dbid, string CompanyName, bool Perpetual)
- {
+ // //Build a sample test key, sign it and return it
+ // AyaNovaLicenseKey k = new AyaNovaLicenseKey();
+ // k.LicenseFormat = "8";
+ // k.RegisteredTo = l.RegTo;
+ // k.DbId = l.DbId;
+ // k.Perpetual = l.PGroup == ProductGroup.RavenPerpetual;
- //Build a sample test key, sign it and return it
- AyaNovaLicenseKey k = new AyaNovaLicenseKey();
- k.LicenseFormat = "8";
- k.RegisteredTo = CompanyName;
- k.DbId = dbid;
- k.Perpetual = Perpetual;
+ // //flag as trial key not regular key
+ // k.Features.Add(new LicenseFeature() { Feature = TRIAL_FEATURE_NAME, Count = 0 });
+ // if (k.Perpetual)
+ // {
+ // //trial period time limit
- //flag as trial key not regular key
- k.Features.Add(new LicenseFeature() { Feature = TRIAL_FEATURE_NAME, Count = 0 });
- if (Perpetual)
- {
- //trial period time limit
+ // //Normal code, uncomment this when done testing expiration dates of perpetual
+ // k.MaintenanceExpiration = k.LicenseExpiration = DateTime.UtcNow.AddDays(TRIAL_PERIOD_DAYS);
+ // //Testing code for 3 minute long evaluation license in case need to test with a key that expires
+ // // #warning FYI ROCKFISH is SET TO GENERATE A VERY SHORT TEST KEY
+ // // k.MaintenanceExpiration = k.LicenseExpiration = DateTime.UtcNow.AddMinutes(3); //TEST VALUE FOR DIAGNOSING LICENSE EXPIRATION ISSUES
- //Normal code, uncomment this when done testing expiration dates of perpetual
- k.MaintenanceExpiration = k.LicenseExpiration = DateTime.UtcNow.AddDays(TRIAL_PERIOD_DAYS);
+ // //5k inside staff users will cover huge seeding level easily
+ // k.Features.Add(new LicenseFeature() { Feature = ACTIVE_INTERNAL_USERS_FEATURE_NAME, Count = 5000 });
+ // }
+ // else
+ // {
+ // //SUBSCRIPTION
+ // //trial period time limit
+ // k.MaintenanceExpiration = k.LicenseExpiration = DateTime.UtcNow.AddDays(TRIAL_PERIOD_DAYS);//NOTE: this preserves the current time, should it be set to midnight or something?
- //Testing code for 3 minute long evaluation license in case need to test with a key that expires
- // #warning FYI ROCKFISH is SET TO GENERATE A VERY SHORT TEST KEY
- // k.MaintenanceExpiration = k.LicenseExpiration = DateTime.UtcNow.AddMinutes(3); //TEST VALUE FOR DIAGNOSING LICENSE EXPIRATION ISSUES
-
- //5k inside staff users will cover huge seeding level easily
- k.Features.Add(new LicenseFeature() { Feature = ACTIVE_INTERNAL_USERS_FEATURE_NAME, Count = 5000 });
- }
- else
- {
- //SUBSCRIPTION
- //trial period time limit
- k.MaintenanceExpiration = k.LicenseExpiration = DateTime.UtcNow.AddDays(TRIAL_PERIOD_DAYS);//NOTE: this preserves the current time, should it be set to midnight or something?
-
- //20k customer contacts will cover huge seeding level easily
- //5k inside staff users will cover huge seeding level easily
- k.Features.Add(new LicenseFeature() { Feature = ACTIVE_INTERNAL_USERS_FEATURE_NAME, Count = 5000 });
- k.Features.Add(new LicenseFeature() { Feature = ACTIVE_CUSTOMER_USERS_FEATURE_NAME, Count = 20000 });
- k.Features.Add(new LicenseFeature() { Feature = MAXIMUM_DATA_GB_FEATURE_NAME, Count = 20 });
- }
- return GenerateRavenKey(k);
- }
+ // //20k customer contacts will cover huge seeding level easily
+ // //5k inside staff users will cover huge seeding level easily
+ // k.Features.Add(new LicenseFeature() { Feature = ACTIVE_INTERNAL_USERS_FEATURE_NAME, Count = 5000 });
+ // k.Features.Add(new LicenseFeature() { Feature = ACTIVE_CUSTOMER_USERS_FEATURE_NAME, Count = 20000 });
+ // k.Features.Add(new LicenseFeature() { Feature = MAXIMUM_DATA_GB_FEATURE_NAME, Count = 20 });
+ // }
+ // return GenerateRavenKey(k);
+ // }
// //TESTING ONLY this is for development purposes only
@@ -287,172 +450,7 @@ namespace Sockeye.Biz
// return GenerateRavenKey(k);
// }
-
- ///
- /// RAVEN key generator
- ///
- ///
- internal static string GenerateRavenKey(AyaNovaLicenseKey k)
- {
-
-
- if (string.IsNullOrWhiteSpace(k.RegisteredTo))
- throw new ArgumentException("RegisteredTo is required", "RegisteredTo");
-
- // if (k.DbId == Guid.Empty)
- if (string.IsNullOrWhiteSpace(k.DbId))
- throw new ArgumentException("DBId is required", "RegisteredTo");
-
- try
- {
-
- StringBuilder sbKey = new StringBuilder();
- StringWriter sw = new StringWriter(sbKey);
-
- using (Newtonsoft.Json.JsonWriter w = new Newtonsoft.Json.JsonTextWriter(sw))
- {
- w.Formatting = Newtonsoft.Json.Formatting.Indented;
-
- //outer object start
- w.WriteStartObject();
-
- w.WritePropertyName("Key");
-
- w.WriteStartObject();//start of key object
-
- w.WritePropertyName("LicenseFormat");
- w.WriteValue(k.LicenseFormat);
-
- w.WritePropertyName("Id");
- w.WriteValue(k.Id);
-
- w.WritePropertyName("RegisteredTo");
- w.WriteValue(k.RegisteredTo);
-
- w.WritePropertyName("DBID");
- w.WriteValue(k.DbId);
-
- w.WritePropertyName("Perpetual");
- w.WriteValue(k.Perpetual);
-
- w.WritePropertyName("LicenseExpiration");
- w.WriteValue(k.LicenseExpiration);
-
- w.WritePropertyName("MaintenanceExpiration");
- w.WriteValue(k.MaintenanceExpiration);
-
-
-
- //FEATURES
- // w.WritePropertyName("Features");
- // w.WriteStartObject();
- w.WritePropertyName("Features");
- w.WriteStartArray();
-
- foreach (LicenseFeature lf in k.Features)
- {
-
- w.WriteStartObject();
-
- w.WritePropertyName("Name");
- w.WriteValue(lf.Feature);
-
- if (lf.Count > 0)
- {
- w.WritePropertyName("Count");
- w.WriteValue(lf.Count);
- }
-
- w.WriteEndObject();
-
- }
-
-
- //end of features array
- w.WriteEnd();
-
- //end of features object
- // w.WriteEndObject();
-
- //end of AyaNova/AyaNovaLite key object
- w.WriteEndObject();
-
- //close outer 'wrapper' object brace }
- w.WriteEndObject();
-
- }//end of using statement
-
-
- // ## CALCULATE SIGNATURE
-
- //GET JSON as a string with whitespace stripped outside of delimited strings
- //http://stackoverflow.com/questions/8913138/minify-indented-json-string-in-net
- string keyNoWS = System.Text.RegularExpressions.Regex.Replace(sbKey.ToString(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1");
-
-
- //**** Note this is our real 2016 private key
- var privatePEM = @"-----BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAz7wrvLDcKVMZ31HFGBnLWL08IodYIV5VJkKy1Z0n2snprhSi
-u3izxTyz+SLpftvKHJpky027ii7l/pL9Bo3JcjU5rKrxXavnE7TuYPjXn16dNLd0
-K/ERSU+pXLmUaVN0nUWuGuUMoGJMEXoulS6pJiG11yu3BM9fL2Nbj0C6a+UwzEHF
-mns3J/daZOb4gAzMUdJfh9OJ0+wRGzR8ZxyC99Na2gDmqYglUkSMjwLTL/HbgwF4
-OwmoQYJBcET0Wa6Gfb17SaF8XRBV5ZtpCsbStkthGeoXZkFriB9c1eFQLKpBYQo2
-DW3H1MPG2nAlQZLbkJj5cSh7/t1bRF08m6P+EQIDAQABAoIBAQCGvTpxLRXgB/Kk
-EtmQBEsMx9EVZEwZeKIqKuDsBP8wvf4/10ql5mhT6kehtK9WhSDW5J2z8DtQKZMs
-SBKuCZE77qH2CPp9E17SPWzQoRbaW/gDlWpYhgf8URs89XH5zxO4XtXKw/4omRlV
-zLYiNR2pifv0EHqpOAg5KGzewdEo4VgXgtRWpHZLMpH2Q0/5ZIKMhstI6vFHP1p7
-jmU4YI6uxiu7rVrZDmIUsAGoTdMabNqK/N8hKaoBiIto0Jn1ck26g+emLg8m160y
-Xciu5yFUU+PP1SJMUs+k1UnAWf4p46X9jRLQCBRue9o0Ntiq/75aljRoDvgdwDsR
-mg4ZANqxAoGBAPBoM5KoMZ4sv8ZFv8V+V8hgL5xiLgGoiwQl91mRsHRM/NQU5A/w
-tH8nmwUrJOrksV7kX9228smKmoliTptyGGyi1NPmSkA7cN9YYnENoOEBHCVNK9vh
-P+bkbMYUDNMW4fgOj09oXtQtMl5E2B3OTGoNwZ2w13YQJ8RIniLPsX7nAoGBAN01
-eQNcUzQk9YrFGTznOs8udDLBfigDxaNnawvPueulJdBy6ZXDDrKmkQQA7xxl8YPr
-dNtBq2lOgnb6+smC15TaAfV/fb8BLmkSwdn4Fy0FApIXIEOnLq+wjkte98nuezl8
-9KXDzaqNI9hPuk2i36tJuLLMH8hzldveWbWjSlRHAoGBAKRPE7CQtBjfjNL+qOta
-RrT0yJWhpMANabYUHNJi+K8ET2jEPnuGkFa3wwPtUPYaCABLJhprB9Unnid3wTIM
-8RSO1ddd9jGgbqy3w9Bw+BvQnmQAMpG9iedNB+r5mSpM4XSgvuIO+4EYwuwbMXpt
-nVx+um4Eh75xnDxTRYGVYkLRAoGAaZVpUlpR+HSfooHbPv+bSWKB4ewLPCw4vHrT
-VErtEfW8q9b9eRcmP81TMFcFykc6VN4g47pfh58KlKHM7DwAjDLWdohIy89TiKGE
-V3acEUfv5y0UoFX+6ara8Ey+9upWdKUY3Lotw3ckoc3EPeQ84DQK7YSSswnAgLaL
-mS/8fWcCgYBjRefVbEep161d2DGruk4X7eNI9TFJ278h6ydW5kK9aTJuxkrtKIp4
-CYf6emoB4mLXFPvAmnsalkhN2iB29hUZCXXSUjpKZrpijL54Wdu2S6ynm7aT97NF
-oArP0E2Vbow3JMxq/oeXmHbrLMLQfYyXwFmciLFigOtkd45bfHdrbA==
------END RSA PRIVATE KEY-----";
-
- PemReader pr = new PemReader(new StringReader(privatePEM));
- AsymmetricCipherKeyPair keys = (AsymmetricCipherKeyPair)pr.ReadObject();
- var encoder = new UTF8Encoding(false, true);
- var inputData = encoder.GetBytes(keyNoWS);
- var signer = SignerUtilities.GetSigner("SHA256WITHRSA");
- signer.Init(true, keys.Private);
- signer.BlockUpdate(inputData, 0, inputData.Length);
- var sign = signer.GenerateSignature();
- var signature = Convert.ToBase64String(sign);
-
-
- System.Text.StringBuilder sbOut = new StringBuilder();
- sbOut.AppendLine("[KEY");
- sbOut.AppendLine(sbKey.ToString());
- sbOut.AppendLine("KEY]");
- sbOut.AppendLine("[SIGNATURE");
- sbOut.AppendLine(signature);
- sbOut.AppendLine("SIGNATURE]");
-
-
- return sbOut.ToString();
-
-
- }
- catch (Exception ex)
- {
- return (ex.Message);
- }
- }
-
-
-
-
-
+ #endregion old stuff
//eoc
}