2 * Copyright 2001-2009 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"
26 #include "validation/Validator.h"
27 #include "validation/ValidatorSuite.h"
29 using namespace xmlencryption;
30 using namespace xmltooling;
32 using xmlconstants::XMLENC_NS;
34 namespace xmlencryption {
36 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CarriedKeyName);
37 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CipherValue);
38 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,KeySize);
39 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,OAEPparams);
41 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionMethod);
42 XMLOBJECTVALIDATOR_REQUIRE(EncryptionMethod,Algorithm);
43 END_XMLOBJECTVALIDATOR;
45 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,Transforms);
46 XMLOBJECTVALIDATOR_NONEMPTY(Transforms,Transform);
47 END_XMLOBJECTVALIDATOR;
49 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherReference);
50 XMLOBJECTVALIDATOR_REQUIRE(CipherReference,URI);
51 END_XMLOBJECTVALIDATOR;
53 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherData);
54 XMLOBJECTVALIDATOR_ONLYONEOF(CipherData,CipherValue,CipherReference);
55 END_XMLOBJECTVALIDATOR;
57 class XMLTOOL_DLLLOCAL checkWildcardNS {
59 void operator()(const XMLObject* xmlObject) const {
60 const XMLCh* ns=xmlObject->getElementQName().getNamespaceURI();
61 if (XMLString::equals(ns,XMLENC_NS) || !ns || !*ns) {
62 throw ValidationException(
63 "Object contains an illegal extension child element ($1).",
64 params(1,xmlObject->getElementQName().toString().c_str())
70 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperty);
71 if (!ptr->hasChildren())
72 throw ValidationException("EncryptionProperty must have at least one child element.");
73 const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
74 for_each(anys.begin(),anys.end(),checkWildcardNS());
75 END_XMLOBJECTVALIDATOR;
77 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperties);
78 XMLOBJECTVALIDATOR_NONEMPTY(EncryptionProperties,EncryptionProperty);
79 END_XMLOBJECTVALIDATOR;
81 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceType);
82 XMLOBJECTVALIDATOR_REQUIRE(DataReference,URI);
83 const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
84 for_each(anys.begin(),anys.end(),checkWildcardNS());
85 END_XMLOBJECTVALIDATOR;
87 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,DataReference,ReferenceType);
88 ReferenceTypeSchemaValidator::validate(xmlObject);
89 END_XMLOBJECTVALIDATOR;
91 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,KeyReference,ReferenceType);
92 ReferenceTypeSchemaValidator::validate(xmlObject);
93 END_XMLOBJECTVALIDATOR;
95 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceList);
96 if (!ptr->hasChildren())
97 throw ValidationException("ReferenceList must have at least one child element.");
98 END_XMLOBJECTVALIDATOR;
100 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptedType);
101 XMLOBJECTVALIDATOR_REQUIRE(EncryptedType,CipherData);
102 END_XMLOBJECTVALIDATOR;
104 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedData,EncryptedType);
105 EncryptedTypeSchemaValidator::validate(xmlObject);
106 END_XMLOBJECTVALIDATOR;
108 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedKey,EncryptedType);
109 EncryptedTypeSchemaValidator::validate(xmlObject);
110 END_XMLOBJECTVALIDATOR;
114 #define REGISTER_ELEMENT(namespaceURI,cname) \
115 q=QName(namespaceURI,cname::LOCAL_NAME); \
116 XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
117 SchemaValidators.registerValidator(q,new cname##SchemaValidator())
119 #define REGISTER_TYPE(namespaceURI,cname) \
120 q=QName(namespaceURI,cname::TYPE_NAME); \
121 XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
122 SchemaValidators.registerValidator(q,new cname##SchemaValidator())
124 void xmlencryption::registerEncryptionClasses()
127 REGISTER_ELEMENT(XMLENC_NS,CarriedKeyName);
128 REGISTER_ELEMENT(XMLENC_NS,CipherData);
129 REGISTER_ELEMENT(XMLENC_NS,CipherReference);
130 REGISTER_ELEMENT(XMLENC_NS,CipherValue);
131 REGISTER_ELEMENT(XMLENC_NS,DataReference);
132 REGISTER_ELEMENT(XMLENC_NS,EncryptedData);
133 REGISTER_ELEMENT(XMLENC_NS,EncryptedKey);
134 REGISTER_ELEMENT(XMLENC_NS,EncryptionMethod);
135 REGISTER_ELEMENT(XMLENC_NS,EncryptionProperties);
136 REGISTER_ELEMENT(XMLENC_NS,EncryptionProperty);
137 REGISTER_ELEMENT(XMLENC_NS,KeyReference);
138 REGISTER_ELEMENT(XMLENC_NS,KeySize);
139 REGISTER_ELEMENT(XMLENC_NS,OAEPparams);
140 REGISTER_ELEMENT(XMLENC_NS,ReferenceList);
141 REGISTER_ELEMENT(XMLENC_NS,Transforms);
142 REGISTER_TYPE(XMLENC_NS,CipherData);
143 REGISTER_TYPE(XMLENC_NS,CipherReference);
144 REGISTER_TYPE(XMLENC_NS,EncryptionMethod);
145 REGISTER_TYPE(XMLENC_NS,EncryptionProperties);
146 REGISTER_TYPE(XMLENC_NS,EncryptionProperty);
147 REGISTER_TYPE(XMLENC_NS,Transforms);