in xsec/enc/WinCAPI/WinCAPICryptoKeyDSA.cpp [578:674]
void WinCAPICryptoKeyDSA::loadParamsFromKey(void) {
if (m_key == 0) {
if (m_keySpec == 0)
return;
// See of we can get the user key
if (!CryptGetUserKey(m_p, m_keySpec, &m_key))
return;
}
// Export key into a keyblob
BOOL fResult;
DWORD blobLen;
fResult = CryptExportKey(
m_key,
0,
PUBLICKEYBLOB,
0,
NULL,
&blobLen);
if (fResult == 0 || blobLen < 1) {
throw XSECCryptoException(XSECCryptoException::DSAError,
"WinCAPI:DSA - Error exporting public key");
}
BYTE * blob;
XSECnew(blob, BYTE[blobLen]);
ArrayJanitor<BYTE> j_blob(blob);
fResult = CryptExportKey(
m_key,
0,
PUBLICKEYBLOB,
0,
blob,
&blobLen);
if (fResult == 0 || blobLen < 1) {
throw XSECCryptoException(XSECCryptoException::DSAError,
"WinCAPI:DSA - Error exporting public key");
}
DSSPUBKEY * pk = (DSSPUBKEY *) ( blob + WINCAPI_BLOBHEADERLEN );
DWORD keyLen = pk->bitlen / 8;
// Copy the keys
BYTE * i = (BYTE *) ( pk );
i += WINCAPI_DSSPUBKEYLEN;
if (mp_P != NULL)
delete[] mp_P;
XSECnew(mp_P, BYTE[keyLen]);
memcpy(mp_P, i, keyLen);
m_PLen = keyLen;
i+=keyLen;
if (mp_Q != NULL)
delete[] mp_Q;
m_QLen = 20;
while (i[m_QLen - 1] == 0 && m_QLen > 0)
m_QLen--;
XSECnew(mp_Q, BYTE[m_QLen]);
memcpy(mp_Q, i, m_QLen);
i+=20;
if (mp_G != NULL)
delete[] mp_G;
m_GLen = keyLen;
while(i[m_GLen - 1] == 0 && m_GLen > 0)
m_GLen--;
XSECnew(mp_G, BYTE[m_GLen]);
memcpy(mp_G, i, m_GLen);
i+=keyLen;
if (mp_Y != NULL)
delete[] mp_Y;
m_YLen = keyLen;
while (i[m_YLen] == 0 && m_YLen > 0)
m_YLen--;
XSECnew(mp_Y, BYTE[m_YLen]);
memcpy(mp_Y, i, m_YLen);
}