Unicode C
Unicode C
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 Unicode C Downloads
#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)
{
BOOL success;
HCkZipW zip;
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;
success = FALSE;
// 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 = CkZipEntryW_Create();
success = CkZipW_EntryAt(zip,0,entry);
if (success == FALSE) {
wprintf(L"%s\n",CkZipW_lastErrorText(zip));
CkZipW_Dispose(zip);
CkZipEntryW_Dispose(entry);
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));
CkZipW_Dispose(zip);
CkZipEntryW_Dispose(entry);
CkBinDataW_Dispose(bdXml);
return;
}
// First verify the XML digital signature.
dsig = CkXmlDSigW_Create();
success = CkXmlDSigW_LoadSignatureBd(dsig,bdXml);
if (success == FALSE) {
wprintf(L"%s\n",CkXmlDSigW_lastErrorText(dsig));
CkZipW_Dispose(zip);
CkZipEntryW_Dispose(entry);
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 == FALSE) {
wprintf(L"%s\n",CkCertW_lastErrorText(cert));
CkZipW_Dispose(zip);
CkZipEntryW_Dispose(entry);
CkBinDataW_Dispose(bdXml);
CkXmlDSigW_Dispose(dsig);
CkCertW_Dispose(cert);
return;
}
// Get the certificate's public key.
pubKey = CkPublicKeyW_Create();
CkCertW_GetPublicKey(cert,pubKey);
CkXmlDSigW_SetPublicKey(dsig,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);
CkZipEntryW_Dispose(entry);
CkBinDataW_Dispose(bdXml);
CkXmlDSigW_Dispose(dsig);
CkCertW_Dispose(cert);
CkPublicKeyW_Dispose(pubKey);
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);
CkZipEntryW_Dispose(entry);
CkBinDataW_Dispose(bdXml);
CkXmlDSigW_Dispose(dsig);
CkCertW_Dispose(cert);
CkPublicKeyW_Dispose(pubKey);
CkCrypt2W_Dispose(crypt);
CkBinDataW_Dispose(bdHash);
CkXmlW_Dispose(xml);
}