Add XMLEnc 1.1 constants and MGF supporting code
[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 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:
64         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
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 }