1 /**
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.
6 *
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
10 * License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
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.
19 */
20
21 /**
22 * EncryptionSchemaValidators.cpp
23 *
24 * Schema validators for XML Encryption schema
25 */
26
27 #include "internal.h"
28 #include "exceptions.h"
29 #include "encryption/Encryption.h"
30 #include "validation/Validator.h"
31 #include "validation/ValidatorSuite.h"
32
33 using namespace xmlencryption;
34 using namespace xmltooling;
35 using namespace std;
36 using xmlconstants::XMLENC_NS;
37 using xmlconstants::XMLENC11_NS;
38
39 namespace xmlencryption {
40
41 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CarriedKeyName);
42 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CipherValue);
43 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,KeySize);
44 XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,OAEPparams);
45
46 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionMethod);
47 XMLOBJECTVALIDATOR_REQUIRE(EncryptionMethod,Algorithm);
48 END_XMLOBJECTVALIDATOR;
49
50 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,Transforms);
51 XMLOBJECTVALIDATOR_NONEMPTY(Transforms,Transform);
52 END_XMLOBJECTVALIDATOR;
53
54 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherReference);
55 XMLOBJECTVALIDATOR_REQUIRE(CipherReference,URI);
56 END_XMLOBJECTVALIDATOR;
57
58 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherData);
59 XMLOBJECTVALIDATOR_ONLYONEOF(CipherData,CipherValue,CipherReference);
60 END_XMLOBJECTVALIDATOR;
61
62 class XMLTOOL_DLLLOCAL checkWildcardNS {
63 public:
operator ()(const XMLObject * xmlObject) const64 void operator()(const XMLObject* xmlObject) const {
65 const XMLCh* ns=xmlObject->getElementQName().getNamespaceURI();
66 if (XMLString::equals(ns,XMLENC_NS) || !ns || !*ns) {
67 throw ValidationException(
68 "Object contains an illegal extension child element ($1).",
69 params(1,xmlObject->getElementQName().toString().c_str())
70 );
71 }
72 }
73 };
74
75 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperty);
76 if (!ptr->hasChildren())
77 throw ValidationException("EncryptionProperty must have at least one child element.");
78 const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
79 for_each(anys.begin(),anys.end(),checkWildcardNS());
80 END_XMLOBJECTVALIDATOR;
81
82 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperties);
83 XMLOBJECTVALIDATOR_NONEMPTY(EncryptionProperties,EncryptionProperty);
84 END_XMLOBJECTVALIDATOR;
85
86 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceType);
87 XMLOBJECTVALIDATOR_REQUIRE(DataReference,URI);
88 const vector<XMLObject*>& anys=ptr->getUnknownXMLObjects();
89 for_each(anys.begin(),anys.end(),checkWildcardNS());
90 END_XMLOBJECTVALIDATOR;
91
92 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,DataReference,ReferenceType);
93 ReferenceTypeSchemaValidator::validate(xmlObject);
94 END_XMLOBJECTVALIDATOR;
95
96 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,KeyReference,ReferenceType);
97 ReferenceTypeSchemaValidator::validate(xmlObject);
98 END_XMLOBJECTVALIDATOR;
99
100 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceList);
101 if (!ptr->hasChildren())
102 throw ValidationException("ReferenceList must have at least one child element.");
103 END_XMLOBJECTVALIDATOR;
104
105 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptedType);
106 XMLOBJECTVALIDATOR_REQUIRE(EncryptedType,CipherData);
107 END_XMLOBJECTVALIDATOR;
108
109 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedData,EncryptedType);
110 EncryptedTypeSchemaValidator::validate(xmlObject);
111 END_XMLOBJECTVALIDATOR;
112
113 BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedKey,EncryptedType);
114 EncryptedTypeSchemaValidator::validate(xmlObject);
115 END_XMLOBJECTVALIDATOR;
116
117 BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,MGF);
118 XMLOBJECTVALIDATOR_REQUIRE(MGF,Algorithm);
119 END_XMLOBJECTVALIDATOR;
120
121 };
122
123 #define REGISTER_ELEMENT(namespaceURI,cname) \
124 q=QName(namespaceURI,cname::LOCAL_NAME); \
125 XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
126 SchemaValidators.registerValidator(q,new cname##SchemaValidator())
127
128 #define REGISTER_TYPE(namespaceURI,cname) \
129 q=QName(namespaceURI,cname::TYPE_NAME); \
130 XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
131 SchemaValidators.registerValidator(q,new cname##SchemaValidator())
132
registerEncryptionClasses()133 void xmlencryption::registerEncryptionClasses()
134 {
135 QName q;
136 REGISTER_ELEMENT(XMLENC_NS,CarriedKeyName);
137 REGISTER_ELEMENT(XMLENC_NS,CipherData);
138 REGISTER_ELEMENT(XMLENC_NS,CipherReference);
139 REGISTER_ELEMENT(XMLENC_NS,CipherValue);
140 REGISTER_ELEMENT(XMLENC_NS,DataReference);
141 REGISTER_ELEMENT(XMLENC_NS,EncryptedData);
142 REGISTER_ELEMENT(XMLENC_NS,EncryptedKey);
143 REGISTER_ELEMENT(XMLENC_NS,EncryptionMethod);
144 REGISTER_ELEMENT(XMLENC_NS,EncryptionProperties);
145 REGISTER_ELEMENT(XMLENC_NS,EncryptionProperty);
146 REGISTER_ELEMENT(XMLENC_NS,KeyReference);
147 REGISTER_ELEMENT(XMLENC_NS,KeySize);
148 REGISTER_ELEMENT(XMLENC_NS,OAEPparams);
149 REGISTER_ELEMENT(XMLENC_NS,ReferenceList);
150 REGISTER_ELEMENT(XMLENC_NS,Transforms);
151 REGISTER_TYPE(XMLENC_NS,CipherData);
152 REGISTER_TYPE(XMLENC_NS,CipherReference);
153 REGISTER_TYPE(XMLENC_NS,EncryptionMethod);
154 REGISTER_TYPE(XMLENC_NS,EncryptionProperties);
155 REGISTER_TYPE(XMLENC_NS,EncryptionProperty);
156 REGISTER_TYPE(XMLENC_NS,Transforms);
157
158 REGISTER_ELEMENT(XMLENC11_NS,MGF);
159 REGISTER_TYPE(XMLENC11_NS,MGF);
160 }
161