/* * Copyright 2002-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * XSEC * * DSIGKeyInfoValue := A value setting * * $Id: DSIGKeyInfoValue.cpp 351208 2005-02-03 12:56:37Z milan $ * */ #include #include #include #include #include #include XERCES_CPP_NAMESPACE_USE DSIGKeyInfoValue::DSIGKeyInfoValue(const XSECEnv * env, DOMNode *valueNode) : DSIGKeyInfo(env), mp_PTextNode(0), mp_QTextNode(0), mp_GTextNode(0), mp_YTextNode(0), mp_modulusTextNode(0), mp_exponentTextNode(0), m_keyInfoType(KEYINFO_NOTSET) { mp_keyInfoDOMNode = valueNode; } DSIGKeyInfoValue::DSIGKeyInfoValue(const XSECEnv * env) : DSIGKeyInfo(env), mp_PTextNode(0), mp_QTextNode(0), mp_GTextNode(0), mp_YTextNode(0), mp_modulusTextNode(0), mp_exponentTextNode(0), m_keyInfoType(KEYINFO_NOTSET) { mp_keyInfoDOMNode = NULL; } DSIGKeyInfoValue::~DSIGKeyInfoValue() { } // -------------------------------------------------------------------------------- // Load from XML // -------------------------------------------------------------------------------- void DSIGKeyInfoValue::load(void) { if (mp_keyInfoDOMNode == NULL || !strEquals(getDSIGLocalName(mp_keyInfoDOMNode), "KeyValue")) { throw XSECException(XSECException::ExpectedDSIGChildNotFound, "Empty or incorrect node passed to DSIGKeyInfoValue"); } DOMNode *child, *p, *val; child = mp_keyInfoDOMNode->getFirstChild(); while (child != NULL && child->getNodeType() != DOMNode::ELEMENT_NODE) child = child->getNextSibling(); //child = findFirstChildOfType(mp_valueNode, DOMNode::ELEMENT_NODE); if (child == 0) { throw XSECException(XSECException::ExpectedDSIGChildNotFound, "Empty Expected value node beneath "); } if (strEquals(getDSIGLocalName(child), "DSAKeyValue")) { m_keyInfoType = KEYINFO_VALUE_DSA; p = findFirstChildOfType(child, DOMNode::ELEMENT_NODE); while (p != NULL) { if (strEquals(getDSIGLocalName(p), "P")) { val = findFirstChildOfType(p, DOMNode::TEXT_NODE); if (val != NULL) { mp_PTextNode = val; } } if (strEquals(getDSIGLocalName(p), "Q")) { val = findFirstChildOfType(p, DOMNode::TEXT_NODE); if (val != NULL) { mp_QTextNode = val; } } if (strEquals(getDSIGLocalName(p), "G")) { val = findFirstChildOfType(p, DOMNode::TEXT_NODE); if (val != NULL) { mp_GTextNode = val; } } if (strEquals(getDSIGLocalName(p), "Y")) { val = findFirstChildOfType(p, DOMNode::TEXT_NODE); if (val != NULL) { mp_YTextNode = val; } } p = p->getNextSibling(); } } else if (strEquals(getDSIGLocalName(child), "RSAKeyValue")) { m_keyInfoType = KEYINFO_VALUE_RSA; p = findFirstChildOfType(child, DOMNode::ELEMENT_NODE); if (p == 0 || !strEquals(getDSIGLocalName(p), "Modulus")) { throw XSECException(XSECException::ExpectedDSIGChildNotFound, "Expected node beneath "); } val = findFirstChildOfType(p, DOMNode::TEXT_NODE); if (val == 0) { throw XSECException(XSECException::ExpectedDSIGChildNotFound, "Expected a text node beneath "); } mp_modulusTextNode = val; // Find the Exponent p = p->getNextSibling(); while (p != 0 && p->getNodeType() != DOMNode::ELEMENT_NODE) p = p->getNextSibling(); if (p == 0 || !strEquals(getDSIGLocalName(p), "Exponent")) { throw XSECException(XSECException::ExpectedDSIGChildNotFound, "Expected node beneath "); } val = findFirstChildOfType(p, DOMNode::TEXT_NODE); if (val == 0) { throw XSECException(XSECException::ExpectedDSIGChildNotFound, "Expected a text node beneath "); } mp_exponentTextNode = val; } else { throw XSECException(XSECException::UnknownKeyValue); } } // -------------------------------------------------------------------------------- // Get RSA Values // -------------------------------------------------------------------------------- const XMLCh* DSIGKeyInfoValue::getRSAModulus(void) { if (m_keyInfoType != KEYINFO_VALUE_RSA) { throw XSECException(XSECException::KeyInfoError, "Attempt to Get an RSA Modulus from a non-RSAValue KeyValue node"); } if (mp_modulusTextNode != NULL) return mp_modulusTextNode->getNodeValue(); return NULL; } const XMLCh * DSIGKeyInfoValue::getRSAExponent(void) { if (m_keyInfoType != KEYINFO_VALUE_RSA) { throw XSECException(XSECException::KeyInfoError, "Attempt to Get an RSA Exponent from a non-RSAValue KeyValue node"); } if (mp_exponentTextNode != NULL) return mp_exponentTextNode->getNodeValue(); return NULL; } // -------------------------------------------------------------------------------- // Create and manipulate DSA Values // -------------------------------------------------------------------------------- DOMElement * DSIGKeyInfoValue::createBlankDSAKeyValue(const XMLCh * P, const XMLCh * Q, const XMLCh * G, const XMLCh * Y) { // Set our type m_keyInfoType = KEYINFO_VALUE_DSA; // Create the DOM Structure safeBuffer str; DOMDocument *doc = mp_env->getParentDocument(); const XMLCh * prefix = mp_env->getDSIGNSPrefix(); makeQName(str, prefix, "KeyValue"); DOMElement *ret = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_keyInfoDOMNode = ret; makeQName(str, prefix, "DSAKeyValue"); DOMElement * dsa = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_env->doPrettyPrint(ret); ret->appendChild(dsa); mp_env->doPrettyPrint(dsa); mp_env->doPrettyPrint(ret); // Now create the value children makeQName(str, prefix, "P"); DOMElement * v = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_PTextNode = doc->createTextNode(P); dsa->appendChild(v); mp_env->doPrettyPrint(dsa); v->appendChild(mp_PTextNode); makeQName(str, prefix, "Q"); v = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_PTextNode = doc->createTextNode(Q); dsa->appendChild(v); mp_env->doPrettyPrint(dsa); v->appendChild(mp_PTextNode); makeQName(str, prefix, "G"); v = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_PTextNode = doc->createTextNode(G); dsa->appendChild(v); mp_env->doPrettyPrint(dsa); v->appendChild(mp_PTextNode); makeQName(str, prefix, "Y"); v = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_PTextNode = doc->createTextNode(Y); dsa->appendChild(v); mp_env->doPrettyPrint(dsa); v->appendChild(mp_PTextNode); return ret; } void DSIGKeyInfoValue::setDSAP(const XMLCh * P) { if (m_keyInfoType != KEYINFO_VALUE_DSA) { throw XSECException(XSECException::KeyInfoError, "Attempt to set a DSA value in a non-DSAValue KeyValue node"); } mp_PTextNode->setNodeValue(P); } void DSIGKeyInfoValue::setDSAQ(const XMLCh * Q) { if (m_keyInfoType != KEYINFO_VALUE_DSA) { throw XSECException(XSECException::KeyInfoError, "Attempt to set a DSA value in a non-DSAValue KeyValue node"); } mp_QTextNode->setNodeValue(Q); } void DSIGKeyInfoValue::setDSAG(const XMLCh * G) { if (m_keyInfoType != KEYINFO_VALUE_DSA) { throw XSECException(XSECException::KeyInfoError, "Attempt to set a DSA value in a non-DSAValue KeyValue node"); } mp_GTextNode->setNodeValue(G); } void DSIGKeyInfoValue::setDSAY(const XMLCh * Y) { if (m_keyInfoType != KEYINFO_VALUE_DSA) { throw XSECException(XSECException::KeyInfoError, "Attempt to set a DSA value in a non-DSAValue KeyValue node"); } mp_YTextNode->setNodeValue(Y); } // -------------------------------------------------------------------------------- // Create and manipulate RSA Values // -------------------------------------------------------------------------------- DOMElement * DSIGKeyInfoValue::createBlankRSAKeyValue(const XMLCh * modulus, const XMLCh * exponent) { // Set our type m_keyInfoType = KEYINFO_VALUE_RSA; // Create the DOM Structure safeBuffer str; DOMDocument *doc = mp_env->getParentDocument(); const XMLCh * prefix = mp_env->getDSIGNSPrefix(); makeQName(str, prefix, "KeyValue"); DOMElement *ret = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_keyInfoDOMNode = ret; makeQName(str, prefix, "RSAKeyValue"); DOMElement * rsa = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_env->doPrettyPrint(ret); ret->appendChild(rsa); mp_env->doPrettyPrint(rsa); mp_env->doPrettyPrint(ret); // Now create the value children makeQName(str, prefix, "Modulus"); DOMElement * v = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_modulusTextNode = doc->createTextNode(modulus); rsa->appendChild(v); mp_env->doPrettyPrint(rsa); v->appendChild(mp_modulusTextNode); makeQName(str, prefix, "Exponent"); v = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer()); mp_exponentTextNode = doc->createTextNode(exponent); rsa->appendChild(v); mp_env->doPrettyPrint(rsa); v->appendChild(mp_exponentTextNode); return ret; } void DSIGKeyInfoValue::setRSAModulus(const XMLCh * modulus) { if (m_keyInfoType != KEYINFO_VALUE_RSA) { throw XSECException(XSECException::KeyInfoError, "Attempt to set an RSA Modulus from a non-RSAValue KeyValue node"); } mp_modulusTextNode->setNodeValue(modulus); } void DSIGKeyInfoValue::setRSAExponent(const XMLCh * exponent) { if (m_keyInfoType != KEYINFO_VALUE_RSA) { throw XSECException(XSECException::KeyInfoError, "Attempt to set an RSA Exponent from a non-RSAValue KeyValue node"); } mp_exponentTextNode->setNodeValue(exponent); } // -------------------------------------------------------------------------------- // Other interface functions // -------------------------------------------------------------------------------- DSIGKeyInfo::keyInfoType DSIGKeyInfoValue::getKeyInfoType(void) { return m_keyInfoType; } const XMLCh * DSIGKeyInfoValue::getKeyName(void) { return DSIGConstants::s_unicodeStrEmpty; }