Cleanup
This commit is contained in:
parent
5ff385bf74
commit
82cd604c2f
190
mdl/m_crypt.pas
190
mdl/m_crypt.pas
|
@ -4,8 +4,10 @@ Unit m_Crypt;
|
||||||
|
|
||||||
Interface
|
Interface
|
||||||
|
|
||||||
// merge in m_Crc, rewrite googled and shitty hextobyte function
|
// m_CRC should be merged into this
|
||||||
|
|
||||||
|
Function B64Encode (S: String) : String;
|
||||||
|
Function B64Decode (S: String) : String;
|
||||||
Function HMAC_MD5 (Text, Key: String) : String;
|
Function HMAC_MD5 (Text, Key: String) : String;
|
||||||
Function MD5 (Const Value: String) : String;
|
Function MD5 (Const Value: String) : String;
|
||||||
Function Digest2String (Digest: String) : String;
|
Function Digest2String (Digest: String) : String;
|
||||||
|
@ -28,41 +30,70 @@ Type
|
||||||
BufLong : array[0..15] of Integer;
|
BufLong : array[0..15] of Integer;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
// rewrite the terribad functions now that this stuff is working
|
Const
|
||||||
|
B64Codes = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||||
|
|
||||||
function HexToByte (Hex: String) : byte;
|
Function B64Encode (S: String) : String;
|
||||||
var
|
Var
|
||||||
n, n2, sayi: Integer;
|
I : Integer;
|
||||||
|
A : Integer;
|
||||||
|
X : Integer;
|
||||||
|
B : Integer;
|
||||||
Begin
|
Begin
|
||||||
n := 0;
|
Result := '';
|
||||||
n2 := 0;
|
A := 0;
|
||||||
|
B := 0;
|
||||||
|
|
||||||
Case Hex[1] Of
|
For I := 1 to Length(S) Do Begin
|
||||||
'A','a': n:= 10;
|
X := Byte(S[I]);
|
||||||
'B','b': n:= 11;
|
B := B * 256 + X;
|
||||||
'C','c': n:= 12;
|
A := A + 8;
|
||||||
'D','d': n:= 13;
|
|
||||||
'E','e': n:= 14;
|
While A >= 6 Do Begin
|
||||||
'F','f': n:= 15;
|
A := A - 6;
|
||||||
|
X := B DIV (1 SHL a);
|
||||||
|
B := B MOD (1 SHL a);
|
||||||
|
Result := Result + B64Codes[X + 1];
|
||||||
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If Hex[1] in ['0','1','2','3','4','5','6','7','8','9'] Then
|
If A > 0 Then Begin
|
||||||
n := strS2I(Hex[1]);
|
X := B SHL (6 - A);
|
||||||
|
Result := Result + B64Codes[X + 1];
|
||||||
|
|
||||||
Case Hex[2] Of
|
If A = 4 Then Result := Result + '=';
|
||||||
'A','a': n2:= 10;
|
If A = 2 Then Result := Result + '==';
|
||||||
'B','b': n2:= 11;
|
End;
|
||||||
'C','c': n2:= 12;
|
|
||||||
'D','d': n2:= 13;
|
|
||||||
'E','e': n2:= 14;
|
|
||||||
'F','f': n2:= 15;
|
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If Hex[2] in ['0','1','2','3','4','5','6','7','8','9'] Then
|
Function B64Decode (S: String) : String;
|
||||||
n2 := strS2I(Hex[2]);
|
Var
|
||||||
|
I : Integer;
|
||||||
|
A : Integer;
|
||||||
|
X : Integer;
|
||||||
|
B : Integer;
|
||||||
|
Begin
|
||||||
|
Result := '';
|
||||||
|
A := 0;
|
||||||
|
B := 0;
|
||||||
|
|
||||||
sayi := n * 16 + n2;
|
For I := 1 to Length(S) Do Begin
|
||||||
Result := sayi;
|
X := Pos(s[I], B64Codes) - 1;
|
||||||
|
|
||||||
|
If X >= 0 Then Begin
|
||||||
|
B := B * 64 + X;
|
||||||
|
A := A + 6;
|
||||||
|
|
||||||
|
If A >= 8 Then Begin
|
||||||
|
A := A - 8;
|
||||||
|
X := B SHR A;
|
||||||
|
B := B MOD (1 SHL A);
|
||||||
|
X := X MOD 256;
|
||||||
|
Result := Result + Chr(X);
|
||||||
|
End;
|
||||||
|
End Else
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function Digest2String (Digest: String) : String;
|
Function Digest2String (Digest: String) : String;
|
||||||
|
@ -85,7 +116,7 @@ Begin
|
||||||
Count := 1;
|
Count := 1;
|
||||||
|
|
||||||
While Count < Length(Str) Do Begin
|
While Count < Length(Str) Do Begin
|
||||||
Result := Result + Char(HexToByte(Copy(Str, Count, 2)));
|
Result := Result + Char(strH2I(Copy(Str, Count, 2)));
|
||||||
Inc (Count, 2);
|
Inc (Count, 2);
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
@ -136,12 +167,12 @@ Begin
|
||||||
|
|
||||||
Inc(Count[0], InputLen shl 3);
|
Inc(Count[0], InputLen shl 3);
|
||||||
|
|
||||||
if Count[0] < (InputLen shl 3) then
|
If Count[0] < (InputLen shl 3) then
|
||||||
Inc(Count[1]);
|
Inc(Count[1]);
|
||||||
|
|
||||||
Inc(Count[1], InputLen shr 29);
|
Inc(Count[1], InputLen shr 29);
|
||||||
|
|
||||||
partLen := 64 - Index;
|
PartLen := 64 - Index;
|
||||||
|
|
||||||
if InputLen >= partLen then begin
|
if InputLen >= partLen then begin
|
||||||
ArrLongToByte(BufLong, BufAnsiChar);
|
ArrLongToByte(BufLong, BufAnsiChar);
|
||||||
|
@ -163,47 +194,48 @@ Begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Index := 0;
|
Index := 0;
|
||||||
end else
|
End Else
|
||||||
I := 0;
|
I := 0;
|
||||||
|
|
||||||
ArrLongToByte(BufLong, BufAnsiChar);
|
ArrLongToByte(BufLong, BufAnsiChar);
|
||||||
Move(Data[I+1], BufAnsiChar[Index], InputLen-I);
|
Move(Data[I+1], BufAnsiChar[Index], InputLen-I);
|
||||||
ArrByteToLong(BufAnsiChar, BufLong);
|
ArrByteToLong(BufAnsiChar, BufLong);
|
||||||
end
|
End
|
||||||
end;
|
End;
|
||||||
|
|
||||||
procedure MD5Transform(var Buf: array of LongInt; const Data: array of LongInt);
|
Procedure MD5Transform (Var Buf: Array of LongInt; const Data: Array of LongInt);
|
||||||
var
|
Var
|
||||||
A, B, C, D: LongInt;
|
A, B, C, D: LongInt;
|
||||||
|
|
||||||
procedure Round1(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
|
Procedure Round1 (Var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
|
||||||
begin
|
Begin
|
||||||
Inc(W, (Z xor (X and (Y xor Z))) + Data);
|
Inc(W, (Z xor (X and (Y xor Z))) + Data);
|
||||||
W := (W shl S) or (W shr (32 - S));
|
W := (W shl S) or (W shr (32 - S));
|
||||||
Inc(W, X);
|
Inc(W, X);
|
||||||
end;
|
End;
|
||||||
|
|
||||||
procedure Round2(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
|
Procedure Round2 (Var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
|
||||||
begin
|
Begin
|
||||||
Inc(W, (Y xor (Z and (X xor Y))) + Data);
|
Inc(W, (Y xor (Z and (X xor Y))) + Data);
|
||||||
W := (W shl S) or (W shr (32 - S));
|
W := (W shl S) or (W shr (32 - S));
|
||||||
Inc(W, X);
|
Inc(W, X);
|
||||||
end;
|
End;
|
||||||
|
|
||||||
procedure Round3(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
|
Procedure Round3 (Var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
|
||||||
begin
|
Begin
|
||||||
Inc(W, (X xor Y xor Z) + Data);
|
Inc(W, (X xor Y xor Z) + Data);
|
||||||
W := (W shl S) or (W shr (32 - S));
|
W := (W shl S) or (W shr (32 - S));
|
||||||
Inc(W, X);
|
Inc(W, X);
|
||||||
end;
|
End;
|
||||||
|
|
||||||
procedure Round4(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
|
Procedure Round4 (Var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
|
||||||
begin
|
Begin
|
||||||
Inc(W, (Y xor (X or not Z)) + Data);
|
Inc(W, (Y xor (X or not Z)) + Data);
|
||||||
W := (W shl S) or (W shr (32 - S));
|
W := (W shl S) or (W shr (32 - S));
|
||||||
Inc(W, X);
|
Inc(W, X);
|
||||||
end;
|
End;
|
||||||
begin
|
|
||||||
|
Begin
|
||||||
A := Buf[0];
|
A := Buf[0];
|
||||||
B := Buf[1];
|
B := Buf[1];
|
||||||
C := Buf[2];
|
C := Buf[2];
|
||||||
|
@ -281,20 +313,20 @@ begin
|
||||||
Inc (Buf[1], B);
|
Inc (Buf[1], B);
|
||||||
Inc (Buf[2], C);
|
Inc (Buf[2], C);
|
||||||
Inc (Buf[3], D);
|
Inc (Buf[3], D);
|
||||||
end;
|
End;
|
||||||
|
|
||||||
function MDFinal(var MDContext: TMDCtx; transform: TMDTransform): string;
|
Function MDFinal (Var MDContext: TMDCtx; Transform: TMDTransform) : String;
|
||||||
var
|
Var
|
||||||
Cnt : Word;
|
Cnt : Word;
|
||||||
P : Byte;
|
P : Byte;
|
||||||
digest: array[0..15] of Byte;
|
Digest : Array[0..15] of Byte;
|
||||||
i: Integer;
|
I : Integer;
|
||||||
n: integer;
|
N : Integer;
|
||||||
begin
|
Begin
|
||||||
for I := 0 to 15 do
|
For I := 0 to 15 Do
|
||||||
Digest[I] := I + 1;
|
Digest[I] := I + 1;
|
||||||
|
|
||||||
with MDContext do begin
|
With MDContext Do Begin
|
||||||
Cnt := (Count[0] shr 3) and $3F;
|
Cnt := (Count[0] shr 3) and $3F;
|
||||||
P := Cnt;
|
P := Cnt;
|
||||||
BufAnsiChar[P] := $80;
|
BufAnsiChar[P] := $80;
|
||||||
|
@ -309,16 +341,16 @@ begin
|
||||||
Transform(State, BufLong);
|
Transform(State, BufLong);
|
||||||
ArrLongToByte(BufLong, BufAnsiChar);
|
ArrLongToByte(BufLong, BufAnsiChar);
|
||||||
|
|
||||||
for n := 0 to 55 do
|
For N := 0 to 55 Do
|
||||||
BufAnsiChar[n] := 0;
|
BufAnsiChar[N] := 0;
|
||||||
|
|
||||||
ArrByteToLong(BufAnsiChar, BufLong);
|
ArrByteToLong(BufAnsiChar, BufLong);
|
||||||
end else begin
|
End Else Begin
|
||||||
for n := 0 to Cnt - 8 - 1 do
|
For N := 0 to Cnt - 8 - 1 Do
|
||||||
BufAnsiChar[p + n] := 0;
|
BufAnsiChar[p + n] := 0;
|
||||||
|
|
||||||
ArrByteToLong(BufAnsiChar, BufLong);
|
ArrByteToLong(BufAnsiChar, BufLong);
|
||||||
end;
|
End;
|
||||||
|
|
||||||
BufLong[14] := Count[0];
|
BufLong[14] := Count[0];
|
||||||
BufLong[15] := Count[1];
|
BufLong[15] := Count[1];
|
||||||
|
@ -328,49 +360,49 @@ begin
|
||||||
|
|
||||||
Result := '';
|
Result := '';
|
||||||
|
|
||||||
for i := 0 to 15 do
|
For I := 0 to 15 Do
|
||||||
Result := Result + char(digest[i]);
|
Result := Result + Char(Digest[I]);
|
||||||
end;
|
End;
|
||||||
end;
|
End;
|
||||||
|
|
||||||
function MD5(const Value: string): string;
|
Function MD5 (Const Value: String): String;
|
||||||
var
|
Var
|
||||||
MDContext: TMDCtx;
|
MDContext: TMDCtx;
|
||||||
begin
|
Begin
|
||||||
MDInit (MDContext);
|
MDInit (MDContext);
|
||||||
MDUpdate (MDContext, Value, @MD5Transform);
|
MDUpdate (MDContext, Value, @MD5Transform);
|
||||||
|
|
||||||
Result := MDFinal(MDContext, @MD5Transform);
|
Result := MDFinal(MDContext, @MD5Transform);
|
||||||
end;
|
End;
|
||||||
|
|
||||||
function HMAC_MD5(Text, Key: string): string;
|
Function HMAC_MD5(Text, Key: string): string;
|
||||||
var
|
Var
|
||||||
ipad, opad, s: string;
|
ipad, opad, s: string;
|
||||||
n: Integer;
|
n: Integer;
|
||||||
MDContext: TMDCtx;
|
MDContext: TMDCtx;
|
||||||
begin
|
Begin
|
||||||
if Length(Key) > 64 then
|
If Length(Key) > 64 then
|
||||||
Key := md5(Key);
|
Key := md5(Key);
|
||||||
|
|
||||||
ipad := StringOfChar(#$36, 64);
|
ipad := StringOfChar(#$36, 64);
|
||||||
opad := StringOfChar(#$5C, 64);
|
opad := StringOfChar(#$5C, 64);
|
||||||
|
|
||||||
for n := 1 to Length(Key) do begin
|
For n := 1 to Length(Key) do begin
|
||||||
ipad[n] := char(Byte(ipad[n]) xor Byte(Key[n]));
|
ipad[n] := char(Byte(ipad[n]) xor Byte(Key[n]));
|
||||||
opad[n] := char(Byte(opad[n]) xor Byte(Key[n]));
|
opad[n] := char(Byte(opad[n]) xor Byte(Key[n]));
|
||||||
end;
|
End;
|
||||||
|
|
||||||
MDInit(MDContext);
|
MDInit(MDContext);
|
||||||
MDUpdate(MDContext, ipad, @MD5Transform);
|
MDUpdate(MDContext, ipad, @MD5Transform);
|
||||||
MDUpdate(MDContext, Text, @MD5Transform);
|
MDUpdate(MDContext, Text, @MD5Transform);
|
||||||
|
|
||||||
s := MDFinal(MDContext, @MD5Transform);
|
S := MDFinal(MDContext, @MD5Transform);
|
||||||
|
|
||||||
MDInit(MDContext);
|
MDInit(MDContext);
|
||||||
MDUpdate(MDContext, opad, @MD5Transform);
|
MDUpdate(MDContext, opad, @MD5Transform);
|
||||||
MDUpdate(MDContext, s, @MD5Transform);
|
MDUpdate(MDContext, s, @MD5Transform);
|
||||||
|
|
||||||
Result := MDFinal(MDContext, @MD5Transform);
|
Result := MDFinal(MDContext, @MD5Transform);
|
||||||
end;
|
End;
|
||||||
|
|
||||||
end.
|
End.
|
Loading…
Reference in New Issue