Skip to content

Commit

Permalink
Add FileHash and SHA256/SHA512 hashing support
Browse files Browse the repository at this point in the history
  • Loading branch information
ollydev committed Jul 9, 2023
1 parent b406c4b commit 9e65e6b
Show file tree
Hide file tree
Showing 8 changed files with 1,883 additions and 13 deletions.
14 changes: 13 additions & 1 deletion Source/Simba.lpi
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@
<PackageName Value="LCL"/>
</Item4>
</RequiredPackages>
<Units Count="174">
<Units Count="177">
<Unit0>
<Filename Value="Simba.lpr"/>
<IsPartOfProject Value="True"/>
Expand Down Expand Up @@ -1080,6 +1080,18 @@
<Filename Value="simba.integermatrix.pas"/>
<IsPartOfProject Value="True"/>
</Unit173>
<Unit174>
<Filename Value="../Third-Party/fpsha512_simba.pas"/>
<IsPartOfProject Value="True"/>
</Unit174>
<Unit175>
<Filename Value="../Third-Party/fpsha256_simba.pas"/>
<IsPartOfProject Value="True"/>
</Unit175>
<Unit176>
<Filename Value="../Third-Party/fphashutils_simba.pas"/>
<IsPartOfProject Value="True"/>
</Unit176>
</Units>
</ProjectOptions>
<CompilerOptions>
Expand Down
6 changes: 6 additions & 0 deletions Source/script/imports/simba/simba.import_file.pas
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,11 @@ procedure _LapeFileSizeInMegaBytes(const Params: PParamArray; const Result: Poin
PSingle(Result)^ := TSimbaFile.FileSizeInMegaBytes(PString(Params^[0])^);
end;

procedure _LapeFileHash(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
begin
PString(Result)^ := TSimbaFile.FileHash(PString(Params^[0])^, PString(Params^[1])^);
end;

procedure _LapePathExists(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
begin
PBoolean(Result)^ := TSimbaPath.PathExists(PString(Params^[0])^);
Expand Down Expand Up @@ -342,6 +347,7 @@ procedure ImportFile(Compiler: TSimbaScript_Compiler);
addGlobalFunc('function FileLastWriteTime(FileName: String): TDateTime', @_LapeFileLastWriteTime);
addGlobalFunc('function FileSize(FileName: String): Int64', @_LapeFileSize);
addGlobalFunc('function FileSizeInMegaBytes(FileName: String): Single', @_LapeFileSizeInMegaBytes);
addGlobalFunc('function FileHash(FileName: String; HashType: String = "SHA1"): String', @_LapeFileHash);

addGlobalFunc('function PathExists(Path: String): Boolean', @_LapePathExists);
addGlobalFunc('function PathNormalize(Path: String): String', @_LapePathNormalize);
Expand Down
18 changes: 8 additions & 10 deletions Source/script/imports/simba/simba.import_hash.pas
Original file line number Diff line number Diff line change
Expand Up @@ -61,21 +61,19 @@ procedure _LapeMD5String(const Params: PParamArray; const Result: Pointer); LAPE
PString(Result)^ := MD5Print(MD5String(PString(Params^[0])^));
end;

procedure _LapeMD5File(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
procedure _LapeSHA1String(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
begin
if FileExists(PString(Params^[0])^) then
PString(Result)^ := MD5Print(MD5File(PString(Params^[0])^));
PString(Result)^ := SHA1Print(SHA1String(PString(Params^[0])^));
end;

procedure _LapeSHA1String(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
procedure _LapeSHA256String(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
begin
PString(Result)^ := SHA1Print(SHA1String(PString(Params^[0])^));
PString(Result)^ := SHA256String(PString(Params^[0])^);
end;

procedure _LapeSHA1File(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
procedure _LapeSHA512String(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
begin
if FileExists(PString(Params^[0])^) then
PString(Result)^ := SHA1Print(SHA1File(PString(Params^[0])^));
PString(Result)^ := SHA512String(PString(Params^[0])^);
end;

procedure _LapeHMACMD5(const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
Expand Down Expand Up @@ -142,9 +140,9 @@ procedure ImportHash(Compiler: TSimbaScript_Compiler);
addGlobalFunc('function BlowFishEncrypt(const Data, Password: String): String', @_LapeBlowFishEncrypt);
addGlobalFunc('function BlowFishDecrypt(const Data, Password: String): String', @_LapeBlowFishDecrypt);
addGlobalFunc('function MD5String(const Data: String): String', @_LapeMD5String);
addGlobalFunc('function MD5File(const FileName: String): String', @_LapeMD5File);
addGlobalFunc('function SHA1String(const Data: String): String', @_LapeSHA1String);
addGlobalFunc('function SHA1File(const FileName: String): String', @_LapeSHA1File);
addGlobalFunc('function SHA256String(const Data: String): String', @_LapeSHA256String);
addGlobalFunc('function SHA512String(const Data: String): String', @_LapeSHA512String);
addGlobalFunc('function HMACMD5(const Key, Message: String): String', @_LapeHMACMD5);
addGlobalFunc('function HMACSHA1(const Key, Message: String): String', @_LapeHMACSHA1);

Expand Down
57 changes: 56 additions & 1 deletion Source/simba.encoding.pas
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,17 @@ function Base64Decode(const Data: String): String;

function GetOTPToken(Secret: String): Integer;

function SHA512String(const Data: String): String;
function SHA512File(const FileName: String): String;

function SHA256String(const Data: String): String;
function SHA256File(const FileName: String): String;

implementation

uses
HMAC, DateUtils, sha1;
HMAC, DateUtils, sha1,
fpsha256_simba, fpsha512_simba, fphashutils_simba;

{$R-}
{$Q-}
Expand Down Expand Up @@ -310,5 +317,53 @@ function GetOTPToken(Secret: String): Integer;
Result := ((Part1 shl 24) or (Part2 shl 16) or (Part3 shl 8) or Part4) mod 1000000;
end;

function SHA512String(const Data: String): String;
begin
TSHA512.DigestHexa(BytesFromVar(@Data[1], Length(Data) * SizeOf(Char)), Result);
end;

function SHA512File(const FileName: String): String;
var
Stream: TFileStream;
begin
Result := '';
if not FileExists(FileName) then
Exit;

Stream := nil;
try
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);

TSHA512.StreamHexa(Stream, Result);
except
end;
if Assigned(Stream) then
Stream.Free();
end;

function SHA256String(const Data: String): String;
begin
TSHA256.DigestHexa(BytesFromVar(@Data[1], Length(Data) * SizeOf(Char)), Result);
end;

function SHA256File(const FileName: String): String;
var
Stream: TFileStream;
begin
Result := '';
if not FileExists(FileName) then
Exit;

Stream := nil;
try
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);

TSHA256.StreamHexa(Stream, Result);
except
end;
if Assigned(Stream) then
Stream.Free();
end;

end.

17 changes: 16 additions & 1 deletion Source/simba.files.pas
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ TSimbaFile = class
class function FileLastWriteTime(FileName: String): TDateTime;
class function FileSize(FileName: String): Int64;
class function FileSizeInMegaBytes(FileName: String): Single;

class function FileHash(FileName: String; HashType: String): String;
end;

TSimbaPath = class
Expand Down Expand Up @@ -92,7 +94,8 @@ implementation
{$IFDEF UNIX}
BaseUnix,
{$ENDIF}
FileUtil, LazFileUtils, Zipper, IniFiles;
FileUtil, LazFileUtils, Zipper, IniFiles,
simba.encoding, md5, sha1;

class function TSimbaDir.DirList(Path: String; Recursive: Boolean): TStringArray;
var
Expand Down Expand Up @@ -458,6 +461,18 @@ class function TSimbaFile.FileSizeInMegaBytes(FileName: String): Single;
Result := FileUtil.FileSize(FileName) / (1024 * 1024);
end;

class function TSimbaFile.FileHash(FileName: String; HashType: String): String;
begin
case HashType.ToUpper() of
'SHA1': Result := SHA1Print(SHA1File(FileName));
'SHA256': Result := SHA256File(FileName);
'SHA512': Result := SHA512File(FileName);
'MD5': Result := MD5Print(MD5File(FileName));
else
SimbaException('Invalid hashtype. Expected: SHA1,SHA256,SHA512,MD5');
end;
end;

procedure ZipFiles(const ArchiveFileName: String; const Files: TStringArray);
var
Zipper: TZipper;
Expand Down
Loading

0 comments on commit 9e65e6b

Please sign in to comment.