Sample code for 30+ languages & platforms
Delphi DLL

IKOF Generation Code for Montenegro Fiscalization Service

See more _Miscellaneous_ Examples

Demonstrates computing the IKOF MD5 summary value as described in section 4.3 of this document: https://poreskauprava.gov.me/ResourceManager/FileDownload.aspx?rId=416042&rType=2

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Pfx, BinData, PrivateKey, Rsa, Crypt2;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
concatenatedParams: PWideChar;
pfx: HCkPfx;
privKey: HCkPrivateKey;
rsa: HCkRsa;
hexSig: PWideChar;
crypt: HCkCrypt2;
bd: HCkBinData;
md5_summary: PWideChar;

begin
success := False;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

concatenatedParams := '12345678|2019-06-12T17:05:43+02:00|9952|bb123bb1231|cc123cc1231|ss123ss123|199.01';

// Get the private key from a pfx file.
pfx := CkPfx_Create();
success := CkPfx_LoadPfxFile(pfx,'qa_data/pfx/cert_test123.pfx','test123');
if (success = False) then
  begin
    Memo1.Lines.Add(CkPfx__lastErrorText(pfx));
    Exit;
  end;

privKey := CkPrivateKey_Create();
success := CkPfx_PrivateKeyAt(pfx,0,privKey);
if (success = False) then
  begin
    Memo1.Lines.Add(CkPfx__lastErrorText(pfx));
    Exit;
  end;

// Create IIC signature according to RSASSA-PKCS-v1_5 using SHA256
rsa := CkRsa_Create();
success := CkRsa_UsePrivateKey(rsa,privKey);
if (success = False) then
  begin
    Memo1.Lines.Add(CkRsa__lastErrorText(rsa));
    Exit;
  end;

// PKCS-v1_5 is used by default.
CkRsa_putEncodingMode(rsa,'hex');
CkRsa_putCharset(rsa,'utf-8');
hexSig := CkRsa__signStringENC(rsa,concatenatedParams,'sha256');

Memo1.Lines.Add('Signature value result is: ' + hexSig);

// Compute the MD5 hash of the bytes.
crypt := CkCrypt2_Create();
CkCrypt2_putEncodingMode(crypt,'hex');
CkCrypt2_putHashAlgorithm(crypt,'md5');
bd := CkBinData_Create();
CkBinData_AppendEncoded(bd,hexSig,'hex');
md5_summary := CkCrypt2__hashBdENC(crypt,bd);

Memo1.Lines.Add('MD5 summary value is: ' + md5_summary);

CkPfx_Dispose(pfx);
CkPrivateKey_Dispose(privKey);
CkRsa_Dispose(rsa);
CkCrypt2_Dispose(crypt);
CkBinData_Dispose(bd);

end;