using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; using Newtonsoft.Json.Linq; using SXLibrary; using Newtonsoft.Json; namespace MOKA_Factory_Tools { public class Keyinfo { public byte keyType { get; set; } = 0x00; public string keyValue { get; set; } = ""; } /// /// 用于EEPROM key生成 /// class Countkey { /// /// EepromKey的Key类型; /// public static Dictionary gKeydict = new Dictionary { { "mac", new Keyinfo{ keyType = 0x00 } }, { "did", new Keyinfo{ keyType = 0x01 } }, { "hdcp", new Keyinfo{ keyType =0x04 } }, { "hdcp22", new Keyinfo{ keyType =0x05 } }, { "widi", new Keyinfo{ keyType =0x05 } }, { "esn", new Keyinfo{ keyType =0x07 } }, { "widevine", new Keyinfo{ keyType =0x08 } }, { "cikey", new Keyinfo{ keyType =0x09 } }, { "attestation", new Keyinfo{ keyType =0x0E }}, { "mgk", new Keyinfo{ keyType =0x0F } }, { "playready", new Keyinfo{ keyType =0x10 }} }; /// /// 字节数组转16进制字符串 /// /// /// private static string byteToHexStr(byte[] bytes) { string returnStr = ""; if (bytes != null) { for (int i = 0; i < bytes.Length; i++) { returnStr += bytes[i].ToString("X2"); } } return returnStr; } public static bool Countfile(string path, string Type, out string result, out int num) { result = null; num = 0; DirectoryInfo getfile = new DirectoryInfo(path); foreach (FileInfo file in getfile.GetFiles()) { num += 1; switch (Type) { case "MAC": { if (file.Length != 6) { result = file.FullName.ToString() + "length don't match MAC 6 byte rules"; return false; } break; } case "DID": { if (file.Length != 40) { result = file.FullName.ToString() + "length don't match DID 40 byte rules"; return false; } break; } case "ESN": { if (file.Length != 140) { result = file.FullName.ToString() + "length don't match ESN 140 byte rules"; return false; } break; } case "burning key": { if (file.Length != 224) { result = file.FullName.ToString() + "length don't match burning key 224 byte rules"; return false; } break; } default: { result = "Can find the key type"; break; } } } return true; } static byte[] head1 = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x06 }; static byte[] head2 = { 0x01, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x28 }; static byte[] head3 = { 0x07, 0x00, 0x00, 0x00, 0x54, 0x00, 0x8C }; static byte[] FirstAddress = { 0x00, 0x00, 0x00, 0x26 }; public static bool Conver2Dirct(string keys, out int countNotEmpty, out Dictionary Keydict, out string keyinfo) { keyinfo = ""; Keydict = new Dictionary() { { "mac", new Keyinfo{ keyType = 0x00 } }, { "did", new Keyinfo{ keyType = 0x01 } }, { "hdcp", new Keyinfo{ keyType =0x04 } }, { "hdcp22", new Keyinfo{ keyType =0x05 } }, { "widi", new Keyinfo{ keyType =0x05 } }, { "esn", new Keyinfo{ keyType =0x07 } }, { "widevine", new Keyinfo{ keyType =0x08 } }, { "cikey", new Keyinfo{ keyType =0x09 } }, { "attestation", new Keyinfo{ keyType =0x0E }}, { "mgk", new Keyinfo{ keyType =0x0F } }, { "playready", new Keyinfo{ keyType =0x10 }} }; countNotEmpty = 0; try { Dictionary dict = JsonConvert.DeserializeObject>(keys); foreach (var item in dict) { if (Keydict.ContainsKey(item.Key)) { if (item.Key.Equals("mac")) Keydict[item.Key].keyValue = item.Value.Replace("-", ""); else { if ( item.Key.Equals("did")) Keydict[item.Key].keyValue = byteToHexStr(Encoding.ASCII.GetBytes(item.Value)); else Keydict[item.Key].keyValue = item.Value; } if (item.Value.Length > 0) { keyinfo += item.Key+";"; countNotEmpty++; } } } } catch (Exception ex) { Log.WriteErrorLog("\r\n合成EEPROM KEY失败:\r\n" + ex.Message); return false; } return true; } public static bool CreateEEPROMKey(string keys, string order, out string keyinfo, out string error) { error = ""; keyinfo = ""; int countNotEmpty; Dictionary Keydict; if (!Conver2Dirct(keys, out countNotEmpty, out Keydict, out keyinfo)) return false; if (Keydict.ContainsKey("widi") && Keydict.ContainsKey("hdcp22")) { if (Keydict["widi"].keyValue.Length > 0 && Keydict["widi"].keyValue.Length > 0) { error = "Key包里面同时包含HDCP22和WiDikey,请检查!"; return false; } } try { int LengthIndex = 0x00; int AddressIndex = 5 + 11 * countNotEmpty; List eepromKeyInfo = new List(); List eepromKeyData = new List(); eepromKeyInfo.Add((byte)countNotEmpty); foreach (var Item in Keydict) { byte[] _Keydata = null; byte[] _KeyCRC = null; byte[] _KeyLength = { 0x00 }; byte[] _KeyAddress = { 0x00 }; if (Item.Value.keyValue.Length > 0) { _Keydata = SerialInit.HexToByte(Item.Value.keyValue); _KeyCRC = BitConverter.GetBytes(CRC32.GetCRC32(_Keydata)); Array.Reverse(_KeyCRC); eepromKeyInfo.Add(Item.Value.keyType);//添加类型 _KeyAddress = BitConverter.GetBytes(AddressIndex + LengthIndex); Array.Reverse(_KeyAddress); eepromKeyInfo.AddRange(_KeyAddress); _KeyLength = CommonMethod.InttoBytelist(_Keydata.Length); if (_KeyLength.Length == 1) _KeyLength = new byte[2] { 0x00, _KeyLength[0] }; eepromKeyInfo.AddRange(_KeyLength); eepromKeyInfo.AddRange(_KeyCRC); eepromKeyData.AddRange(_Keydata); LengthIndex = _Keydata.Length; AddressIndex = CommonMethod.BytelisttoInt(_KeyAddress); } } // 计算eepromKeyInfo的crc byte[] headfile = new byte[eepromKeyInfo.Count]; eepromKeyInfo.CopyTo(headfile); byte[] WholeCrc = BitConverter.GetBytes(CRC32.GetCRC32(headfile)); Array.Reverse(WholeCrc); eepromKeyInfo.AddRange(WholeCrc); byte[] bytekeydata = new byte[eepromKeyData.Count]; eepromKeyData.CopyTo(bytekeydata); eepromKeyInfo.AddRange(bytekeydata); byte[] burningkey = new byte[eepromKeyInfo.Count]; eepromKeyInfo.CopyTo(burningkey); Savefile(burningkey, order, Keydict["mac"].keyValue + Keydict["did"].keyValue); return true; } catch(Exception ex) { Log.WriteErrorLog("\r\n合成EEPROM KEY失败:\r\n" + ex.Message); return false; } } public static void Savefile(byte[] data, string order, string filename) { if (Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"\burningkey\" + order) == false) { Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"\burningkey\" + order); } FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + @"\burningkey\" + order + @"\" + filename, FileMode.Create); fs.Write(data, 0, data.Length); fs.Close(); } } /// /// 用于生成FireTV key /// class FireTVkey { public static bool CreateFireTVKeys(string keys, string order, out string error) { try { error = ""; JObject jObject = JObject.Parse(keys); string Mac = jObject["mac"].Value().Replace("-", ""); string WifiMac = jObject["wifimac"].Value().Replace("-", ""); string BTMac = jObject["btmac"].Value().Replace("-", ""); string HDCP = jObject["hdcp"].Value().Trim(); string HDCP22 = jObject["hdcp22"].Value().Trim(); string Widevine = jObject["widevine"].Value().Trim(); //byte[] bytedata = SerialInit.HexToByte(data); if (Mac.Trim().Length > 0) { string path = AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\MAC\\MAC"; CommonMethod.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\MAC"); if (!LocalTxtRecord.LocalRecord(Mac, path)) return false; } if (WifiMac.Trim().Length > 0) { string path = AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\WifiMac\\WifiMac"; CommonMethod.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\WifiMac"); if (!LocalTxtRecord.LocalRecord(WifiMac, path)) return false; } if (BTMac.Trim().Length > 0) { string path = AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\BTMac\\BTMac"; CommonMethod.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\BTMac"); if (!LocalTxtRecord.LocalRecord(BTMac, path)) return false; } if (HDCP.Trim().Length > 0) { string path = AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\HDCP\\" + GetMD5.GetStrMd5(HDCP); CommonMethod.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\HDCP"); if (!CommonMethod.GetCreateHexkey(path, HDCP, out error)) return false; } if (HDCP22.Trim().Length > 0) { string path = AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\HDCP22\\" + GetMD5.GetStrMd5(HDCP22); CommonMethod.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\HDCP22"); if (!CommonMethod.GetCreateHexkey(path, HDCP22, out error)) return false; } if (Widevine.Trim().Length > 0) { string path = AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\Widevine\\" + GetMD5.GetStrMd5(Widevine); CommonMethod.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "\\burningkey\\" + order + "\\Widevine"); if (!CommonMethod.GetCreateHexkey(path, Widevine, out error)) return false; } return true; } catch (Exception ex) { error = ex.Message; return false; } } } }