Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Unicode C) Aadhaar Paperless Offline e-kycOpens 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. For more information, see https://uidai.gov.in/ecosystem/authentication-devices-documents/about-aadhaar-paperless-offline-e-kyc.html
#include <C_CkZipW.h> #include <C_CkZipEntryW.h> #include <C_CkBinDataW.h> #include <C_CkXmlDSigW.h> #include <C_CkCertW.h> #include <C_CkPublicKeyW.h> #include <C_CkCrypt2W.h> #include <C_CkXmlW.h> void ChilkatSample(void) { HCkZipW zip; BOOL success; HCkZipEntryW entry; const wchar_t *sharePhrase; HCkBinDataW bdXml; HCkXmlDSigW dsig; HCkCertW cert; HCkPublicKeyW pubKey; BOOL bVerifyReferenceDigests; BOOL bVerified; HCkCrypt2W crypt; const wchar_t *strToHash; HCkBinDataW bdHash; int numTimesToHash; int i; const wchar_t *tmpStr; HCkXmlW xml; const wchar_t *m_hash; const wchar_t *tmpStr; const wchar_t *e_hash; // 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". zip = CkZipW_Create(); success = CkZipW_OpenZip(zip,L"qa_data/xml_dsig/offline_paperless_kyc.zip"); if (success == FALSE) { wprintf(L"%s\n",CkZipW_lastErrorText(zip)); CkZipW_Dispose(zip); return; } // The .zip should contain 1 XML file. entry = CkZipW_GetEntryByIndex(zip,0); if (CkZipW_getLastMethodSuccess(zip) == FALSE) { wprintf(L"%s\n",CkZipW_lastErrorText(zip)); CkZipW_Dispose(zip); return; } // To get the contents, we need to specify the Share Phrase. sharePhrase = L"Lock@487"; CkZipW_putDecryptPassword(zip,sharePhrase); bdXml = CkBinDataW_Create(); // The XML file will be unzipped into the bdXml object. success = CkZipEntryW_UnzipToBd(entry,bdXml); if (success == FALSE) { wprintf(L"%s\n",CkZipEntryW_lastErrorText(entry)); CkZipEntryW_Dispose(entry); CkZipW_Dispose(zip); CkBinDataW_Dispose(bdXml); return; } CkZipEntryW_Dispose(entry); // First verify the XML digital signature. dsig = CkXmlDSigW_Create(); success = CkXmlDSigW_LoadSignatureBd(dsig,bdXml); if (success != TRUE) { wprintf(L"%s\n",CkXmlDSigW_lastErrorText(dsig)); CkZipW_Dispose(zip); CkBinDataW_Dispose(bdXml); CkXmlDSigW_Dispose(dsig); return; } // 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. cert = CkCertW_Create(); success = CkCertW_LoadFromFile(cert,L"qa_data/xml_dsig/uidai_auth_sign_prod_2023.cer"); if (success != TRUE) { wprintf(L"%s\n",CkCertW_lastErrorText(cert)); CkZipW_Dispose(zip); CkBinDataW_Dispose(bdXml); CkXmlDSigW_Dispose(dsig); CkCertW_Dispose(cert); return; } // Get the certificate's public key. pubKey = CkCertW_ExportPublicKey(cert); success = CkXmlDSigW_SetPublicKey(dsig,pubKey); CkPublicKeyW_Dispose(pubKey); // The XML in this example contains only 1 signature. bVerifyReferenceDigests = TRUE; bVerified = CkXmlDSigW_VerifySignature(dsig,bVerifyReferenceDigests); if (bVerified == FALSE) { wprintf(L"%s\n",CkXmlDSigW_lastErrorText(dsig)); wprintf(L"The signature was not valid.\n"); CkZipW_Dispose(zip); CkBinDataW_Dispose(bdXml); CkXmlDSigW_Dispose(dsig); CkCertW_Dispose(cert); return; } wprintf(L"The XML digital signature is valid.\n"); // 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. crypt = CkCrypt2W_Create(); CkCrypt2W_putHashAlgorithm(crypt,L"sha256"); CkCrypt2W_putEncodingMode(crypt,L"hexlower"); strToHash = L"1234567890Lock@487"; bdHash = CkBinDataW_Create(); success = CkBinDataW_AppendString(bdHash,strToHash,L"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" numTimesToHash = 9; for (i = 1; i <= numTimesToHash; i++) { tmpStr = CkCrypt2W_hashBdENC(crypt,bdHash); CkBinDataW_Clear(bdHash); CkBinDataW_AppendString(bdHash,tmpStr,L"utf-8"); } wprintf(L"Computed Mobile hash = %s\n",CkBinDataW_getString(bdHash,L"utf-8")); // Let's get the mobile hash stored in the XML and compare it with our computed hash. xml = CkXmlW_Create(); success = CkXmlW_LoadBd(xml,bdXml,TRUE); m_hash = CkXmlW_chilkatPath(xml,L"UidData|Poi|(m)"); wprintf(L"Stored Mobile hash = %s\n",m_hash); // Now do the same thing for the email hash: strToHash = L"abc@gm.comLock@487"; CkBinDataW_Clear(bdHash); success = CkBinDataW_AppendString(bdHash,strToHash,L"utf-8"); for (i = 1; i <= numTimesToHash; i++) { tmpStr = CkCrypt2W_hashBdENC(crypt,bdHash); CkBinDataW_Clear(bdHash); CkBinDataW_AppendString(bdHash,tmpStr,L"utf-8"); } wprintf(L"Computed Email hash = %s\n",CkBinDataW_getString(bdHash,L"utf-8")); e_hash = CkXmlW_chilkatPath(xml,L"UidData|Poi|(e)"); wprintf(L"Stored Email hash = %s\n",e_hash); CkZipW_Dispose(zip); CkBinDataW_Dispose(bdXml); CkXmlDSigW_Dispose(dsig); CkCertW_Dispose(cert); CkCrypt2W_Dispose(crypt); CkBinDataW_Dispose(bdHash); CkXmlW_Dispose(xml); } |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.