⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rockey.pas

📁 飞天加密狗dll接口的delphi声明以及处理函数
💻 PAS
字号:
unit rockey;

interface

uses Windows, SysUtils;

type
  // 1. 查找计算机上连接的 Rockey2 加密锁设备
  ET99_Find = function(pid: PChar; var Count: Cardinal): Integer; stdcall;

  // 2. 打开指定的加密锁
  ET99_Open = function(var Handle: THandle; pid: PChar; Index: Cardinal): Integer; stdcall;

  // 3. 关闭指定的加密锁
  ET99_Close = function(Handle: THandle): Integer; stdcall;

  // 4. 验证USERPIN
  ET99_Verify = function(Handle: THandle; flags: Cardinal; pin: PChar): Integer; stdcall;

  // 5. 读取加密锁内容
  ET99_Read = function(Handle: THandle; offset: Cardinal; Len: Cardinal; buffer512: PChar): Integer; stdcall;

  // 6. 写入加密锁内容
  ET99_Write = function(Handle: THandle; offset: Cardinal; Len: Cardinal; buffer512: PChar): Integer; stdcall;

  // 7. 修改USERPIN
  ET99_ChangeUserPIN = function(Handle: THandle; pucOldPIN: PChar; pucNewPIN: PChar): Integer; stdcall;

  // 8. 生成SOPIN
  ET99_GenSoPIN = function(Handle: THandle; SeedLen: Cardinal; pucSeed: PChar; pucNewSoPIN: PChar): Integer; stdcall;

  // 9. 重设USERPIN
  ET99_ResetPIN = function(Handle: THandle; pucSoPIN: PChar): Integer; stdcall;

  // 10. 生成PID
  ET99_GenPid = function(Handle: THandle; SeedLen: Cardinal; pucSeed: PChar; pid: PChar): Integer; stdcall;

  // 11. 设置ET99
  ET99_SetupToken = function(Handle: THandle; bSoPINRetries: Byte; bUserPINRetries: Byte; bUserReadOnly: Boolean; bReserved: Byte): Integer; stdcall;

var
  ET_Find: ET99_Find;
  ET_Open: ET99_Open;
  ET_Close: ET99_Close;
  ET_Verify: ET99_Verify;
  ET_Read: ET99_Read;
  ET_Write: ET99_Write;
  ET_ChangeUserPIN: ET99_ChangeUserPIN;
  ET_GenSoPIN: ET99_GenSoPIN;
  ET_ResetPIN: ET99_ResetPIN;
  ET_GenPid: ET99_GenPid;
  ET_SetupToken: ET99_SetupToken;

const
  AUTO_MODE: Integer = 0;
  HID_MODE: Integer = -1;
  ROCKEY2_DISABLE_WRITE_PROTECT: Integer = 0;
  ROCKEY2_ENABLE_WRITE_PROTECT: Integer = 1;

const
  // 成功,没有错误
  ET_SUCCESS: Integer = 0;

  // 权限不够
  ET_ACCESS_DENY: Integer = $1;

  // 通讯错误,没有打开设备
  ET_COMMUNICATIONS_ERROR: Integer = $2;

  // 给出的参数错误
  ET_INVALID_PARAMETER: Integer = $3;

  // 没有设置PID
  ET_NOT_SET_PID: Integer = $4;

  // 调用 GenUID 功能的时候,给出的 seed 字符串长度超过了 64 个字节(参数错误)
  ET_NOTFOUND_DEVICE: Integer = $5;

  // 无法打开设备
  ET_UNIT_NOT_FOUND: Integer = $5;

  // 试图改写已经写保护的硬件(硬件错误)
  ET_HEAD_ERROR: Integer = $6;

  // 未知错误(Windows 错误)
  ET_UNKNOWN: Integer = $7;

const
  etLibName = 'rockey.dll';

var
  etHandle: THandle = 0;

function OpenET(pid, userPin: string): Integer;
function ReadET(const pid, userPin: string; var Data: string): Integer;
function WriteET(const pid, soPin, userPin, Data: string): Integer;
function ChangeET(const pid, soPin, userPin: string): Integer;

implementation

procedure LoadLib_ET(APath: PChar);
var
  S: string;
  A: array[0..80] of Char;
begin
  if etHandle = 0 then
  begin
    S := APath + etLibName;
    if not FileExists(S) then
    begin
      GetSystemDirectory(PChar(@A), 80);
      S := string(A) + '\' + etLibName;
    end;
    if not FileExists(S) then Exit;
    etHandle := LoadLibrary(PChar(S));
    if etHandle <> 0 then
    begin
      @ET_Find := GetProcAddress(etHandle, 'et_FindToken');
      @ET_Open := GetProcAddress(etHandle, 'et_OpenToken');
      @ET_Close := GetProcAddress(etHandle, 'et_CloseToken');
      @ET_Verify := GetProcAddress(etHandle, 'et_Verify');
      @ET_Read := GetProcAddress(etHandle, 'et_Read');
      @ET_Write := GetProcAddress(etHandle, 'et_Write');
      @ET_ChangeUserPIN := GetProcAddress(etHandle, 'et_ChangeUserPIN');
      @ET_GenSoPIN := GetProcAddress(etHandle, 'et_GenSOPIN');
      @ET_ResetPIN := GetProcAddress(etHandle, 'et_ResetPIN');
      @ET_GenPid := GetProcAddress(etHandle, 'et_GenPID');
      @ET_SetupToken := GetProcAddress(etHandle, 'et_SetupToken');
    end;
  end;
end;

procedure FreeLib_ET;
begin
  if etHandle <> 0 then
  begin
    try
      ET_Close(etHandle);
    except
    end;
    FreeLibrary(etHandle);
  end;
  @ET_Find := nil;
  @ET_Open := nil;
  @ET_Close := nil;
  @ET_Verify := nil;
  @ET_Read := nil;
  @ET_Write := nil;
  @ET_ChangeUserPIN := nil;
  @ET_GenSoPIN := nil;
  @ET_ResetPIN := nil;
  @ET_GenPid := nil;
  @ET_SetupToken := nil;
  etHandle := 0;
end;

function OpenET(pid, userPin: string): Integer;
var
  aCount: Cardinal;
begin
  LoadLib_ET(PChar(ExtractFilePath(ParamStr(0))));

  if (Length(pid) = 0) or (Length(userPin) = 0) then
  begin
    Result := ET_INVALID_PARAMETER;
    Exit;
  end;

  Result := ET_Find(PChar(PID), aCount);
  begin
    if (Result <> 0) then Exit;
  end;

  Result := ET_Open(etHandle, PChar(PID), 1);
  if Result <> 0 then Exit;

  Result := ET_Verify(etHandle, 0, PChar(userPin));
  if Result <> 0 then Exit;
end;

function ChangeET(const pid, soPin, userPin: string): Integer;
var
  aCount: Cardinal;
begin
  LoadLib_ET(PChar(ExtractFilePath(ParamStr(0))));
  try
    if (Length(pid) = 0) or (Length(userPin) = 0) then
    begin
      Result := ET_INVALID_PARAMETER;
      Exit;
    end;

    Result := ET_Find(PChar(PID), aCount);
    begin
      if (Result <> 0) then Exit;
    end;

    Result := ET_Open(etHandle, PChar(PID), 1);
    if Result <> 0 then Exit;

    //恢复密码
    Result := ET_ResetPIN(etHandle, PChar(soPin));
    if Result <> 0 then Exit;

    //重新设置密码
    Result := ET_ChangeUserPIN(etHandle, PChar('FFFFFFFFFFFFFFFF'), PChar(userPin));
    if Result <> 0 then Exit;
  finally
    FreeLib_ET;
  end;
end;

function ReadET(const pid, userPin: string; var Data: string): Integer;
var
  i: Integer;
  buffer: array[0..59] of Char;
begin
  Result := OpenET(pid, userPin);
  try
    if Result <> 0 then Exit;
    Data := '';
    for i := 0 to 10 do
    begin
      Result := ET_Read(etHandle, i * 60, 60, @buffer);
      if Result <> 0 then
      begin
        Data := '';
        Exit;
      end;
      Data := Data + string(buffer);
    end;
  finally
    FreeLib_ET;
  end;
end;

function WriteET(const pid, soPin, userPin, Data: string): Integer;
var
  i: Integer;
begin
  ChangeET(pid, soPin, userPin);

  Result := OpenET(pid, userPin);
  try
    if Result <> 0 then Exit;

    for i := 0 to 10 do
    begin
      Result := ET_Write(etHandle, i * 60, 60, PChar(Copy(Data, i * 60 + 1, 60)));
      if Result <> 0 then Exit;
    end;
  finally
    FreeLib_ET;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -