flohogun2
  • flohogun2
  • 61.25% (Friendly)
  • Member Topic Starter
10 years ago
Hello,

With the CAPICOM SDK I m able to retrieve for a certificat Email and Serial number :

ISignedDataPtr oSignedData = NULL;
ISignerPtr oSigner = oSignedData->Signers->Item[1];
_bstr_t bstrMail=oSigner->Certificate->GetInfo(CAPICOM_CERT_INFO_SUBJECT_EMAIL_NAME);
_bstr_t bstrSerial=oSigner->Certificate->SerialNumber;


Is it possible to do the same with the EAGetMailObjLib::ICertificatePtr?

Best regards,

florent
ivan
  • ivan
  • 100% (Exalted)
  • Administration
10 years ago
I am sorry it doesn't support this feature. I will add those features at next version.

However, you can implement it like this in your code:

include the following headers:


#include <Wincrypt.h>
#pragma comment( lib, "Crypt32.lib" )



//oCert is EAGetMailObjLib::ICertitificatePtr;
	
	// get serial number
	PCERT_CONTEXT pCertContext = (PCERT_CONTEXT)oCert->Handle;
	int len = pCertContext->pCertInfo->SerialNumber.cbData;
	TCHAR* pszSerial = new TCHAR[2*len+1];
	pszSerial[2*len] = _T('\0');
	TCHAR* pszBuf = pszSerial;

	for( int i = len-1; i >= 0 ; i-- )
	{
		::_stprintf( pszBuf, _T("%02x"), pCertContext->pCertInfo->SerialNumber.pbData[i] );
		pszBuf +=2;
	}
	//pszSerial is the serial number
	// please use delete [] pszSerial to free the memory.

	delete [] pszSerial;

	// get email address;
	DWORD dwOut = 0;
	dwOut = ::CertGetNameString(
		pCertContext,
		CERT_NAME_EMAIL_TYPE, 
		0,
		0,
		NULL,
		0 );

	if( dwOut == 0 )
	{
		DWORD dwLastError = ::GetLastError();
		return;
	}

	TCHAR* pszEmail = new TCHAR[dwOut+1];
	pszEmail[dwOut] = _T('\0');

	dwOut = ::CertGetNameString(
		pCertContext,
		CERT_NAME_EMAIL_TYPE, 
		0,
		0,
		pszEmail,
		dwOut );

	if( dwOut == 0 )
	{
		DWORD dwLastError = ::GetLastError();
		delete []pszEmail;
		return;
	}

	// please use delete [] szEmail to free the memory.

	delete []pszEmail;
	

EXPLORE TUTORIALS

© All Rights Reserved, AIFEI Software Limited & AdminSystem Software Limited.