DataFlex
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
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