bool XSECAlgorithmSupport::evalSignatureMethod()

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;
}