blob: eea457f37dfb3943f52f20c2ef36e754d30436d3 [file]
/*
* Copyright 2004-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
*
* XKMSAuthenticationImpl := Implementation of Authentication elements
*
* $Id$
*
*/
#include <xsec/framework/XSECDefs.hpp>
#include <xsec/framework/XSECEnv.hpp>
#include <xsec/framework/XSECError.hpp>
#include <xsec/xkms/XKMSConstants.hpp>
#include <xsec/dsig/DSIGReference.hpp>
#include "XKMSAuthenticationImpl.hpp"
#include "XKMSNotBoundAuthenticationImpl.hpp"
#include <xercesc/dom/DOM.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
XERCES_CPP_NAMESPACE_USE
// --------------------------------------------------------------------------------
// Constructor/Destructor
// --------------------------------------------------------------------------------
XKMSAuthenticationImpl::XKMSAuthenticationImpl(const XSECEnv * env) :
mp_env(env),
mp_authenticationElement(NULL),
mp_keyBindingAuthenticationSignatureElement(NULL),
mp_keyBindingAuthenticationSignature(NULL),
mp_notBoundAuthentication(NULL)
{
}
XKMSAuthenticationImpl::XKMSAuthenticationImpl(const XSECEnv * env, DOMElement * node) :
mp_env(env),
mp_authenticationElement(node),
mp_keyBindingAuthenticationSignatureElement(NULL),
mp_keyBindingAuthenticationSignature(NULL),
mp_notBoundAuthentication(NULL)
{
}
XKMSAuthenticationImpl::~XKMSAuthenticationImpl() {
if (mp_notBoundAuthentication != NULL)
delete mp_notBoundAuthentication;
}
// --------------------------------------------------------------------------------
// Load
// --------------------------------------------------------------------------------
void XKMSAuthenticationImpl::load(const XMLCh * id) {
if (mp_authenticationElement == NULL) {
throw XSECException(XSECException::ExpectedXKMSChildNotFound,
"XKMSAuthenticationImpl::load - called on empty DOM");
}
// Store for later use
mp_keyBindingId = id;
DOMElement * tmpElt = findFirstElementChild(mp_authenticationElement);
if (tmpElt != NULL && strEquals(getXKMSLocalName(tmpElt),
XKMSConstants::s_tagKeyBindingAuthentication)) {
// Find the signature
mp_keyBindingAuthenticationSignatureElement =
(DOMElement *) findFirstElementChild(tmpElt);
while (mp_keyBindingAuthenticationSignatureElement != NULL &&
!strEquals(getDSIGLocalName(mp_keyBindingAuthenticationSignatureElement),
XKMSConstants::s_tagSignature)) {
mp_keyBindingAuthenticationSignatureElement=
findNextElementChild(mp_keyBindingAuthenticationSignatureElement);
}
// The provider will take care of cleaning this up later.
if (mp_keyBindingAuthenticationSignatureElement != NULL) {
mp_keyBindingAuthenticationSignature = m_prov.newSignatureFromDOM(
mp_keyBindingAuthenticationSignatureElement->getOwnerDocument(),
mp_keyBindingAuthenticationSignatureElement);
mp_keyBindingAuthenticationSignature->load();
// Check the signature is across the correct input
DSIGReferenceList * rl =
mp_keyBindingAuthenticationSignature->getReferenceList();
if (rl->getSize() != 1) {
throw XSECException(XSECException::XKMSError,
"XKMSAuthenticationImpl::load - KeyBindingAuthentication Signature with incorrect number of references found (should be 1)");
}
safeBuffer sb;
sb.sbXMLChIn(DSIGConstants::s_unicodeStrEmpty);
sb.sbXMLChAppendCh(chPound);
sb.sbXMLChCat(mp_keyBindingId);
if (!strEquals(rl->item(0)->getURI(), sb.rawXMLChBuffer())) {
throw XSECException(XSECException::XKMSError,
"XKMSAuthenticationImpl::load - KeyBindingAuthentication Signature refers to incorrect Id (should be for KeyBinding)");
}
// We don't actually check the signature as we have no key material to do so!
}
tmpElt = findNextElementChild(tmpElt);
}
if (tmpElt != NULL && strEquals(getXKMSLocalName(tmpElt),
XKMSConstants::s_tagNotBoundAuthentication)) {
XSECnew(mp_notBoundAuthentication, XKMSNotBoundAuthenticationImpl(mp_env, tmpElt));
mp_notBoundAuthentication->load();
}
}
// --------------------------------------------------------------------------------
// Create
// --------------------------------------------------------------------------------
DOMElement * XKMSAuthenticationImpl::createBlankAuthentication(const XMLCh * id) {
// Get some setup values
safeBuffer str;
DOMDocument *doc = mp_env->getParentDocument();
const XMLCh * prefix = mp_env->getXKMSNSPrefix();
makeQName(str, prefix, XKMSConstants::s_tagAuthentication);
mp_authenticationElement = doc->createElementNS(XKMSConstants::s_unicodeStrURIXKMS,
str.rawXMLChBuffer());
mp_env->doPrettyPrint(mp_authenticationElement);
// This isn't used immediately - it is simply held for when we create a signature
mp_keyBindingId = id;
return mp_authenticationElement;
}
// --------------------------------------------------------------------------------
// Interfacet - Get
// --------------------------------------------------------------------------------
DSIGSignature * XKMSAuthenticationImpl::getKeyBindingAuthenticationSignature(void) const {
return mp_keyBindingAuthenticationSignature;
}
XKMSNotBoundAuthentication * XKMSAuthenticationImpl::getNotBoundAuthentication(void) const {
return mp_notBoundAuthentication;
}
// --------------------------------------------------------------------------------
// Interface - Set
// --------------------------------------------------------------------------------
DSIGSignature * XKMSAuthenticationImpl::addKeyBindingAuthenticationSignature(
canonicalizationMethod cm,
signatureMethod sm,
hashMethod hm) {
if (mp_keyBindingId == NULL) {
throw XSECException(XSECException::XKMSError,
"XKMSAuthenticationImpl::addKeyBindingAuthenticationSignature - called prior to key infos being added");
}
DSIGSignature * ret = m_prov.newSignature();
DOMElement * elt = ret->createBlankSignature(mp_env->getParentDocument(), cm, sm, hm);
/* Create the enveloping reference */
safeBuffer sb;
sb.sbXMLChIn(DSIGConstants::s_unicodeStrEmpty);
sb.sbXMLChAppendCh(chPound);
sb.sbXMLChCat(mp_keyBindingId);
DSIGReference *ref = ret->createReference(sb.rawXMLChBuffer());
ref->appendCanonicalizationTransform(CANON_C14NE_COM);
/* Embed the signature in the document inside a KeyBindingAuthentication element */
safeBuffer str;
DOMDocument *doc = mp_env->getParentDocument();
const XMLCh * prefix = mp_env->getXKMSNSPrefix();
makeQName(str, prefix, XKMSConstants::s_tagKeyBindingAuthentication);
DOMElement * t = doc->createElementNS(XKMSConstants::s_unicodeStrURIXKMS,
str.rawXMLChBuffer());
mp_env->doPrettyPrint(t);
t->appendChild(elt);
mp_env->doPrettyPrint(t);
mp_authenticationElement->appendChild(t);
mp_env->doPrettyPrint(mp_authenticationElement);
return ret;
}
void XKMSAuthenticationImpl::setNotBoundAuthentication(
const XMLCh * uri,
const XMLCh * value) {
XSECnew(mp_notBoundAuthentication, XKMSNotBoundAuthenticationImpl(mp_env));
mp_authenticationElement->appendChild(mp_notBoundAuthentication->createBlankNotBoundAuthentication(uri, value));
mp_env->doPrettyPrint(mp_authenticationElement);
}