in xsec/utils/XSECAlgorithmSupport.cpp [207:286]
bool XSECAlgorithmSupport::evalSignatureMethod(
const XMLCh* uri, const XSECCryptoKey* key, XSECCryptoHash::HashType& hashType
)
{
if (!key) {
return false;
}
// The easy ones!
if (XMLString::equals(uri, DSIGConstants::s_unicodeStrURIDSA_SHA1)) {
hashType = XSECCryptoHash::HASH_SHA1;
return dynamic_cast<const XSECCryptoKeyDSA*>(key) != NULL;
}
if (XMLString::equals(uri, DSIGConstants::s_unicodeStrURIRSA_SHA1)) {
hashType = XSECCryptoHash::HASH_SHA1;
return dynamic_cast<const XSECCryptoKeyRSA*>(key) != NULL;
}
if (XMLString::equals(uri, DSIGConstants::s_unicodeStrURIHMAC_SHA1)) {
hashType = XSECCryptoHash::HASH_SHA1;
return dynamic_cast<const XSECCryptoKeyHMAC*>(key) != NULL;
}
/* Check to see if we are one of the more exotic RSA signatures */
XMLSize_t cnt = XMLString::stringLen(DSIGConstants::s_unicodeStrURISIGBASEMORE);
if (XMLString::compareNString(uri, DSIGConstants::s_unicodeStrURISIGBASEMORE, cnt) == 0) {
// Have a "new" algorithm
if (XMLString::compareNString(&uri[cnt], s_hmac, 4) == 0) {
// HMAC
// Determine a trailing hash method
if (uri[cnt+4] != chDash)
return false;
return dynamic_cast<const XSECCryptoKeyHMAC*>(key) != NULL &&
::getHashType(&(uri[cnt+5]), hashType);
}
else if (XMLString::compareNString(&uri[cnt], s_rsa, 3) == 0) {
// RSA
if (uri[cnt+3] != chDash)
return false;
return dynamic_cast<const XSECCryptoKeyRSA*>(key) != NULL &&
::getHashType(&(uri[cnt+4]), hashType);
}
else if (XMLString::compareNString(&uri[cnt], s_ecdsa, 5) == 0) {
// ECDSA;
if (uri[cnt+5] != chDash)
return false;
return dynamic_cast<const XSECCryptoKeyEC*>(key) != NULL &&
::getHashType(&(uri[cnt+6]), hashType);
}
}
cnt = XMLString::stringLen(DSIGConstants::s_unicodeStrURISIGBASE11);
if (XMLString::compareNString(uri, DSIGConstants::s_unicodeStrURISIGBASE11, cnt) == 0) {
if (XMLString::compareNString(&uri[cnt], s_dsa, 3) == 0) {
// DSA
if (uri[cnt+3] != chDash)
return false;
return dynamic_cast<const XSECCryptoKeyDSA*>(key) != NULL &&
::getHashType(&(uri[cnt+4]), hashType);
}
}
return false;
}