private int ComputeQLength()
{
byte[] blob;
using (SafeNCryptKeyHandle keyHandle = GetDuplicatedKeyHandle())
{
blob = this.ExportKeyBlob(false);
}
unsafe
{
if (blob.Length < sizeof(BCRYPT_DSA_KEY_BLOB_V2))
{
return Sha1HashOutputSize;
}
fixed (byte* pBlobBytes = blob)
{
BCRYPT_DSA_KEY_BLOB_V2* pBlob = (BCRYPT_DSA_KEY_BLOB_V2*)pBlobBytes;
if (pBlob->Magic != KeyBlobMagicNumber.BCRYPT_DSA_PUBLIC_MAGIC_V2 && pBlob->Magic != KeyBlobMagicNumber.BCRYPT_DSA_PRIVATE_MAGIC_V2)
{
// This is a V1 BCRYPT_DSA_KEY_BLOB, which hardcodes the Q length to 20 bytes.
return Sha1HashOutputSize;
}
return pBlob->cbGroupSize;
}
}
}
}