Visual FoxPro
Visual FoxPro
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 Visual FoxPro Downloads
LOCAL lnSuccess
LOCAL loZip
LOCAL loEntry
LOCAL lcSharePhrase
LOCAL loBdXml
LOCAL loDsig
LOCAL loCert
LOCAL loPubKey
LOCAL lnBVerifyReferenceDigests
LOCAL lnBVerified
LOCAL loCrypt
LOCAL lcStrToHash
LOCAL loBdHash
LOCAL lnNumTimesToHash
LOCAL i
LOCAL lcTmpStr
LOCAL loXml
LOCAL lcM_hash
LOCAL lcTmpStr
LOCAL lcE_hash
lnSuccess = 0
* 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".
loZip = CreateObject('Chilkat.Zip')
lnSuccess = loZip.OpenZip("qa_data/xml_dsig/offline_paperless_kyc.zip")
IF (lnSuccess = 0) THEN
? loZip.LastErrorText
RELEASE loZip
CANCEL
ENDIF
* The .zip should contain 1 XML file.
loEntry = CreateObject('Chilkat.ZipEntry')
lnSuccess = loZip.EntryAt(0,loEntry)
IF (lnSuccess = 0) THEN
? loZip.LastErrorText
RELEASE loZip
RELEASE loEntry
CANCEL
ENDIF
* To get the contents, we need to specify the Share Phrase.
lcSharePhrase = "Lock@487"
loZip.DecryptPassword = lcSharePhrase
loBdXml = CreateObject('Chilkat.BinData')
* The XML file will be unzipped into the bdXml object.
lnSuccess = loEntry.UnzipToBd(loBdXml)
IF (lnSuccess = 0) THEN
? loEntry.LastErrorText
RELEASE loZip
RELEASE loEntry
RELEASE loBdXml
CANCEL
ENDIF
* First verify the XML digital signature.
loDsig = CreateObject('Chilkat.XmlDSig')
lnSuccess = loDsig.LoadSignatureBd(loBdXml)
IF (lnSuccess = 0) THEN
? loDsig.LastErrorText
RELEASE loZip
RELEASE loEntry
RELEASE loBdXml
RELEASE loDsig
CANCEL
ENDIF
* 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.
loCert = CreateObject('Chilkat.Cert')
lnSuccess = loCert.LoadFromFile("qa_data/xml_dsig/uidai_auth_sign_prod_2023.cer")
IF (lnSuccess = 0) THEN
? loCert.LastErrorText
RELEASE loZip
RELEASE loEntry
RELEASE loBdXml
RELEASE loDsig
RELEASE loCert
CANCEL
ENDIF
* Get the certificate's public key.
loPubKey = CreateObject('Chilkat.PublicKey')
loCert.GetPublicKey(loPubKey)
loDsig.SetPublicKey(loPubKey)
* The XML in this example contains only 1 signature.
lnBVerifyReferenceDigests = 1
lnBVerified = loDsig.VerifySignature(lnBVerifyReferenceDigests)
IF (lnBVerified = 0) THEN
? loDsig.LastErrorText
? "The signature was not valid."
RELEASE loZip
RELEASE loEntry
RELEASE loBdXml
RELEASE loDsig
RELEASE loCert
RELEASE loPubKey
CANCEL
ENDIF
? "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.
loCrypt = CreateObject('Chilkat.Crypt2')
loCrypt.HashAlgorithm = "sha256"
loCrypt.EncodingMode = "hexlower"
lcStrToHash = "1234567890Lock@487"
loBdHash = CreateObject('Chilkat.BinData')
lnSuccess = loBdHash.AppendString(lcStrToHash,"utf-8")
* 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"
lnNumTimesToHash = 9
FOR i = 1 TO lnNumTimesToHash
lcTmpStr = loCrypt.HashBdENC(loBdHash)
loBdHash.Clear()
loBdHash.AppendString(lcTmpStr,"utf-8")
NEXT
? "Computed Mobile hash = " + loBdHash.GetString("utf-8")
* Let's get the mobile hash stored in the XML and compare it with our computed hash.
loXml = CreateObject('Chilkat.Xml')
lnSuccess = loXml.LoadBd(loBdXml,1)
lcM_hash = loXml.ChilkatPath("UidData|Poi|(m)")
? "Stored Mobile hash = " + lcM_hash
* Now do the same thing for the email hash:
lcStrToHash = "abc@gm.comLock@487"
loBdHash.Clear()
lnSuccess = loBdHash.AppendString(lcStrToHash,"utf-8")
FOR i = 1 TO lnNumTimesToHash
lcTmpStr = loCrypt.HashBdENC(loBdHash)
loBdHash.Clear()
loBdHash.AppendString(lcTmpStr,"utf-8")
NEXT
? "Computed Email hash = " + loBdHash.GetString("utf-8")
lcE_hash = loXml.ChilkatPath("UidData|Poi|(e)")
? "Stored Email hash = " + lcE_hash
RELEASE loZip
RELEASE loEntry
RELEASE loBdXml
RELEASE loDsig
RELEASE loCert
RELEASE loPubKey
RELEASE loCrypt
RELEASE loBdHash
RELEASE loXml