16d7adc9b638970708030d753921d63637ffa10b
[shibboleth/cpp-xmltooling.git] / xmltooling / encryption / impl / EncryptionSchemaValidators.cpp
1 /*
2 *  Copyright 2001-2009 Internet2
3  * 
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 /**
18  * EncryptionSchemaValidators.cpp
19  * 
20  * Schema validators for XML Encryption schema
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "encryption/Encryption.h"
26 #include "validation/Validator.h"
27 #include "validation/ValidatorSuite.h"
28
29 using namespace xmlencryption;
30 using namespace xmltooling;
31 using namespace std;
32 using xmlconstants::XMLENC_NS;
33
34 namespace xmlencryption {
35
36     XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CarriedKeyName);
37     XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CipherValue);
38     XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,KeySize);
39     XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,OAEPparams);
40     
41     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionMethod);
42         XMLOBJECTVALIDATOR_REQUIRE(EncryptionMethod,Algorithm);
43     END_XMLOBJECTVALIDATOR;
44
45     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,Transforms);
46         XMLOBJECTVALIDATOR_NONEMPTY(Transforms,Transform);
47     END_XMLOBJECTVALIDATOR;
48
49     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherReference);
50         XMLOBJECTVALIDATOR_REQUIRE(CipherReference,URI);
51     END_XMLOBJECTVALIDATOR;
52
53     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherData);
54         XMLOBJECTVALIDATOR_ONLYONEOF(CipherData,CipherValue,CipherReference);
55     END_XMLOBJECTVALIDATOR;
56
57     class XMLTOOL_DLLLOCAL checkWildcardNS {
58     public:
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())
65                     );
66             }
67         }
68     };
69
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;
76
77     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperties);
78         XMLOBJECTVALIDATOR_NONEMPTY(EncryptionProperties,EncryptionProperty);
79     END_XMLOBJECTVALIDATOR;
80
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;
86
87     BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,DataReference,ReferenceType);
88         ReferenceTypeSchemaValidator::validate(xmlObject);
89     END_XMLOBJECTVALIDATOR;
90     
91     BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,KeyReference,ReferenceType);
92         ReferenceTypeSchemaValidator::validate(xmlObject);
93     END_XMLOBJECTVALIDATOR;
94
95     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceList);
96         if (!ptr->hasChildren())
97             throw ValidationException("ReferenceList must have at least one child element.");
98     END_XMLOBJECTVALIDATOR;
99
100     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptedType);
101         XMLOBJECTVALIDATOR_REQUIRE(EncryptedType,CipherData);
102     END_XMLOBJECTVALIDATOR;
103
104     BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedData,EncryptedType);
105         EncryptedTypeSchemaValidator::validate(xmlObject);
106     END_XMLOBJECTVALIDATOR;
107
108     BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedKey,EncryptedType);
109         EncryptedTypeSchemaValidator::validate(xmlObject);
110     END_XMLOBJECTVALIDATOR;
111     
112 };
113
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())
118     
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())
123
124 void xmlencryption::registerEncryptionClasses()
125 {
126     QName q;
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);
148 }