Merge branch '1.x' of ssh://authdev.it.ohio-state.edu/~scantor/git/cpp-xmltooling...
[shibboleth/cpp-xmltooling.git] / xmltooling / encryption / impl / EncryptionSchemaValidators.cpp
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
38 namespace xmlencryption {
39
40     XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CarriedKeyName);
41     XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,CipherValue);
42     XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,KeySize);
43     XMLOBJECTVALIDATOR_SIMPLE(XMLTOOL_DLLLOCAL,OAEPparams);
44     
45     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionMethod);
46         XMLOBJECTVALIDATOR_REQUIRE(EncryptionMethod,Algorithm);
47     END_XMLOBJECTVALIDATOR;
48
49     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,Transforms);
50         XMLOBJECTVALIDATOR_NONEMPTY(Transforms,Transform);
51     END_XMLOBJECTVALIDATOR;
52
53     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherReference);
54         XMLOBJECTVALIDATOR_REQUIRE(CipherReference,URI);
55     END_XMLOBJECTVALIDATOR;
56
57     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,CipherData);
58         XMLOBJECTVALIDATOR_ONLYONEOF(CipherData,CipherValue,CipherReference);
59     END_XMLOBJECTVALIDATOR;
60
61     class XMLTOOL_DLLLOCAL checkWildcardNS {
62     public:
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())
69                     );
70             }
71         }
72     };
73
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;
80
81     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptionProperties);
82         XMLOBJECTVALIDATOR_NONEMPTY(EncryptionProperties,EncryptionProperty);
83     END_XMLOBJECTVALIDATOR;
84
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;
90
91     BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,DataReference,ReferenceType);
92         ReferenceTypeSchemaValidator::validate(xmlObject);
93     END_XMLOBJECTVALIDATOR;
94     
95     BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,KeyReference,ReferenceType);
96         ReferenceTypeSchemaValidator::validate(xmlObject);
97     END_XMLOBJECTVALIDATOR;
98
99     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,ReferenceList);
100         if (!ptr->hasChildren())
101             throw ValidationException("ReferenceList must have at least one child element.");
102     END_XMLOBJECTVALIDATOR;
103
104     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,EncryptedType);
105         XMLOBJECTVALIDATOR_REQUIRE(EncryptedType,CipherData);
106     END_XMLOBJECTVALIDATOR;
107
108     BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedData,EncryptedType);
109         EncryptedTypeSchemaValidator::validate(xmlObject);
110     END_XMLOBJECTVALIDATOR;
111
112     BEGIN_XMLOBJECTVALIDATOR_SUB(XMLTOOL_DLLLOCAL,EncryptedKey,EncryptedType);
113         EncryptedTypeSchemaValidator::validate(xmlObject);
114     END_XMLOBJECTVALIDATOR;
115     
116 };
117
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())
122     
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())
127
128 void xmlencryption::registerEncryptionClasses()
129 {
130     QName q;
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);
152 }