2 * Licensed to the University Corporation for Advanced Internet
3 * Development, Inc. (UCAID) under one or more contributor license
4 * agreements. See the NOTICE file distributed with this work for
5 * additional information regarding copyright ownership.
7 * UCAID licenses this file to you under the Apache License,
8 * Version 2.0 (the "License"); you may not use this file except
9 * in compliance with the License. You may obtain a copy of the
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17 * either express or implied. See the License for the specific
18 * language governing permissions and limitations under the License.
22 * EncryptionSchemaValidators.cpp
24 * Schema validators for XML Encryption schema
28 #include "exceptions.h"
29 #include "encryption/Encryption.h"
30 #include "validation/Validator.h"
31 #include "validation/ValidatorSuite.h"
33 using namespace xmlencryption;
34 using namespace xmltooling;
36 using xmlconstants::XMLENC_NS;
38 namespace xmlencryption {
40 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CarriedKeyName);
41 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CipherValue);
42 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,KeySize);
43 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,OAEPparams);
45 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionMethod);
46 XMLOBJECTVALIDATOR_REQUIRE(EncryptionMethod,Algorithm);
47 END_XMLOBJECTVALIDATOR;
49 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,Transforms);
50 XMLOBJECTVALIDATOR_NONEMPTY(Transforms,Transform);
51 END_XMLOBJECTVALIDATOR;
53 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherReference);
54 XMLOBJECTVALIDATOR_REQUIRE(CipherReference,URI);
55 END_XMLOBJECTVALIDATOR;
57 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherData);
58 XMLOBJECTVALIDATOR_ONLYONEOF(CipherData,CipherValue,CipherReference);
59 END_XMLOBJECTVALIDATOR;
61 class XMLTOOL_DLLLOCAL checkWildcardNS {
63 void operator()(const XMLObject* xmlObject) const {
64 const XMLCh* ns=xmlObject->getElementQName().getNamespaceURI();
65 if (XMLString::equals(ns,XMLENC_NS) || !ns || !*ns) {
66 throw ValidationException(
67 "Object contains an illegal extension child element ($1).",
68 params(1,xmlObject->getElementQName().toString().c_str())
74 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperty);
75 if (!ptr->hasChildren())
76 throw ValidationException("EncryptionProperty must have at least one child element.");
77 const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
78 for_each(anys.begin(),anys.end(),checkWildcardNS());
79 END_XMLOBJECTVALIDATOR;
81 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperties);
82 XMLOBJECTVALIDATOR_NONEMPTY(EncryptionProperties,EncryptionProperty);
83 END_XMLOBJECTVALIDATOR;
85 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceType);
86 XMLOBJECTVALIDATOR_REQUIRE(DataReference,URI);
87 const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
88 for_each(anys.begin(),anys.end(),checkWildcardNS());
89 END_XMLOBJECTVALIDATOR;
91 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,DataReference,ReferenceType);
92 ReferenceTypeSchemaValidator::validate(xmlObject);
93 END_XMLOBJECTVALIDATOR;
95 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,KeyReference,ReferenceType);
96 ReferenceTypeSchemaValidator::validate(xmlObject);
97 END_XMLOBJECTVALIDATOR;
99 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceList);
100 if (!ptr->hasChildren())
101 throw ValidationException("ReferenceList must have at least one child element.");
102 END_XMLOBJECTVALIDATOR;
104 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptedType);
105 XMLOBJECTVALIDATOR_REQUIRE(EncryptedType,CipherData);
106 END_XMLOBJECTVALIDATOR;
108 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedData,EncryptedType);
109 EncryptedTypeSchemaValidator::validate(xmlObject);
110 END_XMLOBJECTVALIDATOR;
112 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedKey,EncryptedType);
113 EncryptedTypeSchemaValidator::validate(xmlObject);
114 END_XMLOBJECTVALIDATOR;
118 #define REGISTER_ELEMENT(namespaceURI,cname) \
119 q=QName(namespaceURI,cname::LOCAL_NAME); \
120 XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
121 SchemaValidators.registerValidator(q,new cname##SchemaValidator())
123 #define REGISTER_TYPE(namespaceURI,cname) \
124 q=QName(namespaceURI,cname::TYPE_NAME); \
125 XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
126 SchemaValidators.registerValidator(q,new cname##SchemaValidator())
128 void xmlencryption::registerEncryptionClasses()
131 REGISTER_ELEMENT(XMLENC_NS,CarriedKeyName);
132 REGISTER_ELEMENT(XMLENC_NS,CipherData);
133 REGISTER_ELEMENT(XMLENC_NS,CipherReference);
134 REGISTER_ELEMENT(XMLENC_NS,CipherValue);
135 REGISTER_ELEMENT(XMLENC_NS,DataReference);
136 REGISTER_ELEMENT(XMLENC_NS,EncryptedData);
137 REGISTER_ELEMENT(XMLENC_NS,EncryptedKey);
138 REGISTER_ELEMENT(XMLENC_NS,EncryptionMethod);
139 REGISTER_ELEMENT(XMLENC_NS,EncryptionProperties);
140 REGISTER_ELEMENT(XMLENC_NS,EncryptionProperty);
141 REGISTER_ELEMENT(XMLENC_NS,KeyReference);
142 REGISTER_ELEMENT(XMLENC_NS,KeySize);
143 REGISTER_ELEMENT(XMLENC_NS,OAEPparams);
144 REGISTER_ELEMENT(XMLENC_NS,ReferenceList);
145 REGISTER_ELEMENT(XMLENC_NS,Transforms);
146 REGISTER_TYPE(XMLENC_NS,CipherData);
147 REGISTER_TYPE(XMLENC_NS,CipherReference);
148 REGISTER_TYPE(XMLENC_NS,EncryptionMethod);
149 REGISTER_TYPE(XMLENC_NS,EncryptionProperties);
150 REGISTER_TYPE(XMLENC_NS,EncryptionProperty);
151 REGISTER_TYPE(XMLENC_NS,Transforms);