Sample code for 30+ languages & platforms
PureBasic

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 PureBasic Downloads

PureBasic
IncludeFile "CkBinData.pb"
IncludeFile "CkPrivateKey.pb"
IncludeFile "CkRsa.pb"
IncludeFile "CkPfx.pb"
IncludeFile "CkCrypt2.pb"

Procedure ChilkatExample()

    success.i = 0

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

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

    ; Get the private key from a pfx file.
    pfx.i = CkPfx::ckCreate()
    If pfx.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPfx::ckLoadPfxFile(pfx,"qa_data/pfx/cert_test123.pfx","test123")
    If success = 0
        Debug CkPfx::ckLastErrorText(pfx)
        CkPfx::ckDispose(pfx)
        ProcedureReturn
    EndIf

    privKey.i = CkPrivateKey::ckCreate()
    If privKey.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPfx::ckPrivateKeyAt(pfx,0,privKey)
    If success = 0
        Debug CkPfx::ckLastErrorText(pfx)
        CkPfx::ckDispose(pfx)
        CkPrivateKey::ckDispose(privKey)
        ProcedureReturn
    EndIf

    ; Create IIC signature according to RSASSA-PKCS-v1_5 using SHA256
    rsa.i = CkRsa::ckCreate()
    If rsa.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkRsa::ckUsePrivateKey(rsa,privKey)
    If success = 0
        Debug CkRsa::ckLastErrorText(rsa)
        CkPfx::ckDispose(pfx)
        CkPrivateKey::ckDispose(privKey)
        CkRsa::ckDispose(rsa)
        ProcedureReturn
    EndIf

    ; PKCS-v1_5 is used by default.
    CkRsa::setCkEncodingMode(rsa, "hex")
    CkRsa::setCkCharset(rsa, "utf-8")
    hexSig.s = CkRsa::ckSignStringENC(rsa,concatenatedParams,"sha256")

    Debug "Signature value result is: " + hexSig

    ; Compute the MD5 hash of the bytes.
    crypt.i = CkCrypt2::ckCreate()
    If crypt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkCrypt2::setCkEncodingMode(crypt, "hex")
    CkCrypt2::setCkHashAlgorithm(crypt, "md5")
    bd.i = CkBinData::ckCreate()
    If bd.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkBinData::ckAppendEncoded(bd,hexSig,"hex")
    md5_summary.s = CkCrypt2::ckHashBdENC(crypt,bd)

    Debug "MD5 summary value is: " + md5_summary


    CkPfx::ckDispose(pfx)
    CkPrivateKey::ckDispose(privKey)
    CkRsa::ckDispose(rsa)
    CkCrypt2::ckDispose(crypt)
    CkBinData::ckDispose(bd)


    ProcedureReturn
EndProcedure