blob: 402c662582ee7040628fc4fd25679c5e9b4c862b [file] [log] [blame]
/*
* 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$
*
*/
#include <xsec/dsig/DSIGKeyInfoValue.hpp>
#include <xsec/utils/XSECPlatformUtils.hpp>
#include <xsec/utils/XSECDOMUtils.hpp>
#include <xsec/framework/XSECException.hpp>
#include <xsec/dsig/DSIGSignature.hpp>
#include <xsec/framework/XSECEnv.hpp>
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 <KeyValue>");
}
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 <Modulus> node beneath <RSAKeyValue>");
}
val = findFirstChildOfType(p, DOMNode::TEXT_NODE);
if (val == 0) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected a text node beneath <Modulus>");
}
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 <Exponent> node beneath <RSAKeyValue>");
}
val = findFirstChildOfType(p, DOMNode::TEXT_NODE);
if (val == 0) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected a text node beneath <Exponent>");
}
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;
}