unitshatools.pas

来自「Delphi7版飞信GreenFetion源码」· PAS 代码 · 共 67 行

PAS
67
字号
unit UnitSHATools;

interface
uses
  Sysutils;

type
{$IFDEF   VER120}
  dword = longword;
{$ELSE}
  dword = longint;
{$ENDIF}

function LRot16(X: word; c: integer): word; assembler;
function RRot16(X: word; c: integer): word; assembler;
function LRot32(X: dword; c: integer): dword; assembler;
function RRot32(X: dword; c: integer): dword; assembler;
procedure XorBlock(I1, I2, O1: PByteArray; Len: integer);
procedure IncBlock(P: PByteArray; Len: integer);

implementation

function LRot16(X: word; c: integer): word; assembler;
asm
      mov   ecx,&c
      mov   ax,&X
      rol   ax,cl
      mov   &Result,ax
end;

function RRot16(X: word; c: integer): word; assembler;
asm
      mov   ecx,&c
      mov   ax,&X
      ror   ax,cl
      mov   &Result,ax
end;

function LRot32(X: dword; c: integer): dword; register; assembler;
asm
      mov   ecx,   edx
      rol   eax,   cl
end;

function RRot32(X: dword; c: integer): dword; register; assembler;
asm
      mov   ecx,   edx
      ror   eax,   cl
end;

procedure XorBlock(I1, I2, O1: PByteArray; Len: integer);
var
  i: integer;
begin
  for i := 0 to Len - 1 do
    O1[i] := I1[i] xor I2[i];
end;

procedure IncBlock(P: PByteArray; Len: integer);
begin
  Inc(P[Len - 1]);
  if (P[Len - 1] = 0) and (Len > 1) then
    IncBlock(P, Len - 1);
end;

end.

⌨️ 快捷键说明

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