using System; using System.Text; using System.IO; using HidSharp; using System.Linq; using System.Threading; using System.Runtime.InteropServices; //公共函数说明 //***查找加密锁 //int FindPort(int start, ref string OutKeyPath); //查找指定的加密锁(使用普通算法一) //int FindPort_2(int start, int in_data, int verf_data, ref string OutKeyPath); //***获到锁的版本 //int NT_GetIDVersion(ref short version, string KeyPath); //获到锁的扩展版本 //int NT_GetIDVersionEx(ref short version, string KeyPath); //***获到锁的ID //int GetID(ref int id_1, ref int id_2, string KeyPath); //***从加密锁中读取一批字节 //int YReadEx(Byte[] OutData, short Address, short mylen, string HKey, string LKey, string KeyPath); //***从加密锁中读取一个字节数据,一般不使用 //int YRead(ref Byte OutData, short Address,string HKey, string LKey, string KeyPath); //***写一批字节到加密锁中 //int YWriteEx(Byte[] InData, short Address, short mylen, string HKey, string LKey, string KeyPath); //***写一个字节的数据到加密锁中,一般不使用 //int YWrite(Byte InData, short Address, string HKey, string LKey, string KeyPath); //***从加密锁中读字符串 //int YReadString(ref string outstring, short Address, short mylen, string HKey, string LKey, string KeyPath); //***写字符串到加密锁中 //int YWriteString(string InString, short Address, string HKey, string LKey, string KeyPath); //***算法函数 //int sWriteEx(int in_data , ref int out_data , string KeyPath); //int sWrite_2Ex(int in_data , ref int out_data ,string KeyPath); //int sRead(ref int in_data, string KeyPath); //int sWrite(int out_data, string KeyPath); //int sWrite_2(int out_data, string KeyPath); //***设置写密码 //int SetWritePassword(string W_HKey, string W_LKey, string new_HKey, string new_LKey, string KeyPath); //***设置读密码 //int SetReadPassword(string W_HKey, string W_LKey, string new_HKey, string new_LKey, string KeyPath); //'设置增强算法密钥一 //int SetCal_2(string Key , string KeyPath); //使用增强算法一对字符串进行加密 //int EncString(string InString , ref string outstring , string KeyPath); //使用增强算法一对二进制数据进行加密 // int Cal(Byte[] InBuf, Byte[] OutBuf, string KeyPath); //'设置增强算法密钥二 //int SetCal_New(string Key , string KeyPath); //使用增强算法二对字符串进行加密 //int EncString_New(string InString , ref string outstring , string KeyPath); //使用增强算法二对二进制数据进行加密 // int Cal_New(Byte[] InBuf, Byte[] OutBuf, string KeyPath); //***初始化加密锁函数 //int ReSet( string Path); //***获取字符串长度 //int lstrlenA(string InString ); namespace SoftKey { public class F2K { #region Fields private const ushort VID = 0x3689; private const ushort PID = 0x3689; private const ushort PID_NEW = 0X4040; private const ushort VID_NEW = 0X3689; private const ushort PID_NEW_2 = 0X4040; private const ushort VID_NEW_2 = 0X2020; private const short DIGCF_PRESENT = 0x2; private const short DIGCF_DEVICEINTERFACE = 0x10; private const short INVALID_HANDLE_VALUE = (-1); private const short ERROR_NO_MORE_ITEMS = 259; private const uint GENERIC_READ = 0x80000000; private const int GENERIC_WRITE = 0x40000000; private const uint FILE_SHARE_READ = 0x1; private const uint FILE_SHARE_WRITE = 0x2; private const uint OPEN_EXISTING = 3; private const uint FILE_ATTRIBUTE_NORMAL = 0x80; private const uint INFINITE = 0xFFFF; private const short MAX_LEN = 2031; public const int FAILEDGENKEYPAIR = -21; public const int FAILENC = -22; public const int FAILDEC = -23; public const int FAILPINPWD = -24; public const int USBStatusFail = -50; //USB操作失败,可能是没有找到相关的指令 private const int FUNCTION_LENGTH_NAME_MORE_THEN_25 = -79; private const int NOUSBKEY = -92; private const int CANNOT_OPEN_BIN_FILE = -8017; private const int CAN_NOT_READ_FILE = -8026; private const int OVER_KEY_LEN = 8025; private const int OVER_BIND_SIZE = -8035; //绑定电脑的数据超过最大绑定值 public const int SM2_ADDBYTE = 97; //加密后的数据会增加的长度 public const int MAX_ENCLEN = 128; //最大的加密长度分组 public const int MAX_DECLEN = (MAX_ENCLEN + SM2_ADDBYTE); //最大的解密长度分组 public const int SM2_USENAME_LEN = 80; // '最大的用户名长度 public const int ECC_MAXLEN = 32; public const int PIN_LEN = 16; private const Byte GETVERSION = 0x01; private const Byte GETID = 0x02; private const Byte GETVEREX = 0x05; private const Byte CAL_TEA = 0x08; private const Byte SET_TEAKEY = 0x09; private const Byte READBYTE = 0x10; private const Byte WRITEBYTE = 0x11; private const Byte YTREADBUF = 0x12; private const Byte YTWRITEBUF = 0x13; private const Byte MYRESET = 0x20; private const Byte YTREBOOT = 0x24; private const Byte SET_ECC_PARA = 0x30; private const Byte GET_ECC_PARA = 0x31; private const Byte SET_ECC_KEY = 0x32; private const Byte GET_ECC_KEY = 0x33; private const Byte MYENC = 0x34; private const Byte MYDEC = 0X35; private const Byte SET_PIN = 0X36; private const Byte GEN_KEYPAIR = 0x37; private const Byte YTSIGN = 0x51; private const Byte YTVERIFY = 0x52; private const Byte GET_CHIPID = 0x53; private const Byte YTSIGN_2 = 0x53; //D8定义 private const Byte MAX_KEY_LEN = 16; private const Byte MAX_FUNNAME = 25; private const Byte MAX_BUF_SIZE = 255; private const Byte DOWNLOAD_SIZE = (MAX_BUF_SIZE - 1 - 1 - 1); //一个字节长度,一个字节命令,一个字节报告 private const Byte TRANSFER_VAR_SIZE = (MAX_BUF_SIZE - 1 - 1 - 4); //一个字节长度,一个字节命令,一个字节报告,4个字节内存起始地址 private const Byte GETDATA_BUF_SIZE = (MAX_BUF_SIZE - 2 - 1 - 1); //2个字节错误码,1个字节长度是否完成,一个字节为多出来的 private const Byte VERF_CODE_SIZE = 8; private const byte NEW_PWD_LEN = 9; private const byte NEW_EPROM_TRANSFER_SIZE = (MAX_BUF_SIZE - (1 + 1 + sizeof(short) + 1 + 2 * NEW_PWD_LEN)); //一个字节报告,一个字节命令,二个字节地址,一个字节长度,2*9个字节密码, private const Byte MAX_BIND_MAC_SIZE = 200; private const Byte GET_LIMIT_DATE = 0x71; private const Byte SET_LIMIT_DATE = 0x72; private const Byte GET_USER_ID = 0x73; private const Byte GET_LEAVE_NUMBER = 0x74; private const Byte CHECK_NUMBER = 0x75; private const Byte SET_NUMBER_AUTH = 0x76; private const Byte SET_BIND_AUTH = 0x77; private const Byte SET_DATE_AUTH = 0x78; private const Byte CHECK_DATE = 0x79; private const Byte CHECK_BIND = 0x7A; private const Byte GET_LEAVE_DAYS = 0x7B; private const Byte GET_BIND_INFO = 0x7C; private const Byte YTDOWNLOAD = 0x80; private const Byte START_DOWNLOAD = 0x81; private const Byte RUN_FUNCTION = 0x82; private const Byte SET_VAR = 0x84; private const Byte GET_VAR = 0x85; private const Byte SET_DOWNLOAD_KEY = 0x86; private const Byte OPEN_KEY = 0x87; private const Byte CLOSE_KEY = 0x88; private const Byte COUNTINU_RUNCTION = 0x89; private const Byte GET_API_PARAM = 0x8A; private const Byte SET_API_PARAM = 0x8B; private const Byte GETFUNCVER = 0x8C; private const Byte WRITE_NEW_EPROM = 0x8D; private const Byte READ_NEW_EPROM = 0x8E; private const Byte SET_PWD = 0x8F; private UInt16 UInt16 = sizeof(UInt16); public int MAX_TIMEOUT = 5; #endregion //以下函数用于将字节数组转化为宽字符串 public static string ByteConvertString(Byte[] buffer) { char[] null_string = { '\0', '\0' }; System.Text.Encoding encoding = System.Text.Encoding.Default; return encoding.GetString(buffer).TrimEnd(null_string); } //以下用于将16进制字符串转化为无符号长整型 private uint HexToInt(string s) { string[] hexch = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" }; s = s.ToUpper(); int i, j; int r, n, k; string ch; k = 1; r = 0; for (i = s.Length; i > 0; i--) { ch = s.Substring(i - 1, 1); n = 0; for (j = 0; j < 16; j++) if (ch == hexch[j]) n = j; r += (n * k); k *= 16; } return unchecked((uint)r); } private int HexStringToByteArray(string InString, ref Byte[] b) { return HexStringToByteArrayEx(InString, ref b, 0); } private int HexStringToByteArrayEx(string InString, ref Byte[] b, int pos) { int nlen; int retutn_len; int n, i; string temp; nlen = InString.Length; if (nlen < 16) retutn_len = 16; retutn_len = nlen / 2; i = 0; for (n = 0; n < nlen; n = n + 2) { temp = InString.Substring(n, 2); b[i + pos] = (Byte)HexToInt(temp); i = i + 1; } return retutn_len; } public void EnCode(Byte[] inb, Byte[] outb, string Key) { UInt32 cnDelta, y, z, a, b, c, d, temp_2; UInt32[] buf = new UInt32[16]; int n, i, nlen; UInt32 sum; //UInt32 temp, temp_1; string temp_string; cnDelta = 2654435769; sum = 0; nlen = Key.Length; i = 0; for (n = 1; n <= nlen; n = n + 2) { temp_string = Key.Substring(n - 1, 2); buf[i] = HexToInt(temp_string); i = i + 1; } a = 0; b = 0; c = 0; d = 0; for (n = 0; n <= 3; n++) { a = (buf[n] << (n * 8)) | a; b = (buf[n + 4] << (n * 8)) | b; c = (buf[n + 4 + 4] << (n * 8)) | c; d = (buf[n + 4 + 4 + 4] << (n * 8)) | d; } y = 0; z = 0; for (n = 0; n <= 3; n++) { temp_2 = inb[n]; y = (temp_2 << (n * 8)) | y; temp_2 = inb[n + 4]; z = (temp_2 << (n * 8)) | z; } n = 32; while (n > 0) { sum = cnDelta + sum; /*temp = (z << 4) & 0xFFFFFFFF; temp = (temp + a) & 0xFFFFFFFF; temp_1 = (z + sum) & 0xFFFFFFFF; temp = (temp ^ temp_1) & 0xFFFFFFFF; temp_1 = (z >> 5) & 0xFFFFFFFF; temp_1 = (temp_1 + b) & 0xFFFFFFFF; temp = (temp ^ temp_1) & 0xFFFFFFFF; temp = (temp + y) & 0xFFFFFFFF; y = temp & 0xFFFFFFFF;*/ y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); /*temp = (y << 4) & 0xFFFFFFFF; temp = (temp + c) & 0xFFFFFFFF; temp_1 = (y + sum) & 0xFFFFFFFF; temp = (temp ^ temp_1) & 0xFFFFFFFF; temp_1 = (y >> 5) & 0xFFFFFFFF; temp_1 = (temp_1 + d) & 0xFFFFFFFF; temp = (temp ^ temp_1) & 0xFFFFFFFF; temp = (z + temp) & 0xFFFFFFFF; z = temp & 0xFFFFFFFF;*/ z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); n = n - 1; } for (n = 0; n <= 3; n++) { outb[n] = System.Convert.ToByte((y >> (n * 8)) & 255); outb[n + 4] = System.Convert.ToByte((z >> (n * 8)) & 255); } } public void DeCode(Byte[] inb, Byte[] outb, string Key) { UInt32 cnDelta, y, z, a, b, c, d, temp_2; UInt32[] buf = new UInt32[16]; int n, i, nlen; UInt32 sum; //UInt32 temp, temp_1; string temp_string; cnDelta = 2654435769; sum = 0xC6EF3720; nlen = Key.Length; i = 0; for (n = 1; n <= nlen; n = n + 2) { temp_string = Key.Substring(n - 1, 2); buf[i] = HexToInt(temp_string); i = i + 1; } a = 0; b = 0; c = 0; d = 0; for (n = 0; n <= 3; n++) { a = (buf[n] << (n * 8)) | a; b = (buf[n + 4] << (n * 8)) | b; c = (buf[n + 4 + 4] << (n * 8)) | c; d = (buf[n + 4 + 4 + 4] << (n * 8)) | d; } y = 0; z = 0; for (n = 0; n <= 3; n++) { temp_2 = inb[n]; y = (temp_2 << (n * 8)) | y; temp_2 = inb[n + 4]; z = (temp_2 << (n * 8)) | z; } n = 32; while (n-- > 0) { z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); sum -= cnDelta; } for (n = 0; n <= 3; n++) { outb[n] = System.Convert.ToByte((y >> (n * 8)) & 255); outb[n + 4] = System.Convert.ToByte((z >> (n * 8)) & 255); } } public string StrEnc(string InString, string Key) //使用增强算法,加密字符串 { Byte[] b, outb; Byte[] temp = new Byte[8], outtemp = new Byte[8]; int n, i, nlen, outlen; string outstring; byte[] SrcbyteArray = System.Text.Encoding.Default.GetBytes(InString); nlen = SrcbyteArray.Length + 1; if (nlen < 8) outlen = 8; else outlen = nlen; b = new byte[outlen]; outb = new byte[outlen]; Array.Copy(SrcbyteArray, b, SrcbyteArray.Length); b.CopyTo(outb, 0); for (n = 0; n <= outlen - 8; n = n + 8) { for (i = 0; i < 8; i++) temp[i] = b[i + n]; EnCode(temp, outtemp, Key); for (i = 0; i < 8; i++) outb[i + n] = outtemp[i]; } outstring = ""; for (n = 0; n <= outlen - 1; n++) { outstring = outstring + outb[n].ToString("X2"); } return outstring; } public string StrDec(string InString, string Key) //使用增强算法,加密字符串 { Byte[] b, outb; Byte[] temp = new Byte[8], outtemp = new Byte[8]; int n, i, nlen, outlen; string temp_string; String c_str; nlen = InString.Length; if (nlen < 16) outlen = 16; outlen = nlen / 2; b = new Byte[outlen]; outb = new Byte[outlen]; i = 0; for (n = 1; n <= nlen; n = n + 2) { temp_string = InString.Substring(n - 1, 2); b[i] = System.Convert.ToByte(HexToInt(temp_string)); i = i + 1; } b.CopyTo(outb, 0); for (n = 0; n <= outlen - 8; n = n + 8) { for (i = 0; i < 8; i++) temp[i] = b[i + n]; DeCode(temp, outtemp, Key); for (i = 0; i < 8; i++) outb[i + n] = outtemp[i]; } c_str = ByteConvertString(outb); return c_str; } private bool isfindmydevice(int pos, ref string OutPath) { var list = HidSharp.DeviceList.Local; var hidDeviceList = list.GetHidDevices(VID, PID).ToArray(); if (hidDeviceList.Length > pos) { OutPath = hidDeviceList[pos].DevicePath; return true; } pos = pos - hidDeviceList.Length; hidDeviceList = list.GetHidDevices(VID_NEW, PID_NEW).ToArray(); if (hidDeviceList.Length > pos) { OutPath = hidDeviceList[pos].DevicePath; return true; } pos = pos - hidDeviceList.Length; hidDeviceList = list.GetHidDevices(VID_NEW_2, PID_NEW_2).ToArray(); if (hidDeviceList.Length > pos) { OutPath = hidDeviceList[pos].DevicePath; return true; } return false; } private int NT_FindPort(int start, ref string OutPath) { if (!isfindmydevice(start, ref OutPath)) { return -92; } return 0; } private int NT_FindPort_2(int start, int in_data, int verf_data, ref string OutPath) { int pos; int out_data = 0; int ret; for (pos = start; pos < 256; pos++) { if (!isfindmydevice(pos, ref OutPath)) return -92; ret = WriteDword(in_data, OutPath); if (ret != 0) continue; ret = ReadDword(ref out_data, OutPath); if (ret != 0) continue; if (out_data == verf_data) { return 0; } } return (-92); } private int OpenMydivece(out HidStream hidStream, string Path) { var list = HidSharp.DeviceList.Local; var hidDeviceList = list.GetHidDevices(VID, PID).ToArray(); foreach (HidDevice dev in hidDeviceList) { if (Path.CompareTo(dev.DevicePath) == 0) { if (dev.TryOpen(out hidStream)) return 0; else return -92; } } hidDeviceList = list.GetHidDevices(VID_NEW, PID_NEW).ToArray(); foreach (HidDevice dev in hidDeviceList) { if (Path.CompareTo(dev.DevicePath) == 0) { if (dev.TryOpen(out hidStream)) return 0; else return -92; } } hidDeviceList = list.GetHidDevices(VID_NEW_2, PID_NEW_2).ToArray(); foreach (HidDevice dev in hidDeviceList) { if (Path.CompareTo(dev.DevicePath) == 0) { if (dev.TryOpen(out hidStream)) return 0; else return -92; } } hidStream = null; return -92; } private bool GetFeature(HidStream hidStream, ref Byte[] array_out, int out_len) { int count = 0; out_len = hidStream.Device.GetMaxFeatureReportLength(); retry: array_out[0] = 1; try { if (out_len != 0) { hidStream.GetFeature(array_out, 0, hidStream.Device.GetMaxFeatureReportLength()); } else { hidStream.GetFeature(array_out); } } catch { count++; if (count == MAX_TIMEOUT) return false; goto retry; } return true; } private bool SetFeature(HidStream hidStream, Byte[] array_in, int in_len) { array_in[0] = 2; try { hidStream.SetFeature(array_in); } catch { return false; } return true; } private int TransferData(Byte[] array_in, int in_len, ref Byte[] array_out, int out_len, string Path) { HidStream hUsbDevice; Byte[] array_In_257 = new Byte[257]; Byte[] array_In_21 = new Byte[0x15]; Byte[] array_out_257 = new Byte[257]; if (OpenMydivece(out hUsbDevice, Path) != 0) return -92; Semaphore sem; sem = new Semaphore(1, 1); sem.WaitOne(); try { if (in_len > 0) { Array.Copy(array_in, array_In_257, array_in.Length < array_In_257.Length ? array_in.Length : array_In_257.Length); if (!SetFeature(hUsbDevice, array_In_257, in_len)) { Array.Copy(array_in, 0, array_In_21, 0, 0x15); if (!SetFeature(hUsbDevice, array_In_21, in_len)) { return -93; } } } if (out_len > 0) { if (!GetFeature(hUsbDevice, ref array_out_257, out_len)) { return -94; } } } finally { sem.Release(1); } if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { Array.Copy(array_out_257, 1, array_out, 0, out_len); } else { Array.Copy(array_out_257, 0, array_out, 0, out_len); } return 0; } private int NT_Read(ref Byte ele1, ref Byte ele2, ref Byte ele3, ref Byte ele4, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int ret = TransferData(array_in, 0, ref array_out, 5, Path); ele1 = array_out[0]; ele2 = array_out[1]; ele3 = array_out[2]; ele4 = array_out[3]; return ret; } private int NT_Write(Byte ele1, Byte ele2, Byte ele3, Byte ele4, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 3; array_in[2] = ele1; array_in[3] = ele2; array_in[4] = ele3; array_in[5] = ele4; int ret = TransferData(array_in, 5, ref array_out, 0, Path); return ret; } private int NT_Write_2(Byte ele1, Byte ele2, Byte ele3, Byte ele4, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 4; array_in[2] = ele1; array_in[3] = ele2; array_in[4] = ele3; array_in[5] = ele4; int ret = TransferData(array_in, 5, ref array_out, 0, Path); return ret; } private int GetIDVersion(ref short Version, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 1; int ret = TransferData(array_in, 1, ref array_out, 1, Path); Version = array_out[0]; return ret; } private int NT_GetID(ref int ID_1, ref int ID_2, string Path) { int[] t = new int[8]; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 2; int ret = TransferData(array_in, 1, ref array_out, 8, Path); t[0] = array_out[0]; t[1] = array_out[1]; t[2] = array_out[2]; t[3] = array_out[3]; t[4] = array_out[4]; t[5] = array_out[5]; t[6] = array_out[6]; t[7] = array_out[7]; ID_1 = t[3] | (t[2] << 8) | (t[1] << 16) | (t[0] << 24); ID_2 = t[7] | (t[6] << 8) | (t[5] << 16) | (t[4] << 24); return ret; } private int Y_Read(Byte[] OutData, int address, int nlen, Byte[] password, string Path, int pos) { int addr_l; int addr_h; int n; Byte[] array_in = new Byte[512]; Byte[] array_out = new Byte[512]; if ((address > MAX_LEN) || (address < 0)) return -81; if ((nlen > 255)) return -87; if ((nlen + address) > MAX_LEN) return -88; addr_h = (address >> 8) * 2; addr_l = address & 255; array_in[1] = 0x10; array_in[2] = (Byte)addr_h; array_in[3] = (Byte)addr_l; array_in[4] = (Byte)nlen; for (n = 0; n <= 7; n++) { array_in[5 + n] = password[n]; } int ret = TransferData(array_in, 13, ref array_out, nlen + 1, Path); if (array_out[0] != 0) { return -83; } for (n = 0; n < nlen; n++) { OutData[n + pos] = array_out[n + 1]; } return ret; } private int Y_Write(Byte[] indata, int address, int nlen, Byte[] password, string Path, int pos) { int addr_l; int addr_h; int n; Byte[] array_in = new Byte[512]; Byte[] array_out = new Byte[512]; if ((nlen > 255)) return -87; if ((address + nlen - 1) > (MAX_LEN + 17) || (address < 0)) return -81; addr_h = (address >> 8) * 2; addr_l = address & 255; array_in[1] = 0x11; array_in[2] = (Byte)addr_h; array_in[3] = (Byte)addr_l; array_in[4] = (Byte)nlen; for (n = 0; n <= 7; n++) { array_in[5 + n] = password[n]; } for (n = 0; n < nlen; n++) { array_in[13 + n] = indata[n + pos]; } int ret = TransferData(array_in, 13, ref array_out, 2, Path); if (array_out[0] != 0) { return -82; } return ret; } private int NT_Cal(Byte[] InBuf, Byte[] outbuf, string Path, int pos) { int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 8; for (n = 2; n <= 9; n++) { array_in[n] = InBuf[n - 2 + pos]; } int ret = TransferData(array_in, 9, ref array_out, 9, Path); for (n = 0; n < 8; n++) { outbuf[n + pos] = array_out[n]; } if (array_out[8] != 0x55) { return -20; } return ret; } private int NT_SetCal_2(Byte[] indata, Byte IsHi, string Path, short pos) { int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 9; array_in[2] = IsHi; for (n = 0; n < 8; n++) { array_in[3 + n] = indata[n + pos]; } int ret = TransferData(array_in, 11, ref array_out, 2, Path); if (array_out[0] != 0) { return -82; } return ret; } private int ReadDword(ref int out_data, string Path) { Byte b1 = 0; Byte b2 = 0; Byte b3 = 0; Byte b4 = 0; int t1; int t2; int t3; int t4; int ret; ret = NT_Read(ref b1, ref b2, ref b3, ref b4, Path); t1 = b1; t2 = b2; t3 = b3; t4 = b4; out_data = t1 | (t2 << 8) | (t3 << 16) | (t4 << 24); return ret; } private int WriteDword(int in_data, string Path) { Byte b1; Byte b2; Byte b3; Byte b4; b1 = (Byte)(in_data & 255); b2 = (Byte)((in_data >> 8) & 255); b3 = (Byte)((in_data >> 16) & 255); b4 = (Byte)((in_data >> 24) & 255); return NT_Write(b1, b2, b3, b4, Path); } private int WriteDword_2(int in_data, string Path) { Byte b1; Byte b2; Byte b3; Byte b4; b1 = (Byte)(in_data & 255); b2 = (Byte)((in_data >> 8) & 255); b3 = (Byte)((in_data >> 16) & 255); b4 = (Byte)((in_data >> 24) & 255); return NT_Write_2(b1, b2, b3, b4, Path); } public int NT_GetIDVersion(ref short Version, string Path) { int ret; ret = GetIDVersion(ref Version, Path); return ret; } public int GetID(ref int ID_1, ref int ID_2, string Path) { int ret; ret = NT_GetID(ref ID_1, ref ID_2, Path); return ret; } public int sRead(ref int in_data, string Path) { int ret; ret = ReadDword(ref in_data, Path); return ret; } public int sWrite(int out_data, string Path) { int ret; ret = WriteDword(out_data, Path); return ret; } public int YWrite(Byte[] indata, int address, int nlen, string HKey, string LKey, string Path) { int ret = 0; Byte[] password = new Byte[8]; int n, trashLen = 0; int leave; int temp_leave; if ((address + nlen - 1 > MAX_LEN) || (address < 0)) return -81; ret = GetTrashBufLen(Path, ref trashLen); if (trashLen < 100) trashLen = 16; trashLen = trashLen - 8; if (ret != 0) return ret; myconvert(HKey, LKey, password); temp_leave = address % trashLen; leave = trashLen - temp_leave; if (leave > nlen) leave = nlen; if (leave > 0) { for (n = 0; n < leave / trashLen; n++) { ret = Y_Write(indata, address + n * trashLen, trashLen, password, Path, trashLen * n); if (ret != 0) { return ret; } } if (leave - trashLen * n > 0) { ret = Y_Write(indata, address + n * trashLen, leave - n * trashLen, password, Path, trashLen * n); if (ret != 0) { return ret; } } } nlen = nlen - leave; address = address + leave; if (nlen > 0) { for (n = 0; n < nlen / trashLen; n++) { ret = Y_Write(indata, address + n * trashLen, trashLen, password, Path, leave + trashLen * n); if (ret != 0) { return ret; } } if (nlen - trashLen * n > 0) { ret = Y_Write(indata, address + n * trashLen, nlen - n * trashLen, password, Path, leave + trashLen * n); if (ret != 0) { return ret; } } } return ret; } public int YRead(Byte[] OutData, short address, short nlen, string HKey, string LKey, string Path) { int ret = 0; Byte[] password = new Byte[8]; int n, trashLen = 0; if ((address + nlen - 1 > MAX_LEN) || (address < 0)) return (-81); ret = GetTrashBufLen(Path, ref trashLen); if (trashLen < 100) trashLen = 16; if (ret != 0) return ret; myconvert(HKey, LKey, password); for (n = 0; n < nlen / trashLen; n++) { ret = Y_Read(OutData, address + n * trashLen, trashLen, password, Path, n * trashLen); if (ret != 0) { return ret; } } if (nlen - trashLen * n > 0) { ret = Y_Read(OutData, address + n * trashLen, nlen - trashLen * n, password, Path, trashLen * n); if (ret != 0) { return ret; } } return ret; } public int FindPort_2(int start, int in_data, int verf_data, ref string OutPath) { int ret; ret = NT_FindPort_2(start, in_data, verf_data, ref OutPath); return ret; } public int FindPort(int start, ref string OutPath) { int ret; ret = NT_FindPort(start, ref OutPath); return ret; } public int sWrite_2(int out_data, string Path) { int ret; ret = WriteDword_2(out_data, Path); return ret; } private string AddZero(string InKey) { int nlen; int n; nlen = InKey.Length; for (n = nlen; n <= 7; n++) { InKey = "0" + InKey; } return InKey; } private void myconvert(string HKey, string LKey, Byte[] out_data) { HKey = AddZero(HKey); LKey = AddZero(LKey); int n; for (n = 0; n <= 3; n++) { out_data[n] = (Byte)HexToInt(HKey.Substring(n * 2, 2)); } for (n = 0; n <= 3; n++) { out_data[n + 4] = (Byte)HexToInt(LKey.Substring(n * 2, 2)); } } public int SetReadPassword(string W_HKey, string W_LKey, string new_HKey, string new_LKey, string Path) { int ret; Byte[] ary1 = new Byte[8]; Byte[] ary2 = new Byte[8]; short address; myconvert(W_HKey, W_LKey, ary1); myconvert(new_HKey, new_LKey, ary2); address = 2032; ret = Y_Write(ary2, address, 8, ary1, Path, 0); return ret; } public int SetWritePassword(string W_HKey, string W_LKey, string new_HKey, string new_LKey, string Path) { int ret; Byte[] ary1 = new Byte[8]; Byte[] ary2 = new Byte[8]; short address; myconvert(W_HKey, W_LKey, ary1); myconvert(new_HKey, new_LKey, ary2); address = 2040; ret = Y_Write(ary2, address, 8, ary1, Path, 0); return ret; } public int YWriteString(string InString, int address, string HKey, string LKey, string Path) { int ret = 0; Byte[] ary1 = new Byte[8]; int n, trashLen = 0; int outlen; int total_len; int temp_leave; int leave; Byte[] b; if ((address < 0)) return -81; ret = GetTrashBufLen(Path, ref trashLen); if (trashLen < 100) trashLen = 16; trashLen = trashLen - 8; if (ret != 0) return ret; myconvert(HKey, LKey, ary1); byte[] SrcbyteArray = System.Text.Encoding.Default.GetBytes(InString); outlen = SrcbyteArray.Length; b = new Byte[outlen]; Array.Copy(SrcbyteArray, b, SrcbyteArray.Length); total_len = address + outlen; if (total_len > MAX_LEN) return -47; temp_leave = address % trashLen; leave = trashLen - temp_leave; if (leave > outlen) leave = outlen; if (leave > 0) { for (n = 0; n < (leave / trashLen); n++) { ret = Y_Write(b, address + n * trashLen, trashLen, ary1, Path, n * trashLen); if (ret != 0) { return ret; } } if (leave - trashLen * n > 0) { ret = Y_Write(b, address + n * trashLen, leave - n * trashLen, ary1, Path, trashLen * n); if (ret != 0) { return ret; } } } outlen = outlen - leave; address = address + leave; if (outlen > 0) { for (n = 0; n < (outlen / trashLen); n++) { ret = Y_Write(b, address + n * trashLen, trashLen, ary1, Path, leave + n * trashLen); if (ret != 0) { return ret; } } if (outlen - trashLen * n > 0) { ret = Y_Write(b, address + n * trashLen, outlen - n * trashLen, ary1, Path, leave + trashLen * n); if (ret != 0) { return ret; } } } return SrcbyteArray.Length; } public int YReadString(ref string OutString, int address, int nlen, string HKey, string LKey, string Path) { int ret = 0; Byte[] ary1 = new Byte[8]; int n, trashLen = 0; int total_len; Byte[] outb; outb = new Byte[nlen]; myconvert(HKey, LKey, ary1); if (address < 0) return -81; ret = GetTrashBufLen(Path, ref trashLen); if (trashLen < 100) trashLen = 16; if (ret != 0) return ret; total_len = address + nlen; if (total_len > MAX_LEN) return -47; for (n = 0; n < (nlen / trashLen); n++) { ret = Y_Read(outb, address + n * trashLen, trashLen, ary1, Path, n * trashLen); if (ret != 0) { return ret; } } if (nlen - trashLen * n > 0) { ret = Y_Read(outb, address + n * trashLen, nlen - trashLen * n, ary1, Path, trashLen * n); if (ret != 0) { return ret; } } OutString = ByteConvertString(outb); return ret; } public int SetCal_2(string Key, string Path) { int ret; Byte[] KeyBuf = new Byte[16]; Byte[] inb = new Byte[8]; HexStringToByteArray(Key, ref KeyBuf); ret = NT_SetCal_2(KeyBuf, 0, Path, 8); if (ret != 0) goto error1; ret = NT_SetCal_2(KeyBuf, 1, Path, 0); error1: return ret; } public int Cal(Byte[] InBuf, Byte[] outbuf, string Path) { int ret; ret = NT_Cal(InBuf, outbuf, Path, 0); return ret; } public int EncString(string InString, ref string OutString, string Path) { Byte[] b; Byte[] outb; int n; int nlen, temp_len; int ret = 0; byte[] SrcbyteArray = System.Text.Encoding.Default.GetBytes(InString); nlen = SrcbyteArray.Length + 1; temp_len = nlen; if (nlen < 8) { nlen = 8; } b = new Byte[nlen]; outb = new Byte[nlen]; Array.Copy(SrcbyteArray, b, SrcbyteArray.Length); b.CopyTo(outb, 0); for (n = 0; n <= (nlen - 8); n = n + 8) { ret = NT_Cal(b, outb, Path, n); if (ret != 0) break; } OutString = ""; for (n = 0; n < nlen; n++) { OutString = OutString + outb[n].ToString("X2"); } return ret; } public int sWriteEx(int in_data, ref int out_data, string Path) { int ret; ret = WriteDword(in_data, Path); if (ret != 0) goto error1; ret = ReadDword(ref out_data, Path); error1: return ret; } public int sWrite_2Ex(int in_data, ref int out_data, string Path) { int ret; ret = WriteDword_2(in_data, Path); if (ret != 0) goto error1; ret = ReadDword(ref out_data, Path); error1: return ret; } public int ReSet(string Path) { int ret; ret = NT_ReSet(Path); return ret; } private int NT_ReSet(string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 32; int ret = TransferData(array_in, 2, ref array_out, 2, Path); if (array_out[0] != 0) { return -82; } return ret; } public int SetCal_New(string Key, string Path) { int ret; Byte[] KeyBuf = new Byte[16]; Byte[] inb = new Byte[8]; HexStringToByteArray(Key, ref KeyBuf); ret = NT_SetCal_New(KeyBuf, 0, Path, 8); if (ret != 0) goto error1; ret = NT_SetCal_New(KeyBuf, 1, Path, 0); error1: return ret; } public int Cal_New(Byte[] InBuf, Byte[] outbuf, string Path) { int ret; ret = NT_Cal_New(InBuf, outbuf, Path, 0); return ret; } public int EncString_New(string InString, ref string OutString, string Path) { Byte[] b; Byte[] outb; int n; int nlen, temp_len; int ret = 0; byte[] SrcbyteArray = System.Text.Encoding.Default.GetBytes(InString); nlen = SrcbyteArray.Length + 1; temp_len = nlen; if (nlen < 8) { nlen = 8; } b = new Byte[nlen]; outb = new Byte[nlen]; Array.Copy(SrcbyteArray, b, SrcbyteArray.Length); b.CopyTo(outb, 0); for (n = 0; n <= (nlen - 8); n = n + 8) { ret = NT_Cal_New(b, outb, Path, n); if (ret != 0) break; } OutString = ""; for (n = 0; n < nlen; n++) { OutString = OutString + outb[n].ToString("X2"); } return ret; } public int NT_GetVersionEx(ref short Version, string Path) { int ret; ret = F_GetVersionEx(ref Version, Path); return ret; } private int NT_Cal_New(Byte[] InBuf, Byte[] outbuf, string Path, int pos) { int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 12; for (n = 2; n <= 9; n++) { array_in[n] = InBuf[n - 2 + pos]; } int ret = TransferData(array_in, 9, ref array_out, 9, Path); for (n = 0; n < 8; n++) { outbuf[n + pos] = array_out[n]; } if (array_out[8] != 0x55) { return -20; } return ret; } private int NT_SetCal_New(Byte[] indata, Byte IsHi, string Path, short pos) { int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 13; array_in[2] = IsHi; for (n = 0; n < 8; n++) { array_in[3 + n] = indata[n + pos]; } int ret = TransferData(array_in, 11, ref array_out, 2, Path); if (array_out[0] != 0) { return -82; } return ret; } private int F_GetVersionEx(ref short Version, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 5; int ret = TransferData(array_in, 1, ref array_out, 1, Path); Version = array_out[0]; return ret; } public int SetHidOnly(bool IsHidOnly, string Path) { int ret; ret = NT_SetHidOnly(IsHidOnly, Path); return ret; } private int NT_SetHidOnly(bool IsHidOnly, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 0x55; if (IsHidOnly) array_in[2] = 0; else array_in[2] = 0xff; int ret = TransferData(array_in, 3, ref array_out, 1, Path); if (array_out[0] != 0) { return -82; } return ret; } public int SetUReadOnly(string Path) { int ret; ret = NT_SetUReadOnly(Path); return ret; } private int NT_SetUReadOnly(string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 0x56; int ret = TransferData(array_in, 3, ref array_out, 1, Path); if (array_out[0] != 0) { return -82; } return ret; } private int sub_GetTrashBufLen(IntPtr hDevice, ref int out_len) { /* IntPtr Ppd = System.IntPtr.Zero; HIDP_CAPS Caps = new HIDP_CAPS(); if (!HidD_GetPreparsedData(hDevice, ref Ppd)) return -93; if (HidP_GetCaps(Ppd, ref Caps) <= 0) { HidD_FreePreparsedData(Ppd); return -93; } HidD_FreePreparsedData(Ppd); out_len = Caps.FeatureReportByteLength - 5;*/ return 0; } private int GetTrashBufLen(string Path, ref int out_len) { out_len = 16; return 0; } private int NT_Set_SM2_KeyPair(Byte[] PriKey, Byte[] PubKeyX, Byte[] PubKeyY, Byte[] sm2_UerName, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_in[1] = 0x32; for (n = 0; n < ECC_MAXLEN; n++) { array_in[2 + n + ECC_MAXLEN * 0] = PriKey[n]; array_in[2 + n + ECC_MAXLEN * 1] = PubKeyX[n]; array_in[2 + n + ECC_MAXLEN * 2] = PubKeyY[n]; } for (n = 0; n < SM2_USENAME_LEN; n++) { array_in[2 + n + ECC_MAXLEN * 3] = sm2_UerName[n]; } int ret = TransferData(array_in, ECC_MAXLEN * 3 + SM2_USENAME_LEN + 2, ref array_out, 2, Path); if (array_out[0] != 0x20) return USBStatusFail; return ret; } private int NT_GenKeyPair(Byte[] PriKey, Byte[] PubKey, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_out[0] = 0xfb; array_in[1] = GEN_KEYPAIR; int ret = TransferData(array_in, 2, ref array_out, ECC_MAXLEN * 3 + 2, Path); if (array_out[0] != 0x20) { return FAILEDGENKEYPAIR; //表示读取失败; } for (n = 0; n < ECC_MAXLEN; n++) { PriKey[n] = array_out[1 + ECC_MAXLEN * 0 + n]; } for (n = 0; n < (ECC_MAXLEN * 2 + 1); n++) { PubKey[n] = array_out[1 + ECC_MAXLEN * 1 + n]; } return ret; } private int NT_GetChipID(Byte[] OutChipID, string Path) { int[] t = new int[8]; int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = GET_CHIPID; int ret = TransferData(array_in, 1, ref array_out, 17, Path); if (array_out[0] != 0x20) return USBStatusFail; for (n = 0; n < 16; n++) { OutChipID[n] = array_out[1 + n]; } return ret; } private int NT_Get_SM2_PubKey(Byte[] KGx, Byte[] KGy, Byte[] sm2_UerName, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_in[1] = 0x33; int ret = TransferData(array_in, 2, ref array_out, ECC_MAXLEN * 2 + SM2_USENAME_LEN + 2, Path); if (array_out[0] != 0x20) return USBStatusFail; for (n = 0; n < ECC_MAXLEN; n++) { KGx[n] = array_out[1 + ECC_MAXLEN * 0 + n]; KGy[n] = array_out[1 + ECC_MAXLEN * 1 + n]; } for (n = 0; n < SM2_USENAME_LEN; n++) { sm2_UerName[n] = array_out[1 + ECC_MAXLEN * 2 + n]; } return ret; } private int NT_Set_Pin(string old_pin, string new_pin, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_in[1] = SET_PIN; Byte[] b_oldpin = System.Text.Encoding.Default.GetBytes(old_pin); Byte[] b_newpin = System.Text.Encoding.Default.GetBytes(new_pin); for (n = 0; n < PIN_LEN; n++) { array_in[2 + PIN_LEN * 0 + n] = b_oldpin[n]; array_in[2 + PIN_LEN * 1 + n] = b_newpin[n]; } int ret = TransferData(array_in, PIN_LEN * 2 + 2, ref array_out, 2, Path); if (array_out[0] != 0x20) return USBStatusFail; if (array_out[1] != 0x20) return FAILPINPWD; return ret; } private int NT_SM2_Enc(Byte[] inbuf, Byte[] outbuf, Byte inlen, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_in[1] = MYENC; array_in[2] = inlen; for (n = 0; n < inlen; n++) { array_in[3 + n] = inbuf[n]; } int ret = TransferData(array_in, inlen + 1 + 2, ref array_out, inlen + SM2_ADDBYTE + 3, Path); if (array_out[0] != 0x20) return USBStatusFail; if (array_out[1] == 0) return FAILENC; for (n = 0; n < (inlen + SM2_ADDBYTE); n++) { outbuf[n] = array_out[2 + n]; } return ret; } private int NT_SM2_Dec(Byte[] inbuf, Byte[] outbuf, Byte inlen, string pin, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_in[1] = MYDEC; Byte[] b_pin = System.Text.Encoding.Default.GetBytes(pin); for (n = 0; n < PIN_LEN; n++) { array_in[2 + PIN_LEN * 0 + n] = b_pin[n]; } array_in[2 + PIN_LEN] = inlen; for (n = 0; n < inlen; n++) { array_in[2 + PIN_LEN + 1 + n] = inbuf[n]; } int ret = TransferData(array_in, inlen + 1 + 2 + PIN_LEN, ref array_out, inlen - SM2_ADDBYTE + 4, Path); if (array_out[2] != 0x20) return FAILPINPWD; if (array_out[1] == 0) return FAILENC; if (array_out[0] != 0x20) return USBStatusFail; for (n = 0; n < (inlen - SM2_ADDBYTE); n++) { outbuf[n] = array_out[3 + n]; } return ret; } private int NT_Sign(Byte[] inbuf, Byte[] outbuf, string pin, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_in[1] = YTSIGN; Byte[] b_pin = System.Text.Encoding.Default.GetBytes(pin); for (n = 0; n < PIN_LEN; n++) { array_in[2 + PIN_LEN * 0 + n] = b_pin[n]; } for (n = 0; n < 32; n++) { array_in[2 + PIN_LEN + n] = inbuf[n]; } int ret = TransferData(array_in, 32 + 2 + PIN_LEN, ref array_out, 64 + 3, Path); if (array_out[1] != 0x20) return FAILPINPWD; if (array_out[0] != 0x20) return USBStatusFail; for (n = 0; n < 64; n++) { outbuf[n] = array_out[2 + n]; } return ret; } private int NT_Sign_2(Byte[] inbuf, Byte[] outbuf, string pin, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_in[1] = YTSIGN_2; Byte[] b_pin = System.Text.Encoding.Default.GetBytes(pin); for (n = 0; n < PIN_LEN; n++) { array_in[2 + PIN_LEN * 0 + n] = b_pin[n]; } for (n = 0; n < 32; n++) { array_in[2 + PIN_LEN + n] = inbuf[n]; } int ret = TransferData(array_in, 32 + 2 + PIN_LEN, ref array_out, 64 + 3, Path); if (array_out[1] != 0x20) return FAILPINPWD; if (array_out[0] != 0x20) return USBStatusFail; for (n = 0; n < 64; n++) { outbuf[n] = array_out[2 + n]; } return ret; } private int NT_Verfiy(Byte[] inbuf, Byte[] InSignBuf, ref bool outbiao, string Path) { Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; int n = 0; array_in[1] = YTVERIFY; for (n = 0; n < 32; n++) { array_in[2 + n] = inbuf[n]; } for (n = 0; n < 64; n++) { array_in[2 + 32 + n] = InSignBuf[n]; } int ret = TransferData(array_in, 32 + 2 + 64, ref array_out, 3, Path); outbiao = (array_out[1] != 0); if (array_out[0] != 0x20) return USBStatusFail; return ret; } private string ByteArrayToHexString(Byte[] in_data, int nlen) { return ByteArrayToHexStringEx(in_data, nlen, 0); } private string ByteArrayToHexStringEx(Byte[] in_data, int nlen, int pos) { string OutString = ""; int n; for (n = 0; n < nlen; n++) { OutString = OutString + in_data[n + pos].ToString("X2"); } return OutString; } public int YT_GenKeyPair(ref string PriKey, ref string PubKeyX, ref string PubKeyY, string InPath) { int ret, n; Byte[] b_PriKey = new Byte[ECC_MAXLEN], b_PubKey = new Byte[ECC_MAXLEN * 2 + 1]; //其中第一个字节是标志位,忽略 ret = NT_GenKeyPair(b_PriKey, b_PubKey, InPath); PriKey = ByteArrayToHexString(b_PriKey, ECC_MAXLEN); PubKeyX = ""; PubKeyY = ""; for (n = 0; n < ECC_MAXLEN; n++) { PubKeyX = PubKeyX + b_PubKey[n + 1].ToString("X2"); PubKeyY = PubKeyY + b_PubKey[n + 1 + ECC_MAXLEN].ToString("X2"); } return ret; } public int Set_SM2_KeyPair(string PriKey, string PubKeyX, string PubKeyY, string SM2_UserName, string InPath) { int ret; Byte[] b_PriKey = new Byte[ECC_MAXLEN], b_PubKeyX = new Byte[ECC_MAXLEN], b_PubKeyY = new Byte[ECC_MAXLEN]; HexStringToByteArray(PriKey, ref b_PriKey); HexStringToByteArray(PubKeyX, ref b_PubKeyX); HexStringToByteArray(PubKeyY, ref b_PubKeyY); Byte[] b_SM2UserName = System.Text.Encoding.Default.GetBytes(SM2_UserName); ret = NT_Set_SM2_KeyPair(b_PriKey, b_PubKeyX, b_PubKeyY, b_SM2UserName, InPath); return ret; } public int Get_SM2_PubKey(ref string PubKeyX, ref string PubKeyY, ref string sm2UserName, string InPath) { int ret; Byte[] b_PubKeyX = new Byte[ECC_MAXLEN], b_PubKeyY = new Byte[ECC_MAXLEN], b_sm2UserName = new Byte[SM2_USENAME_LEN]; ret = NT_Get_SM2_PubKey(b_PubKeyX, b_PubKeyY, b_sm2UserName, InPath); PubKeyX = ByteArrayToHexString(b_PubKeyX, ECC_MAXLEN); PubKeyY = ByteArrayToHexString(b_PubKeyY, ECC_MAXLEN); sm2UserName = ByteConvertString(b_sm2UserName); return ret; } public int GetChipID(ref string OutChipID, string InPath) { int ret; Byte[] b_OutChipID = new Byte[16]; ret = NT_GetChipID(b_OutChipID, InPath); OutChipID = ByteArrayToHexString(b_OutChipID, 16); return ret; } public int SM2_EncBuf(Byte[] InBuf, Byte[] OutBuf, int inlen, string InPath) { int ret = 0, n, temp_inlen, incount = 0, outcount = 0; Byte[] temp_InBuf = new Byte[MAX_ENCLEN + SM2_ADDBYTE], temp_OutBuf = new Byte[MAX_ENCLEN + SM2_ADDBYTE]; while (inlen > 0) { if (inlen > MAX_ENCLEN) temp_inlen = MAX_ENCLEN; else temp_inlen = inlen; for (n = 0; n < temp_inlen; n++) { temp_InBuf[n] = InBuf[incount + n]; } ret = NT_SM2_Enc(temp_InBuf, temp_OutBuf, (Byte)temp_inlen, InPath); for (n = 0; n < (temp_inlen + SM2_ADDBYTE); n++) { OutBuf[outcount + n] = temp_OutBuf[n]; } if (ret != 0) goto err; inlen = inlen - MAX_ENCLEN; incount = incount + MAX_ENCLEN; outcount = outcount + MAX_DECLEN; } err: return ret; } public int SM2_DecBuf(Byte[] InBuf, Byte[] OutBuf, int inlen, string pin, string InPath) { int ret = 0, temp_inlen, n, incount = 0, outcount = 0; Byte[] temp_InBuf = new Byte[MAX_ENCLEN + SM2_ADDBYTE], temp_OutBuf = new Byte[MAX_ENCLEN + SM2_ADDBYTE]; while (inlen > 0) { if (inlen > MAX_DECLEN) temp_inlen = MAX_DECLEN; else temp_inlen = inlen; for (n = 0; n < temp_inlen; n++) { temp_InBuf[n] = InBuf[incount + n]; } ret = NT_SM2_Dec(InBuf, OutBuf, (Byte)temp_inlen, pin, InPath); for (n = 0; n < (temp_inlen - SM2_ADDBYTE); n++) { OutBuf[outcount + n] = temp_OutBuf[n]; } if (ret != 0) goto err; inlen = inlen - MAX_DECLEN; incount = incount + MAX_DECLEN; outcount = outcount + MAX_ENCLEN; } err: return ret; } public int SM2_EncString(string InString, ref string OutString, string InPath) { int n, incount = 0, outcount = 0; Byte[] temp_InBuf = new Byte[MAX_ENCLEN + SM2_ADDBYTE], temp_OutBuf = new Byte[MAX_ENCLEN + SM2_ADDBYTE]; byte[] SrcbyteArray = System.Text.Encoding.Default.GetBytes(InString); int inlen = SrcbyteArray.Length + 1; int outlen = (int)Math.Ceiling((double)inlen / (MAX_ENCLEN)) * SM2_ADDBYTE + inlen; Byte[] OutBuf = new Byte[outlen]; Byte[] InBuf = new Byte[inlen]; Array.Copy(SrcbyteArray, InBuf, SrcbyteArray.Length); int ret = 0, temp_inlen; while (inlen > 0) { if (inlen > MAX_ENCLEN) temp_inlen = MAX_ENCLEN; else temp_inlen = inlen; for (n = 0; n < temp_inlen; n++) { temp_InBuf[n] = InBuf[incount + n]; } ret = NT_SM2_Enc(temp_InBuf, temp_OutBuf, (Byte)temp_inlen, InPath); for (n = 0; n < (temp_inlen + SM2_ADDBYTE); n++) { OutBuf[outcount + n] = temp_OutBuf[n]; } if (ret != 0) goto err; inlen = inlen - MAX_ENCLEN; incount = incount + MAX_ENCLEN; outcount = outcount + MAX_DECLEN; } err: OutString = ByteArrayToHexString(OutBuf, outlen); return ret; } public int SM2_DecString(string InString, ref string OutString, string pin, string InPath) { int n, incount = 0, outcount = 0; Byte[] temp_InBuf = new Byte[MAX_ENCLEN + SM2_ADDBYTE], temp_OutBuf = new Byte[MAX_ENCLEN + SM2_ADDBYTE]; byte[] SrcbyteArray = System.Text.Encoding.Default.GetBytes(InString); int inlen = SrcbyteArray.Length / 2; int outlen = inlen - (int)Math.Ceiling((double)inlen / (MAX_DECLEN)) * SM2_ADDBYTE + 1; Byte[] InBuf = new Byte[inlen]; Byte[] OutBuf = new Byte[outlen]; int ret = 0, temp_inlen; HexStringToByteArray(InString, ref InBuf); while (inlen > 0) { if (inlen > MAX_DECLEN) temp_inlen = MAX_DECLEN; else temp_inlen = inlen; for (n = 0; n < temp_inlen; n++) { temp_InBuf[n] = InBuf[incount + n]; } ret = NT_SM2_Dec(temp_InBuf, temp_OutBuf, (Byte)temp_inlen, pin, InPath); for (n = 0; n < (temp_inlen - SM2_ADDBYTE); n++) { OutBuf[outcount + n] = temp_OutBuf[n]; } if (ret != 0) goto err; inlen = inlen - MAX_DECLEN; incount = incount + MAX_DECLEN; outcount = outcount + MAX_ENCLEN; } err: OutString = ByteConvertString(OutBuf); return ret; } public int YtSetPin(string old_pin, string new_pin, string InPath) { int ret; ret = NT_Set_Pin(old_pin, new_pin, InPath); return ret; } private int NT_SetID(Byte[] InBuf, string Path) { int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 7; for (n = 2; n <= 9; n++) { array_in[n] = InBuf[n - 2]; } int ret = TransferData(array_in, 9, ref array_out, 9, Path); if (array_out[0] != 0x0) { return -82; } return ret; } public int SetID(string Seed, string Path) { int ret; int n; Byte[] KeyBuf = new Byte[8]; for (n = 0; n < 8; n++) { KeyBuf[n] = 0; } HexStringToByteArray(Seed, ref KeyBuf); ret = NT_SetID(KeyBuf, Path); return ret; } private int NT_GetProduceDate(ref string OutDate, string Path) { int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 15; int ret = TransferData(array_in, 1, ref array_out, 8, Path); OutDate = ""; for (n = 0; n < 8; n++) { OutDate = OutDate + array_out[n].ToString("X2"); } return ret; } //返回锁的出厂编码 public int GetProduceDate(ref string PDate, string Path) { int ret; ret = NT_GetProduceDate(ref PDate, Path); return ret; } public string SnToProduceDate(string InSn) { string OutString; OutString = (2000 + HexToInt(InSn.Substring(0, 2))).ToString() + "年"; OutString = OutString + (HexToInt(InSn.Substring(2, 2))).ToString() + "月"; OutString = OutString + (HexToInt(InSn.Substring(4, 2))).ToString() + "日"; OutString = OutString + (HexToInt(InSn.Substring(6, 2))).ToString() + "时"; OutString = OutString + (HexToInt(InSn.Substring(8, 2))).ToString() + "分"; OutString = OutString + (HexToInt(InSn.Substring(10, 2))).ToString() + "秒--"; OutString = OutString + "序号:" + HexToInt(InSn.Substring(12, 4)).ToString(); return OutString; } private int y_setcal(Byte[] indata, int address, int nlen, Byte[] password, string Path) { int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; if (nlen > 8) return -87; array_in[1] = 6; array_in[2] = 0; array_in[3] = 0; array_in[4] = (Byte)nlen; for (n = 0; n <= 7; n++) { array_in[5 + n] = password[n]; } for (n = 0; n < nlen; n++) { array_in[13 + n] = indata[n]; } int ret = TransferData(array_in, 13 + nlen, ref array_out, 2, Path); if (array_out[0] != 0) { return -82; } return ret; } public int SetCal(string W_HKey, string W_LKey, string new_HKey, string new_LKey, string Path) { int ret; Byte[] ary1 = new Byte[8]; Byte[] ary2 = new Byte[8]; short address; myconvert(W_HKey, W_LKey, ary1); myconvert(new_HKey, new_LKey, ary2); address = 0; ret = y_setcal(ary2, address, 8, ary1, Path); return ret; } private int NT_SetDisableFlag(Byte Flag, Byte[] password, string Path) { int n; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 0x40; array_in[2] = 0; array_in[3] = 0; array_in[4] = 1; for (n = 0; n <= 7; n++) { array_in[5 + n] = password[n]; } array_in[13] = Flag; int ret = TransferData(array_in, 13 + 1, ref array_out, 2, Path); if (array_out[0] != 0) { return -82; } return ret; } private int NT_GetDisableFlag(ref bool isDisableFlag, string Path) { isDisableFlag = false; Byte[] array_in = new Byte[257]; Byte[] array_out = new Byte[257]; array_in[1] = 0x41; int ret = TransferData(array_in, 1, ref array_out, 2, Path); if (array_out[0] != 0) { return -82; } if (array_out[1] == 0xe5) isDisableFlag = true; return ret; } public int SetDisableFlag(bool isDisableFlag, string HKey, string LKey, string Path) { int ret; Byte Flag = 0; Byte[] ary = new Byte[8]; myconvert(HKey, LKey, ary); if (isDisableFlag) Flag = 0xE5; ret = NT_SetDisableFlag(Flag, ary, Path); return ret; } public int GetDisableFlag(ref bool isDisableFlag, string Path) { int ret; ret = NT_GetDisableFlag(ref isDisableFlag, Path); return ret; } public void memset(Byte[] buf, int pos, Byte val, int size) { int n; for (n = pos; n < size; n++) { buf[n] = val; } } private int HanldetransferEx(Byte[] InBuf, int InBufLen, Byte[] OutBuf, int OutBufLen, string Path) { Byte[] t_InBuf = new byte[MAX_BUF_SIZE + 2]; Byte[] t_OutBuf = new byte[MAX_BUF_SIZE + 2]; Array.Copy(InBuf, 0, t_InBuf, 0, InBufLen + 1); int ret = TransferData(t_InBuf, InBufLen, ref t_OutBuf, OutBufLen, Path); if (ret != 0) return ret; Array.Copy(t_OutBuf, 0, OutBuf, 0, OutBufLen); ret = BitConverter.ToInt16(OutBuf, 0); return ret; } public int CheckKeyByFindort_2() { //使用普通算法一查找指定的加密锁 string DevicePath = ""; //用于储存加密锁所在的路径 return FindPort_2(0, 1, 16711934, ref DevicePath); } public int CheckKeyByFindort_3() { //使用普通算法二查找指定的加密锁 string DevicePath = ""; //用于储存加密锁所在的路径 //@NoUseCode_FindPort_3 return 2;//如果这个锁不支持这个功能,直接返回2 return 2; //return FindPort_3(0, 1, 16711934, ref DevicePath); } //使用带长度的方法从指定的地址读取字符串 public int ReadStringEx(int addr, ref string outstring, string DevicePath) { int nlen, ret; byte[] buf = new byte[1]; //先从地址0读到以前写入的字符串的长度 ret = YRead(buf, (short)addr, (short)1, "E1930089", "C7326137", DevicePath); if (ret != 0) return ret; nlen = buf[0]; //再读取相应长度的字符串 return YReadString(ref outstring, addr + 1, nlen, "E1930089", "C7326137", DevicePath); } //使用从储存器读取相应数据的方式检查是否存在指定的加密锁 public int CheckKeyByReadEprom() { int n, ret; string DevicePath = ""; //用于储存加密锁所在的路径 string outstring = ""; return 1; //如果没有使用这个功能,直接返回1 for (n = 0; n < 255; n++) { ret = FindPort(n, ref DevicePath); if (ret != 0) return ret; ret = ReadStringEx(0, ref outstring, DevicePath); if ((ret == 0) && (outstring.CompareTo("") == 0)) return 0; } return -92; } //使用增强算法一检查加密锁,这个方法可以有效地防止仿真 public int CheckKeyByEncstring() { //推荐加密方案:生成随机数,让锁做加密运算,同时在程序中端使用代码做同样的加密运算,然后进行比较判断。 int n, ret; string DevicePath = ""; //用于储存加密锁所在的路径 string InString; //@NoUseKeyEx return 1;//如果没有使用这个功能,直接返回1 System.Random rnd = new System.Random(); InString = rnd.Next(0, 32767).ToString("X") + rnd.Next(0, 32767).ToString("X"); for (n = 0; n < 255; n++) { ret = FindPort(n, ref DevicePath); if (ret != 0) return ret; if (Sub_CheckKeyByEncstring(InString, DevicePath) == 0) return 0; } return -92; } private int Sub_CheckKeyByEncstring(string InString, string DevicePath) { //使用增强算法一对字符串进行加密 int ret; string outstring = ""; string outstring_2; ret = EncString(InString, ref outstring, DevicePath); if (ret != 0) return ret; outstring_2 = StrEnc(InString, "389217D0F16CB88A512E734C70DB4F8E"); if (outstring_2.CompareTo(outstring) == 0) //比较结果是否相符 { ret = 0; } else { ret = -92; } return ret; } //使用增强算法二检查是否存在对应的加密锁 public int CheckKeyByEncstring_New() { int n, ret; string DevicePath = ""; //用于储存加密锁所在的路径 string outstring = ""; System.Random rnd = new System.Random(); int myrnd = rnd.Next(0, 500); String[] EncInString = { "10553", "19783", "19946", "15766", "29138", "17249", "7140", "25299", "29856", "864", "8881", "6675", "3053", "9827", "7918", "5508", "26913", "16430", "23892", "22265", "20167", "12580", "17597", "4582", "27273", "6212", "36", "11611", "20274", "25906", "18593", "26122", "3756", "2608", "20335", "4168", "29694", "19999", "18409", "31234", "23893", "16003", "4488", "27853", "13818", "16763", "486", "20444", "4184", "18379", "20157", "27135", "24566", "7894", "6119", "17320", "21378", "25243", "4447", "10475", "20164", "4031", "19773", "19319", "1190", "13697", "9660", "1185", "12593", "18373", "18231", "14169", "29585", "4366", "23078", "21041", "18447", "17531", "19749", "29020", "8726", "12241", "16110", "8365", "9774", "3440", "2137", "15763", "1027", "30298", "26209", "31010", "28765", "29746", "17440", "31243", "16168", "13114", "9425", "7843", "7533", "21587", "11725", "24279", "27477", "24320", "20621", "20029", "13869", "21347", "5294", "15877", "21084", "23613", "487", "32514", "5486", "8434", "10771", "17318", "12299", "14209", "21292", "8706", "10239", "13966", "16716", "13769", "29234", "26459", "8366", "25164", "11440", "6090", "4011", "13438", "30881", "3164", "18620", "25840", "29778", "4660", "27773", "31189", "21802", "12563", "27559", "2304", "8629", "32091", "4373", "6624", "2971", "2577", "11199", "10121", "27047", "31442", "22720", "17069", "20932", "13796", "27986", "21405", "21243", "13864", "209", "31820", "20342", "32030", "5811", "6732", "30335", "9452", "26773", "26830", "24192", "4688", "20528", "17061", "16132", "18094", "20830", "1091", "19123", "20999", "17433", "3513", "10585", "25854", "7804", "25785", "4575", "726", "24255", "30359", "1103", "21358", "5438", "31298", "9171", "5450", "3698", "29263", "12469", "12172", "7413", "20207", "8799", "25589", "897", "12275", "24923", "8424", "32496", "18125", "8532", "29542", "28732", "22672", "23314", "6419", "9856", "24558", "26241", "12846", "18676", "20280", "13482", "5020", "24820", "29281", "10679", "14557", "1017", "28923", "5874", "22035", "7581", "28727", "21701", "2562", "22937", "21736", "31930", "12298", "11722", "9600", "17276", "21037", "1064", "3088", "29395", "15119", "1228", "30794", "940", "10224", "32753", "24962", "22541", "6834", "30705", "10408", "5411", "19416", "19271", "6735", "7480", "15492", "32396", "4264", "10676", "26743", "9851", "13702", "1314", "6164", "29163", "25690", "25900", "21084", "21466", "11320", "25757", "28402", "19807", "29135", "7518", "18456", "22454", "12660", "25208", "3248", "28215", "24854", "6680", "12859", "14430", "29258", "14213", "1756", "21444", "29760", "21802", "25428", "15907", "21963", "28305", "32005", "24405", "18269", "14949", "22515", "13141", "15623", "9326", "22719", "5180", "4220", "26520", "30377", "9283", "17165", "18412", "3478", "22469", "24493", "27795", "20486", "7997", "31981", "23002", "22812", "12612", "24321", "2857", "24217", "29844", "14777", "11529", "737", "2568", "4744", "30500", "18163", "30359", "17023", "9800", "7283", "27999", "6225", "5723", "6051", "14744", "6735", "31847", "16740", "18587", "26731", "16536", "2362", "21476", "15929", "30775", "22340", "11020", "5354", "32686", "15942", "7629", "25934", "13448", "19874", "1538", "2522", "20333", "858", "29090", "16542", "24105", "24079", "27850", "19789", "23972", "3844", "27572", "15160", "29674", "19482", "21689", "16210", "18980", "16852", "10835", "14893", "1693", "9556", "21788", "23034", "26300", "26203", "3534", "23692", "30991", "333", "26435", "29012", "30525", "28968", "30837", "15206", "16402", "16787", "9855", "29553", "29046", "16589", "3738", "10698", "8822", "20920", "4127", "10337", "15673", "24023", "30345", "29896", "30985", "26444", "17268", "29234", "29779", "15064", "6295", "9074", "28318", "16862", "16845", "3320", "8854", "29791", "24336", "14037", "16387", "27391", "11899", "20158", "1490", "4350", "30278", "27139", "31753", "30270", "3789", "26519", "19925", "16706", "3209", "29196", "17279", "16684", "2580", "8596", "23665", "8126", "4648", "15871", "2358", "13144", "10655", "8386", "1399", "28926", "31090", "14061", "20989", "32339", "6335", "9011", "20147", "25495", "30394", "32741", "29860", "23980", "25794", "16630", "12281", "20501", "16463", "13816", "23036", "22260", "15611", "11292", "21272", "30986", "20096", "12341" }; String[] EncOutString = { "C1E62AA68D77F26C", "382473C34EAFCB90", "9046D801EBC6F987", "FA693CD753862224", "28E488C974B183F5", "A236C8056BC74311", "12DE5A5D0A37E0BB", "7D4B973873D32A7E", "0712AFC4E796F724", "D7773040D01D0B52", "776ADB90595F0407", "FC5E71B4F5D911E1", "6F035CA0D25DE983", "66A85CFE63FD3BBE", "66E583FBEFBC92B6", "D5574F80CF6E9410", "E22699779F27BE0C", "6187E40A7EB277F6", "BC93CBC18B89D9BB", "F5F054BBEC12575E", "C3794A7771F66A40", "17023D941AD4866A", "B03FC0DA94DFD1AC", "8785CF1D1667F073", "B95DF7A5821286D4", "AE8E7B0E9045BACF", "5DB74AB530197B8A", "7668E2D871451EA2", "B6E17097428202A5", "959599240234F50C", "06E5577C18519D22", "D81CFCA41339C658", "95E3C76D2AA0B89A", "223775F6400C09E4", "170FEC2DF4A53B21", "CB6F2FB44E5CC3A5", "188D7C3E77E1E8F0", "6565E19FA93DC971", "898476103159C69F", "BE2E067CFF145CA9", "9C08447205F853B6", "4DEFED252CF6C824", "2695F0B4DA7E83A5", "2350B70EFA87390F", "603DD571FB0D9549", "B08D94399039920F", "4B3F27F00D5598F8", "F75C4EC69BAAE07B", "AB4A41272F043447", "051B199E1F61F0E7", "638F42AE37FB04D1", "9DB172A9138C7FA6", "EF325430E9CD17EF", "34C8A3B8463B0C99", "E475B479998265E7", "664005AE2C7E2536", "8B1A5F87434C712F", "AD6DD3ECAD35ED6D", "1FB00CF2E1D02AF5", "9AA185A2299C5DD0", "3776A6A5134B7F14", "BA55E5BF66E5B14E", "E65824033AE1E6DF", "FA7176107DC7924C", "D348B34E2BB64CDE", "DE7B1049DFFEC1C0", "0CE41D0233218EA8", "1D69487327859BD1", "83E4279C9D4E1388", "CA51085554E8FE2D", "AB87E5F7633985C2", "FCD8B2EDAEE6E8AA", "A5318D85DCABF24C", "658644BBBAEE42D0", "0573EC6BD7F019E3", "5C8B106A7769A6BB", "EA2A24F53CD57BF7", "7B019D9C62E6DF45", "DCCCE86016BC412C", "78B7AC961D4A35F3", "655207DC6D85CB03", "71446A24B87896BF", "C865B9ABF4E3D4E7", "52BA4883758F0B17", "F2B8DD8547C74872", "82C05F46DFD80CA8", "AA14A081C3CE1A37", "51C7D0922697C864", "36C2EAAE3539CBD6", "4C40005B44F82538", "BF546F66114AFA1A", "2F823EC453F4C717", "9565F8F155EFBCDA", "2007A053C5013AF6", "A8624A400C05D5BA", "BC1CC0A1BFA1F0DA", "6A9E8DFF9EE95967", "34E2AFD6AD845052", "F30206A8F05651FF", "D7249CCA67FDA77C", "EAA7AACF0906355F", "1948FB636AD0B240", "F5B77831170E279C", "BF9D5EA9FFC56895", "3116EEC8A0FB0B46", "31D677ECA624375C", "E26CC8EBAB5F2D34", "7532C7424FA1B6D2", "8179159D7AA6EECB", "70DF923D88618F1A", "29EEEEAF541CE27D", "5BE2A73E011E6C7A", "D7AE78369D0EF293", "89B641BB3E44A2C4", "3B166ECFFF78E313", "E757430C97ABED2D", "DBFC50731B1A350C", "91AF88D11AC39C09", "FC564F75D2B30B3D", "1D0DAF06B919FC31", "937F583EAD80D3D4", "C6840C5D73A81C4C", "B2FB75B17BA7BB8D", "E852018DCC07F8FA", "CDEEB7BE769F818A", "7AC0779CCD5B52AD", "D901C86680973AD6", "466FE65AA996EAAF", "32761ECFE13FCBE6", "B5D4D1D066AC420C", "D8B87FEA2FDD97B4", "72BA756CA6E7FD76", "F8793140D31FEB92", "5C78364299061112", "7AAABBFE4960B3F0", "75D095F945A7DBB8", "9C0B76404D58273F", "B0F9AB228C1EF410", "AE6C4F91FE02B1DE", "1C99CE616A229159", "F6C9B7ECFF2F6ECD", "C220AFD378F2E80F", "42367BACDBB66DC0", "DA04974888B8C018", "F39404A5A3070C56", "13887E2AC1FEFB70", "DBFC5EFB1447B93A", "AB246AEF5D7EF830", "5C96A44BC82EB00C", "178A2A70720ADC88", "90FC4555575D3706", "1F28FAF438B06052", "29B226B43F66E5F0", "AC79F224028C6FBE", "81CD83469F8E60E5", "F97B052844950578", "653AA775345A0D41", "7495AF5627B17B2A", "7BAEDE2CA9BCA778", "AC49B94AF2F7D8D5", "8D30814C7229159B", "72FCB739499A32B8", "1CAF5A42931A42F3", "35E822ACCD0775B2", "30AE680F4EDBCC73", "3AB6BCCA4198E19F", "101B8C787CD8DE3D", "FE9C0B22B0DA9168", "D6B2FE5BF1FF178F", "1D17717ED7FB67C9", "E173455B6D362F9D", "CF30BF25A91455BF", "E1A9AE779D5895CF", "D4728D158CD9EE96", "225A201374C7E1B8", "BC52635AF11CAA04", "0C90748256DAB8DA", "EEA7E043E4412880", "24C39C47F02AAFC2", "47D42B5130CC982B", "134ABB1C2C95BF9B", "6EB2396DE7910EEF", "184E1D16BE28BFFB", "C520226B5395B227", "FED1D880638834D6", "5F0537B6AE0D89F8", "81E3742EF183BA69", "2033BB7455913DC1", "2CB46A398182424E", "53803FE9AA33513F", "420D0DA81D3A8504", "0CE95996CD34A382", "7A93D08FD5048C0B", "57387F22E11AA2FC", "9BC169C3A32C1AFA", "6AB950B4E71D434A", "FADDD7A201D9BEBA", "F6D87D6DC316F223", "76E35BC267BF1337", "1C7CFAE2198D1A07", "22BD5502D17A0237", "519AED517AFBCAE0", "34AAACCAE82C9A13", "A2757FAD5626AC5F", "83E926B46AC0C2B5", "8B6B9F38747AB541", "AA1C5EED41130D9B", "DE8FF32A57157F11", "804F7144E792FD11", "E227F2072C0B3155", "5F05958C2A9FDBA2", "B1DA7D580F53E48A", "55910179EFD9E0B0", "811D5F3DD3CBC65D", "AE5CA8292B50BB53", "57A2241F414FBCAD", "2888E24602379D83", "F584BF1B9077F85F", "EE181E416EBBC002", "ED1347DC7429CFB4", "5D97CF65CE4D9EC0", "890D53425BF94CED", "0BA292D19CE5148A", "84D2D04602A834BD", "A73B33BE5068864F", "83B360BE49849BA7", "663576163C51F342", "46D2F349DF191ECD", "A0B46B0C18920C55", "D9A4290F4B9F217A", "1C5FC778190ACB4E", "B95B1364B7E7EECD", "ED40DC41F5BFC3AB", "5B157E859FD59169", "C20BA26FD8276496", "D34932A94F9CE8BE", "851DC76D0E03802F", "05510909416351D3", "30BD565075997975", "CFCF79ACD1718353", "90395E844546B8B0", "95A04192C4A99D52", "AB0F8AEA1FBEED05", "B7AE633E5E5B0B9D", "35223BD9EF30AFA2", "8FCD116A4085E1F2", "841F30FF22B171AA", "9C8D7D3C8F2A62AB", "BA05E5F44937CA77", "311CFACDD6F06F9D", "C171FE410BE63E31", "03814B11FFB87D3E", "BC68642D76C89F09", "8756CC7ED9D75FF6", "6757414D8C78E34B", "6F938EE4BFEFCF39", "2D3A13C3F233037E", "938570777EC3A30D", "9728AE4D851E81A1", "C2555FD6E19C3F38", "D51F5C01CBB65D31", "A5C7117E6CBD972E", "00B0242C804B8154", "0EC21FD2D9043834", "5D71C1F8B2792BF8", "2F8DC1EDA72C1652", "1338A3790D2424BB", "CD626189FF05FF86", "C51FEDF73205DF8E", "AB27F7448A83A9CE", "0D46289E4D15E0FB", "B99FCF3F39E65B81", "E6F0A1169CBD1441", "8997DDCE1478D784", "5B581D25972CEF76", "2F7E2C8EA3AE100B", "A5CA820BEC458A34", "BA04897779586515", "CFC2D99BBFA57BC3", "3289C26E0D2A8DCE", "3DAF4091DEDD9D52", "D7AE78369D0EF293", "D3A3CA54DEE75273", "BC49B70EC956A03F", "597ED794EAB95D5F", "5546CC4FEB26D549", "7D2A20B6CDA86BB5", "CF5D90FF1AF85083", "D60759480D68671D", "449DCFABD01FA9A8", "2C300F3C0D32C8B1", "A8C29C56B46E5A97", "5E562AABD22414AC", "EAA77EBE4AFA7198", "4D36EE5BF46B2FC8", "2A13AE8CEE6AA8FF", "5C624ABA4135BA8F", "491D6550F48D1126", "A117FA84167472D5", "153364AA485FF4FD", "CC901986B08E6F4D", "3225378A5AF745BB", "01A8746A2B7E7182", "10FD8BCC6839F641", "F39404A5A3070C56", "CC4281C870E98FAC", "C32DD966C0911ECD", "75D53D58DA0A70C5", "D84144D87358F716", "4420E1E870AC1AC7", "EEC04DAFE6659C67", "1EE6ED19E6D1F548", "10088800D9EA8484", "BA0E440265568FC3", "6A79A4027DC9D4C7", "7D564FAD598FD71E", "F7775FAE079EB4C9", "E3013B5B058573BB", "2D5FF3FB6874560C", "66909ED4393E998E", "3FDD7F237A882F4E", "82463C64AC7D665E", "C79F95A4A56C81C8", "329526DD264F8A07", "3E277CE73B1DD6B6", "AA76F8BB4839C72D", "88806A6CF45F5439", "0254BDF538B70B99", "97B37E0DD8EEA2BD", "49E03A838A5C4FFE", "F83A31773938C4ED", "0F9314BAED157FE3", "59C738EB7CE00FBC", "9CFC7E5908186F73", "A36065CCDE877BB4", "1EAAA733468A6019", "360FC0E131E4CC1C", "25607B762A1912F6", "151FA7D6B6C38BFB", "1DCF229C02EE920C", "E44F1A0FAECCA2E4", "BA77D98DE2255D16", "E8E1FFEF014D8191", "6757AB22B326D8D7", "CAFB058DB98410BE", "CDF2CB6724C8A377", "6AB950B4E71D434A", "DEBD85FCF06FE7FC", "F8D4DED46C08C557", "F336CE213892CDF0", "B8286C2A9BC957A4", "2066C93EDF7A3C10", "B86B77DBFF5E837F", "87CBCC5F55CF43FD", "BC4A994D13CA2CD9", "CD626189FF05FF86", "B74A74ADB51394D8", "B9822A1A2109D936", "E5868A2E179903C1", "388903BA3E36418D", "95EB34D874063AD6", "8C8C66A7CE733BB0", "7BBF7CC10AFEBDE9", "43F108D358DBF0D4", "4395B49A18044F2A", "CF5109A9A6983D7F", "C61E7854F2169888", "BE6EB2FB54D6ECA8", "14728C58CD3E799E", "A375923C1A54C8A5", "7AB48632CE35A523", "FCE6BBCE9CCC676E", "8BB67E5E0AFA1592", "285B1FF5FF6784FE", "277A4FAD4B6DB505", "76BAE9F2EA376065", "B29823DC293436F9", "D2FA7FA7483B3A92", "D66E7F06AE8FD2B2", "BF9AE5AFDC703102", "3F0FFD22EDEE952C", "E628DAF8829B1997", "0E32DA43088F068E", "2D1927F21BBBB9DA", "49F7AA07DAF523BA", "C8F8FDCDD0CED748", "BFEDFBF17219D73C", "17FAD1D1923D5FB9", "9FEF66E3274DDB91", "1001FA3B5AE5AD0C", "79E86333D9152ED6", "2EB1C753BAB7DA0D", "94CD99C3D1295F28", "F4AD081B7327C65B", "AFF84D2307E0004A", "8C4D945B235DF70D", "9430D196ED501BF0", "885D1E52A651F72B", "86762B897D2D7DC8", "BA49CEEB36979C54", "3346D32437F20BA7", "D8D72F656297CF6E", "109C0C7EFBBAFF8A", "B16E1D9A13EC8ED0", "0FA523D673D40F8D", "44C4A24338491722", "BB9BD15CB1D218AA", "D05C80DCC2FABD6F", "E4E1E9670EEB8EF1", "21262FFB226D913B", "736D33A1261A6665", "FD35A67BA0EAFD5B", "AFE2C45CCE183477", "D809EB8109C693FA", "D2F1DDFE9B55FCB0", "6C2344567DBED2B5", "4422B3FCE37C6A74", "245FE0EE6155E84B", "F0216CBD4B5FACEA", "7B74C39A819F9565", "8DB23551362C3CA0", "E6422F1BA2AF21B9", "EFA99BF359C6EFDC", "A295DD974B576A0E", "8BC3564BEE4C6301", "50E38A69412D0CDD", "157D4D5E98CBBB34", "9C926329C9F6A489", "B1D222A23E86CD08", "C411C62E8DF23668", "DD19D9775EB46262", "32761ECFE13FCBE6", "084417836778EB4D", "F15829D37A7314E5", "4F7B06B15FEE2707", "10DB3275004C79AD", "BEAA74A8913D0445", "E008EA199670C28E", "676C34B32958D680", "76E4A9FE97A497A1", "6CB7F4D7E13CC00B", "A12251D86CC4F5DF", "586393DAE93A348A", "A15E06F138A6D461", "AA580F9FD8DD4901", "50C5BCD7D0614F0C", "116EA518B037B48A", "A1705FE72C12390B", "953C047DF74D0341", "ABD21234CF9D29E4", "855791A5CC995465", "A012A1A8362E3F2D", "9167CAB444658E1C", "3B623E11D26E55E4", "100A976A19BE9230", "56637BD09EC70A1E", "DF46663A3EE76DE0", "45408E72328A2F53", "A12012445EB86F26", "CC5CF9D0685A8CAD", "5778ECFF8C1C085F", "7094B21B545BBF9E", "6EDADC7C54073FD3", "0CDC5A12BF2EA459", "F05D4B3E557BDAD1", "BB2A498F1666A01E", "0D75D870486661B9", "9362E7108C3D98C1", "06087161793B3368", "2224A28409722E98", "C3387717CFC1AAD6", "CD86078F76A17B9C", "60538B976EA9965C", "D2E25D5D00C9CC01", "4DB3017CA1BE6B53", "B0368AE0514F1247", "4321BE32BB189DF1", "4F83770DE9C5BA09", "F4905FDDB68B6CBF", "8A68A38F955CDA6A", "9BC6971147743E8E", "290222CBED992731", "15638B59E525F5A0", "419FD9CAE4EF021F", "F95A4B6A78DBA7ED", "6146A0CC3DBDB82A", "C6113F6D40D21E50", "90CA7BD1A145331E", "A1E2270416BD555F", "B43D6A9230EAEA2F", "EC57F08BF05A0EEC", "1F59C2EA1721D03D", "7F56DB73A960CD06", "79CBDFDADA190B10", "7DD10E9EFB3C0351", "C1CCB89780B9C8C9", "A97D417450C5AE3C", "B5767CE314B55F4C", "576E5F13051AD639", "F277D3FA64CBC89B" }; //@NoUseNewKeyEx return 1;//如果没有使用这个功能,直接返回1 //@NoSupNewKeyEx return 2;//如果该锁不支持这个功能,直接返回2 for (n = 0; n < 255; n++) { ret = FindPort(n, ref DevicePath); if (ret != 0) return ret; ret = EncString_New(EncInString[myrnd], ref outstring, DevicePath); if ((ret == 0) && (outstring.CompareTo(EncOutString[myrnd]) == 0)) return 0; } return -92; } } }