Sample code for 30+ languages & platforms
DataFlex

Hungary NAV Invoicing Signature Calculation

See more Hungary NAV Invoicing Examples

Demonstrates the requestSignature calculation for the Hungarian NAV Online Invoicing System REST API v2.0.

Note: This example requires Chilkat v9.5.0.83 or greater.

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoCrypt
    String sRequestId
    String sTimestamp
    String sSignatureKey
    Handle hoSbFinalHashBase
    Integer iNumReplaced
    String sInvoiceOperation
    String sInvoiceData
    Handle hoSbHashBase
    String sFirstHash
    String sSecondHash
    String sRequestSignature
    String sTemp1

    Move False To iSuccess

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

    // This example performs the following calculation:

    // 1.5.1 Calculations for manageInvoice and manageAnnulment operations
    // 
    // For the manageInvoice and manageAnnulment operations comprising the core of requestSignature, 
    // requestSignature is calculated using partial authentication, concatenating the hash values for 
    // indices 1-100 as well as additional SHA3-512 hash operations. The partial authentication can be 
    // derived by concatenating the following values:
    // 
    //   - requestId value
    //   - UTC timestamp tag value using a YYYYMMDDhhmmss mask
    //   - string literal of the technical user�s signature key
    // 
    // When concatenating, the date and time separators as well as the time zone must be removed for timestamp masking.
    // 
    // The index hash value can be derived from the uppercase SHA3-512 hash values following the concatenation of the 
    // operation and base64 content for the individual indices:
    // 
    //   - literal value of invoiceOperation or annulmentOperation
    //   - base64 content in the invoiceData or invoiceAnnulment tag
    // 
    // The calculated hash values should be appended after the partial hash, in the order corresponding to the indices. 
    // The SHA3-512 hash result (capitals) of the string thus concatenated yields the requestSignature value.
    // 
    // A fictitious example for request data:
    // 
    // 	- requestId = TSTKFT1222564
    // 	- timestamp = 2017-12-30T18:25:45.000Z
    // 	- technical user�s signature key = ce-8f5e-215119fa7dd621DLMRHRLH2S
    // 	- the index#1 invoice data items
    // 	- invoiceOperation = CREATE
    // 	- invoiceData = QWJjZDEyMzQ=
    // 	- the index#2 invoice data items
    // 	- invoiceOperation = MODIFY
    // 	- invoiceData = RGNiYTQzMjE=
    // 	- partial authentication value = TSTKFT122256420171230182545ce-8f5e-215119fa7dd621DLMRHRLH2S
    // 	- the first index hash =
    // 		- hash base = CREATEQWJjZDEyMzQ=
    // 		- lowercase hash = 4317798460962869bc67f07c48ea7e4a3afa301513ceb87b8eb94ecf92bc220a89c480f87f0860e85e29a3b6c0463d4f29712c5ad48104a6486ce839dc2f24cb
    // 		- uppercase hash = 4317798460962869BC67F07C48EA7E4A3AFA301513CEB87B8EB94ECF92BC220A89C480F87F0860E85E29A3B6C0463D4F29712C5AD48104A6486CE839DC2F24CB
    // 	- the second index hash =
    // 		- hash base = MODIFYRGNiYTQzMjE=
    // 		- lowercase hash = a881218238933f6ffb9e167445cb4daa9749bcf484fde48ab7649fd25e8b634a4736a65a7c4a8e2831119f739837e006566f97370415aad55e268605206f2a6c
    // 		- uppercase hash = A881218238933F6FFB9E167445CB4DAA9749BCF484FDE48AB7649FD25E8B634A4736A65A7C4A8E2831119F739837E006566F97370415AAD55E268605206F2A6C
    // 
    // Thus, the base for the entire requestSignature is:
    // 	TSTKFT122256420171230182545ce-8f5e-215119fa7dd621DLMRHRLH2S4317798460962869BC67F07C48EA7E4A3AFA301513CEB87B8EB94ECF92BC220A89C480F87F0860E85E29A3B6C0463D4F29712C5AD48104A6486CE839DC2F24CBA881218238933F6FFB9E167445CB4DAA9749BCF484FDE48AB7649FD25E8B634A4736A65A7C4A8E2831119F739837E006566F97370415AAD55E268605206F2A6C
    // 
    // Value of requestSignature after SHA3-512 hashing and converting to uppercase:
    // 	60BC80609EE3B8F42FE904200A49A1921A1DADA08D55319ACD40C59F626514B74EEA49011D372600A10DBCF8199D590DA9C2841D987308F2D83DAE17C2470C42
    // 
    // -------------------

    Get Create (RefClass(cComChilkatCrypt2)) To hoCrypt
    If (Not(IsComObjectCreated(hoCrypt))) Begin
        Send CreateComObject of hoCrypt
    End

    // IMPORTANT: This example requires Chilkat v9.5.0.83 or greater.  The SHA3 hash algorithm is implemented in Chilkat v9.5.0.83, but not in earlier versions.
    // IMPORTANT: This example requires Chilkat v9.5.0.83 or greater.  The SHA3 hash algorithm is implemented in Chilkat v9.5.0.83, but not in earlier versions.
    // IMPORTANT: This example requires Chilkat v9.5.0.83 or greater.  The SHA3 hash algorithm is implemented in Chilkat v9.5.0.83, but not in earlier versions.
    // IMPORTANT: This example requires Chilkat v9.5.0.83 or greater.  The SHA3 hash algorithm is implemented in Chilkat v9.5.0.83, but not in earlier versions.
    // IMPORTANT: This example requires Chilkat v9.5.0.83 or greater.  The SHA3 hash algorithm is implemented in Chilkat v9.5.0.83, but not in earlier versions.
    Set ComHashAlgorithm Of hoCrypt To "sha3-512"
    Set ComEncodingMode Of hoCrypt To "hex"

    Move "TSTKFT1222564" To sRequestId
    Move "2017-12-30T18:25:45.000Z" To sTimestamp
    Move "ce-8f5e-215119fa7dd621DLMRHRLH2S" To sSignatureKey

    // Step 1: Concatenate requestId, UTC timestamp, and user's signature key.
    Get Create (RefClass(cComChilkatStringBuilder)) To hoSbFinalHashBase
    If (Not(IsComObjectCreated(hoSbFinalHashBase))) Begin
        Send CreateComObject of hoSbFinalHashBase
    End

    // First append the timestamp because we are going to remove certain chars/parts.
    Get ComAppend Of hoSbFinalHashBase sTimestamp To iSuccess
    Get ComReplace Of hoSbFinalHashBase ".000Z" "" To iNumReplaced
    Get ComReplace Of hoSbFinalHashBase "-" "" To iNumReplaced
    Get ComReplace Of hoSbFinalHashBase ":" "" To iNumReplaced
    Get ComReplace Of hoSbFinalHashBase "T" "" To iNumReplaced

    // Prepend the requestId and append the signatureKey
    Get ComPrepend Of hoSbFinalHashBase sRequestId To iSuccess
    Get ComAppend Of hoSbFinalHashBase sSignatureKey To iSuccess

    // Step 2: Calculate first index hash.
    Move "CREATE" To sInvoiceOperation
    Move "QWJjZDEyMzQ=" To sInvoiceData

    Get Create (RefClass(cComChilkatStringBuilder)) To hoSbHashBase
    If (Not(IsComObjectCreated(hoSbHashBase))) Begin
        Send CreateComObject of hoSbHashBase
    End
    Get ComAppend Of hoSbHashBase sInvoiceOperation To iSuccess
    Get ComAppend Of hoSbHashBase sInvoiceData To iSuccess
    Get ComGetAsString Of hoSbHashBase To sTemp1
    Showln "first hash base = " sTemp1

    Get ComGetAsString Of hoSbHashBase To sTemp1
    Get ComHashStringENC Of hoCrypt sTemp1 To sFirstHash
    Showln "first hash = " sFirstHash

    // Output should be:
    // first hash base = CREATEQWJjZDEyMzQ=
    // first hash = 4317798460962869BC67F07C48EA7E4A3AFA301513CEB87B8EB94ECF92BC220A89C480F87F0860E85E29A3B6C0463D4F29712C5AD48104A6486CE839DC2F24CB

    // Step 3: Calculate second index hash.
    Move "MODIFY" To sInvoiceOperation
    Move "RGNiYTQzMjE=" To sInvoiceData

    Send ComClear To hoSbHashBase
    Get ComAppend Of hoSbHashBase sInvoiceOperation To iSuccess
    Get ComAppend Of hoSbHashBase sInvoiceData To iSuccess
    Get ComGetAsString Of hoSbHashBase To sTemp1
    Showln "second hash base = " sTemp1

    Get ComGetAsString Of hoSbHashBase To sTemp1
    Get ComHashStringENC Of hoCrypt sTemp1 To sSecondHash
    Showln "second hash = " sSecondHash

    // Output should be:
    // second hash base = MODIFYRGNiYTQzMjE=
    // second hash = A881218238933F6FFB9E167445CB4DAA9749BCF484FDE48AB7649FD25E8B634A4736A65A7C4A8E2831119F739837E006566F97370415AAD55E268605206F2A6C

    // Step 4: Append the uppercase hex hashes to the sbFinalHashBase
    Get ComAppend Of hoSbFinalHashBase sFirstHash To iSuccess
    Get ComAppend Of hoSbFinalHashBase sSecondHash To iSuccess
    Get ComGetAsString Of hoSbFinalHashBase To sTemp1
    Showln "sbFinalHashBase = " sTemp1

    // Step 5: SHA3-512 hash to get the requestSignature
    Get ComGetAsString Of hoSbFinalHashBase To sTemp1
    Get ComHashStringENC Of hoCrypt sTemp1 To sRequestSignature
    Showln "requestSignature = " sRequestSignature

    // Output should be:
    // requestSignature = 60BC80609EE3B8F42FE904200A49A1921A1DADA08D55319ACD40C59F626514B74EEA49011D372600A10DBCF8199D590DA9C2841D987308F2D83DAE17C2470C42


End_Procedure