program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Classes
,SysUtils
,ClpDigestUtilities
,ClpIDigest
,ClpCryptoLibTypes
,ClpConverters
,ClpEncoders
,RegExpr
{ you can add units after this };
function Timestamp2Str(const ATimestamp:string):string;
var
re:TRegExpr;
begin
re:=TRegExpr.Create;
try
re.Expression:='(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.\d{1,3})?Z';
re.InputString:=ATimestamp;
if re.Exec then
Result:=re.Match[1]+re.Match[2]+re.Match[3]+re.Match[4]+re.Match[5]+re.Match[6]
else
Result:='';
finally
re.Free;
end;
end;
function SHA3_512(AInput:String):String;
var
LDigest:IDigest;
LInputBytes:TCryptoLibByteArray;
LOutputBytes:TCryptoLibByteArray=();
begin
LDigest:=TDigestUtilities.GetDigest('SHA3-512');
LInputBytes := TConverters.ConvertStringToBytes(AInput, TEncoding.UTF8);
LDigest.BlockUpdate(LInputBytes, 0, Length(LInputBytes));
SetLength(LOutputBytes,LDigest.GetDigestSize);
LDigest.DoFinal(LOutputBytes, 0);
Result:=TConverters.ConvertBytesToHexString(LOutputBytes,False);
end;
function invoiceHash(const AMsg:string; const invoiceOperation: string; const invoiceData:string):string;
var
hash_base:string;
hash_upper:string;
begin
WriteLn(AMsg);
hash_base:=invoiceOperation+invoiceData;
WriteLn('hash_base: ',hash_base);
hash_upper:=SHA3_512(hash_base);
WriteLn('hash_upper: ',hash_upper);
WriteLn;
Result:=hash_upper;
end;
var
requestId:string = 'TSTKFT1222564';
timestamp:string = '2017-12-30T18:25:45.000Z';
{technical user’s signature }key:string = 'ce-8f5e-215119fa7dd621DLMRHRLH2S';
//the index#1 invoice data items
invoiceOperation1:string = 'CREATE';
invoiceData1:string = 'QWJjZDEyMzQ=';
//the index#2 invoice data items
invoiceOperation2:string = 'MODIFY';
invoiceData2:string = 'RGNiYTQzMjE=';
partial_authentication_value:string;
ih:array of string;
base_signature:string;
request_signature:string;
i: Integer;
begin
ih:=[
invoiceHash('First:', invoiceOperation1, invoiceData1),
invoiceHash('Second:', invoiceOperation2, invoiceData2)
];
partial_authentication_value:=requestId+Timestamp2Str(timestamp)+key;
WriteLn('partial authentication value');
WriteLn(partial_authentication_value);
WriteLn('');
base_signature:=partial_authentication_value;
for i:=0 to High(ih) do
base_signature:=base_signature+ih[i];
SetLength(ih,0);
WriteLn('base signature:');
WriteLn(base_signature);
WriteLn('');
request_signature:=SHA3_512(base_signature);
WriteLn('request signature:');
WriteLn(request_signature);
ReadLn;
end.