2 * Copyright 2001-2006 Internet2
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * EncryptionSchemaValidators.cpp
20 * Schema validators for XML Encryption schema
24 #include "exceptions.h"
25 #include "encryption/Encryption.h"
27 using namespace xmlencryption;
28 using namespace xmltooling;
31 namespace xmlencryption {
33 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CarriedKeyName);
34 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CipherValue);
35 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,KeySize);
36 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,OAEPparams);
38 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionMethod);
39 XMLOBJECTVALIDATOR_REQUIRE(EncryptionMethod,Algorithm);
40 END_XMLOBJECTVALIDATOR;
42 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,Transforms);
43 XMLOBJECTVALIDATOR_NONEMPTY(Transforms,Transform);
44 END_XMLOBJECTVALIDATOR;
46 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherReference);
47 XMLOBJECTVALIDATOR_REQUIRE(CipherReference,URI);
48 END_XMLOBJECTVALIDATOR;
50 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherData);
51 XMLOBJECTVALIDATOR_ONLYONEOF(CipherData,CipherValue,CipherReference);
52 END_XMLOBJECTVALIDATOR;
54 class XMLTOOL_DLLLOCAL checkWildcardNS {
56 void operator()(const XMLObject* xmlObject) const {
57 const XMLCh* ns=xmlObject->getElementQName().getNamespaceURI();
58 if (XMLString::equals(ns,XMLConstants::XMLENC_NS) || !ns || !*ns) {
59 throw ValidationException(
60 "Object contains an illegal extension child element ($1).",
61 params(1,xmlObject->getElementQName().toString().c_str())
67 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperty);
68 if (!ptr->hasChildren())
69 throw ValidationException("EncryptionProperty must have at least one child element.");
70 const list<XMLObject*>& anys=ptr->getXMLObjects();
71 for_each(anys.begin(),anys.end(),checkWildcardNS());
72 END_XMLOBJECTVALIDATOR;
74 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperties);
75 XMLOBJECTVALIDATOR_NONEMPTY(EncryptionProperties,EncryptionProperty);
76 END_XMLOBJECTVALIDATOR;
78 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceType);
79 XMLOBJECTVALIDATOR_REQUIRE(DataReference,URI);
80 const list<XMLObject*>& anys=ptr->getXMLObjects();
81 for_each(anys.begin(),anys.end(),checkWildcardNS());
82 END_XMLOBJECTVALIDATOR;
84 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,DataReference,ReferenceType);
85 ReferenceTypeSchemaValidator::validate(xmlObject);
86 END_XMLOBJECTVALIDATOR;
88 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,KeyReference,ReferenceType);
89 ReferenceTypeSchemaValidator::validate(xmlObject);
90 END_XMLOBJECTVALIDATOR;
92 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceList);
93 if (!ptr->hasChildren())
94 throw ValidationException("ReferenceList must have at least one child element.");
95 END_XMLOBJECTVALIDATOR;
97 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptedType);
98 XMLOBJECTVALIDATOR_REQUIRE(EncryptedType,CipherData);
99 END_XMLOBJECTVALIDATOR;
101 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedData,EncryptedType);
102 EncryptedTypeSchemaValidator::validate(xmlObject);
103 END_XMLOBJECTVALIDATOR;
105 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedKey,EncryptedType);
106 EncryptedTypeSchemaValidator::validate(xmlObject);
107 END_XMLOBJECTVALIDATOR;
111 #define REGISTER_ELEMENT(namespaceURI,cname) \
112 q=QName(namespaceURI,cname::LOCAL_NAME); \
113 XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
114 Validator::registerValidator(q,new cname##SchemaValidator())
116 #define REGISTER_TYPE(namespaceURI,cname) \
117 q=QName(namespaceURI,cname::TYPE_NAME); \
118 XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
119 Validator::registerValidator(q,new cname##SchemaValidator())
121 void xmlencryption::registerEncryptionClasses()
124 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,CarriedKeyName);
125 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,CipherData);
126 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,CipherReference);
127 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,CipherValue);
128 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,DataReference);
129 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,EncryptedData);
130 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,EncryptedKey);
131 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,EncryptionMethod);
132 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,EncryptionProperties);
133 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,EncryptionProperty);
134 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,KeyReference);
135 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,KeySize);
136 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,OAEPparams);
137 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,ReferenceList);
138 REGISTER_ELEMENT(XMLConstants::XMLENC_NS,Transforms);
139 REGISTER_TYPE(XMLConstants::XMLENC_NS,CipherData);
140 REGISTER_TYPE(XMLConstants::XMLENC_NS,CipherReference);
141 REGISTER_TYPE(XMLConstants::XMLENC_NS,EncryptionMethod);
142 REGISTER_TYPE(XMLConstants::XMLENC_NS,EncryptionProperties);
143 REGISTER_TYPE(XMLConstants::XMLENC_NS,EncryptionProperty);
144 REGISTER_TYPE(XMLConstants::XMLENC_NS,Transforms);