2025-03-28 09:49:56 +08:00

265 lines
9.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security;
using SuperMap.RealEstate.SecurityDevice.UsbKey; //SecurityDevice.Core
namespace SuperMap.RealEstate.SecurityDevice
{
public class UsbKeyLicenseDevice : ClientSecurityDevice
{
UsbKey2000 _UsbKey2000 = new UsbKey2000();
string _KeyPath = string.Empty;
string _Message = string.Empty;
const string PassWord_Default = "FFFFFFFF";
const string PassWord_Read = "QPWOEIRU";
const string PassWord_Write = "UTMSJDEF";
#region Open
public override Boolean Open(int index = 0)
{
//Message = "正在查找数字证书...";
//判断系统中是否存在着加密锁。
if (_UsbKey2000.FindPort(index, ref _KeyPath) != 0)
{
Message = "请插入数字证书。";
return false;
}
Message = "成功找到数字证书。";
return true;
}
#endregion
public override bool Close(int index = 0)
{
//为带容量的版本预留
return base.Close(index);
}
#region Version
public override string Version
{
get
{
short _Version = 0;
if (_UsbKey2000.NT_GetIDVersion(ref _Version, _KeyPath) != 0)
{
return string.Empty;
}
return _Version.ToString();
}
}
#endregion
#region Reset
public override Boolean Reset(int length = 500)
{
Message = "正在初始化数字证书...";
if (!ResetPassWord())
return false;
if (!ResetDevice(length))
return false;
Message = "成功初始化数字证书。";
return true;
}
#endregion
#region ReadDeviceLength
private int ReadDeviceLength(int start, int length)
{
string _value = ReadDevice(start, length);
int _TempLength = 0;
if (!int.TryParse(_value, out _TempLength))
_TempLength = 0;
return _TempLength;
}
#endregion
#region ReadDevice
private string ReadDevice(int start, int length)
{
string _value = string.Empty;
if (_UsbKey2000.YReadString(ref _value, start, length, PassWord_Read, PassWord_Read, _KeyPath) != 0)
return string.Empty;
_value = _value.Trim();
return _value;
}
#endregion
#region WriteDevice
private bool WriteDevice(string value, int start, ref int lastIndex)
{
int _Length = UsbKey2000.lstrlenA(value);
//写入位置
if (_UsbKey2000.YWriteString(value, start, PassWord_Write, PassWord_Write, _KeyPath) != 0)
{
Message = "写入数字证书失败。";
return false;
}
lastIndex = start + _Length;
return true;
}
#endregion
#region ResetInfo
private bool ResetInfo(int start, int length, ref int lastIndex)
{
int _Length = ReadDeviceLength(start, length);
string _Str = "0";
_Str = _Str.PadRight(length, ' ');
WriteDevice(_Str, start, ref _Length);
_Str = "";
_Str = _Str.PadRight(_Length, ' ');
return WriteDevice(_Str, lastIndex, ref lastIndex);
}
#endregion
#region ResetDevice
private bool ResetDevice(int length )
{
//Message = "正在重置数据...";
int _Length = ClientSecurityDeviceObject.StartIndex;
if (!ResetInfo(ClientSecurityDeviceObject.StartIndex_Name, ClientSecurityDeviceObject.Length_Name, ref _Length) ||
!ResetInfo(ClientSecurityDeviceObject.StartIndex_User, ClientSecurityDeviceObject.Length_User, ref _Length) ||
!ResetInfo(ClientSecurityDeviceObject.StartIndex_Key, ClientSecurityDeviceObject.Length_Key, ref _Length) ||
!ResetInfo(ClientSecurityDeviceObject.StartIndex_Date, ClientSecurityDeviceObject.Length_Date, ref _Length) ||
!ResetInfo(ClientSecurityDeviceObject.StartIndex_Url, ClientSecurityDeviceObject.Length_Url, ref _Length))
{
Message = "重置数字证书「数据区」失败。";
return false;
}
#region length位置为空白
string _Str = "";
_Str = _Str.PadRight(length, ' ');
if (WriteDevice(_Str, ClientSecurityDeviceObject.StartIndex, ref _Length) == false)
{
Message = "重置数字证书「数据区」失败。";
return false;
}
#endregion
//Message = "成功重置数据。";
return true;
}
#endregion
#region ResetPassWord
private bool ResetPassWord()
{
//重置写入密码
//Message = "正在重置密码...";
if ((_UsbKey2000.SetWritePassword(PassWord_Write, PassWord_Write,
PassWord_Default, PassWord_Default, _KeyPath) != 0) &&
(_UsbKey2000.SetWritePassword(PassWord_Default, PassWord_Default,
PassWord_Default, PassWord_Default, _KeyPath) != 0))
{
Message = "重置写入密码失败。";
return false;
}
//设置写入密码
//Message = "正在设置新密码...";
if (_UsbKey2000.SetWritePassword(PassWord_Default, PassWord_Default,
PassWord_Write, PassWord_Write, _KeyPath) != 0)
{
Message = "设置写入密码失败。";
return false;
}
//设置读取密码
if (_UsbKey2000.SetReadPassword(PassWord_Write, PassWord_Write,
PassWord_Read, PassWord_Read, _KeyPath) != 0)
{
Message = "设置读取密码失败。";
return false;
}
//Message = "成功重置密码。";
return true;
}
#endregion
#region Read
public override bool Read(out ClientSecurityDeviceObject keyInfo)
{
keyInfo = new ClientSecurityDeviceObject();
try
{
Message = "正在读取数字证书...";
int _Length = ClientSecurityDeviceObject.StartIndex;
keyInfo.Name = ReadInfo(ClientSecurityDeviceObject.StartIndex_Name, ClientSecurityDeviceObject.Length_Name, ref _Length);
keyInfo.User = ReadInfo(ClientSecurityDeviceObject.StartIndex_User, ClientSecurityDeviceObject.Length_User, ref _Length);
keyInfo.Key = ReadInfo(ClientSecurityDeviceObject.StartIndex_Key, ClientSecurityDeviceObject.Length_Key, ref _Length);
keyInfo.Date = ReadInfo(ClientSecurityDeviceObject.StartIndex_Date, ClientSecurityDeviceObject.Length_Date, ref _Length);
keyInfo.Url = ReadInfo(ClientSecurityDeviceObject.StartIndex_Url, ClientSecurityDeviceObject.Length_Url, ref _Length);
//Message = ReadDevice(0, 500);
Message = "成功读取数字证书。";
return true;
}
catch (Exception ex)
{
Message = "读取数字证书失败," + ex.Message;
return true;
}
}
#endregion
#region Write
public override bool Write(ClientSecurityDeviceObject keyInfo,string password)
{
Message = "正在写入数字证书...";
if (password != "SuperMap.RealEstate.SecurityDevices")
{
Message = "写入数字证书失败「密钥错误」";
}
int _Length = ClientSecurityDeviceObject.StartIndex;
if (!WriteInfo(keyInfo.Name, ClientSecurityDeviceObject.StartIndex_Name, ref _Length) ||
!WriteInfo(keyInfo.User, ClientSecurityDeviceObject.StartIndex_User, ref _Length) ||
!WriteInfo(keyInfo.Key, ClientSecurityDeviceObject.StartIndex_Key, ref _Length) ||
!WriteInfo(keyInfo.Date, ClientSecurityDeviceObject.StartIndex_Date, ref _Length) ||
!WriteInfo(keyInfo.Url, ClientSecurityDeviceObject.StartIndex_Url, ref _Length))
{
Message = "写入数字证书失败。";
return false;
}
Message = "成功写入数字证书。";
return true;
}
#endregion
#region WriteInfo
private bool WriteInfo(string value, int keyStart, ref int valueStart)
{
int _Length = UsbKey2000.lstrlenA(value);
if (WriteDevice(_Length.ToString(), keyStart, ref _Length) == false)
return false;
if (WriteDevice(value, valueStart, ref valueStart) == false)
return false;
return true;
}
#endregion
#region ReadInfo
private string ReadInfo(int keyStart, int keyLength, ref int valueStart)
{
string _Str = ReadDevice(keyStart, keyLength);
int _Length = 0;
if (!int.TryParse(_Str, out _Length))
{
throw new Exception("位置控制标识应该为数字。");
}
_Str = ReadDevice(valueStart, _Length);
valueStart += UsbKey2000.lstrlenA(_Str);
return _Str;
}
#endregion
}
}