Sample code for 30+ languages & platforms
Delphi DLL Requires Chilkat v11.0.0+

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
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);