DataFlex
DataFlex
Aadhaar Paperless Offline e-kyc
See more XML Digital Signatures Examples
Opens an encrypted .zip containing Aadhaar Paperless Offline e-KYC XML. Gets the XML and validates the digital signature. Then computes the hash for the mobile number and Email ID.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoZip
Variant vEntry
Handle hoEntry
String sSharePhrase
Variant vBdXml
Handle hoBdXml
Handle hoDsig
Handle hoCert
Variant vPubKey
Handle hoPubKey
Boolean iBVerifyReferenceDigests
Boolean iBVerified
Handle hoCrypt
String sStrToHash
Variant vBdHash
Handle hoBdHash
Integer iNumTimesToHash
Integer i
String sTmpStr
Handle hoXml
String sM_hash
String sTmpStr
String sE_hash
String sTemp1
Move False To iSuccess
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// Open the .zip containing the Aadhaar Paperless Offline e-KYC XML.
// The .zip is encrypted using the "Share Phrase".
Get Create (RefClass(cComChilkatZip)) To hoZip
If (Not(IsComObjectCreated(hoZip))) Begin
Send CreateComObject of hoZip
End
Get ComOpenZip Of hoZip "qa_data/xml_dsig/offline_paperless_kyc.zip" To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoZip To sTemp1
Showln sTemp1
Procedure_Return
End
// The .zip should contain 1 XML file.
Get Create (RefClass(cComChilkatZipEntry)) To hoEntry
If (Not(IsComObjectCreated(hoEntry))) Begin
Send CreateComObject of hoEntry
End
Get pvComObject of hoEntry to vEntry
Get ComEntryAt Of hoZip 0 vEntry To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoZip To sTemp1
Showln sTemp1
Procedure_Return
End
// To get the contents, we need to specify the Share Phrase.
Move "Lock@487" To sSharePhrase
Set ComDecryptPassword Of hoZip To sSharePhrase
Get Create (RefClass(cComChilkatBinData)) To hoBdXml
If (Not(IsComObjectCreated(hoBdXml))) Begin
Send CreateComObject of hoBdXml
End
// The XML file will be unzipped into the bdXml object.
Get pvComObject of hoBdXml to vBdXml
Get ComUnzipToBd Of hoEntry vBdXml To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoEntry To sTemp1
Showln sTemp1
Procedure_Return
End
// First verify the XML digital signature.
Get Create (RefClass(cComChilkatXmlDSig)) To hoDsig
If (Not(IsComObjectCreated(hoDsig))) Begin
Send CreateComObject of hoDsig
End
Get pvComObject of hoBdXml to vBdXml
Get ComLoadSignatureBd Of hoDsig vBdXml To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoDsig To sTemp1
Showln sTemp1
Procedure_Return
End
// The UIDAI XML signature does not contain the KeyInfo, so we must load the uidai certificate
// and indicate that its public key is to be used for verifying the signature.
Get Create (RefClass(cComChilkatCert)) To hoCert
If (Not(IsComObjectCreated(hoCert))) Begin
Send CreateComObject of hoCert
End
Get ComLoadFromFile Of hoCert "qa_data/xml_dsig/uidai_auth_sign_prod_2023.cer" To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoCert To sTemp1
Showln sTemp1
Procedure_Return
End
// Get the certificate's public key.
Get Create (RefClass(cComChilkatPublicKey)) To hoPubKey
If (Not(IsComObjectCreated(hoPubKey))) Begin
Send CreateComObject of hoPubKey
End
Get pvComObject of hoPubKey to vPubKey
Get ComGetPublicKey Of hoCert vPubKey To iSuccess
Get pvComObject of hoPubKey to vPubKey
Get ComSetPublicKey Of hoDsig vPubKey To iSuccess
// The XML in this example contains only 1 signature.
Move True To iBVerifyReferenceDigests
Get ComVerifySignature Of hoDsig iBVerifyReferenceDigests To iBVerified
If (iBVerified = False) Begin
Get ComLastErrorText Of hoDsig To sTemp1
Showln sTemp1
Showln "The signature was not valid."
Procedure_Return
End
Showln "The XML digital signature is valid."
// Let's compute the hash for the Mobile Number.
// Hashing logic for Mobile Number :
// Sha256(Sha256(Mobile+SharePhrase))*number of times last digit of Aadhaar number
// (Ref ID field contains last 4 digits).
//
// Example :
// Mobile: 1234567890
// Aadhaar Number:XXXX XXXX 3632
// Passcode : Lock@487
// Hash: Sha256(Sha256(1234567890Lock@487))*2
// In case of Aadhaar number ends with Zero we will hashed one time.
Get Create (RefClass(cComChilkatCrypt2)) To hoCrypt
If (Not(IsComObjectCreated(hoCrypt))) Begin
Send CreateComObject of hoCrypt
End
Set ComHashAlgorithm Of hoCrypt To "sha256"
Set ComEncodingMode Of hoCrypt To "hexlower"
Move "1234567890Lock@487" To sStrToHash
Get Create (RefClass(cComChilkatBinData)) To hoBdHash
If (Not(IsComObjectCreated(hoBdHash))) Begin
Send CreateComObject of hoBdHash
End
Get ComAppendString Of hoBdHash sStrToHash "utf-8" To iSuccess
// Hash a number of times equal to the last digit of your Aadhaar number.
// If the Aadhaar number ends with 0, then hash one time.
// For this example, we'll just set the number of times to hash
// for the case where an Aadhaar number ends in "9"
Move 9 To iNumTimesToHash
For i From 1 To iNumTimesToHash
Get pvComObject of hoBdHash to vBdHash
Get ComHashBdENC Of hoCrypt vBdHash To sTmpStr
Get ComClear Of hoBdHash To iSuccess
Get ComAppendString Of hoBdHash sTmpStr "utf-8" To iSuccess
Loop
Get ComGetString Of hoBdHash "utf-8" To sTemp1
Showln "Computed Mobile hash = " sTemp1
// Let's get the mobile hash stored in the XML and compare it with our computed hash.
Get Create (RefClass(cComChilkatXml)) To hoXml
If (Not(IsComObjectCreated(hoXml))) Begin
Send CreateComObject of hoXml
End
Get pvComObject of hoBdXml to vBdXml
Get ComLoadBd Of hoXml vBdXml True To iSuccess
Get ComChilkatPath Of hoXml "UidData|Poi|(m)" To sM_hash
Showln "Stored Mobile hash = " sM_hash
// Now do the same thing for the email hash:
Move "abc@gm.comLock@487" To sStrToHash
Get ComClear Of hoBdHash To iSuccess
Get ComAppendString Of hoBdHash sStrToHash "utf-8" To iSuccess
For i From 1 To iNumTimesToHash
Get pvComObject of hoBdHash to vBdHash
Get ComHashBdENC Of hoCrypt vBdHash To sTmpStr
Get ComClear Of hoBdHash To iSuccess
Get ComAppendString Of hoBdHash sTmpStr "utf-8" To iSuccess
Loop
Get ComGetString Of hoBdHash "utf-8" To sTemp1
Showln "Computed Email hash = " sTemp1
Get ComChilkatPath Of hoXml "UidData|Poi|(e)" To sE_hash
Showln "Stored Email hash = " sE_hash
End_Procedure