Additional macros and cleanup for cloning
[shibboleth/cpp-xmltooling.git] / xmltooling / signature / impl / KeyInfoImpl.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  * KeyInfoImpl.cpp
23  * 
24  * Implementation classes for KeyInfo schema.
25  */
26
27 #include "internal.h"
28 #include "AbstractComplexElement.h"
29 #include "AbstractSimpleElement.h"
30 #include "exceptions.h"
31 #include "io/AbstractXMLObjectMarshaller.h"
32 #include "io/AbstractXMLObjectUnmarshaller.h"
33 #include "signature/KeyInfo.h"
34 #include "util/XMLHelper.h"
35
36 #include <boost/lambda/bind.hpp>
37 #include <boost/lambda/casts.hpp>
38 #include <boost/lambda/if.hpp>
39 #include <boost/lambda/lambda.hpp>
40 #include <xercesc/util/XMLUniDefs.hpp>
41
42 using namespace xmlsignature;
43 using namespace xmltooling;
44 using namespace xercesc;
45 using namespace std;
46 using xmlconstants::XMLSIG_NS;
47 using xmlconstants::XMLSIG11_NS;
48
49 #if defined (_MSC_VER)
50     #pragma warning( push )
51     #pragma warning( disable : 4250 4251 )
52 #endif
53
54 namespace xmlsignature {
55     
56     class XMLTOOL_DLLLOCAL DSAKeyValueImpl : public virtual DSAKeyValue,
57         public AbstractComplexElement,
58         public AbstractDOMCachingXMLObject,
59         public AbstractXMLObjectMarshaller,
60         public AbstractXMLObjectUnmarshaller
61     {
62         void init() {
63             m_P=nullptr;
64             m_Q=nullptr;
65             m_G=nullptr;
66             m_Y=nullptr;
67             m_J=nullptr;
68             m_Seed=nullptr;
69             m_PgenCounter=nullptr;
70             m_children.push_back(nullptr);
71             m_children.push_back(nullptr);
72             m_children.push_back(nullptr);
73             m_children.push_back(nullptr);
74             m_children.push_back(nullptr);
75             m_children.push_back(nullptr);
76             m_children.push_back(nullptr);
77             m_pos_P=m_children.begin();
78             m_pos_Q=m_pos_P;
79             ++m_pos_Q;
80             m_pos_G=m_pos_Q;
81             ++m_pos_G;
82             m_pos_Y=m_pos_G;
83             ++m_pos_Y;
84             m_pos_J=m_pos_Y;
85             ++m_pos_J;
86             m_pos_Seed=m_pos_J;
87             ++m_pos_Seed;
88             m_pos_PgenCounter=m_pos_Seed;
89             ++m_pos_PgenCounter;
90         }
91
92     public:
93         virtual ~DSAKeyValueImpl() {}
94
95         DSAKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
96             : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
97             init();
98         }
99             
100         DSAKeyValueImpl(const DSAKeyValueImpl& src)
101                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
102             init();
103             IMPL_CLONE_TYPED_CHILD(P);
104             IMPL_CLONE_TYPED_CHILD(Q);
105             IMPL_CLONE_TYPED_CHILD(G);
106             IMPL_CLONE_TYPED_CHILD(Y);
107             IMPL_CLONE_TYPED_CHILD(J);
108             IMPL_CLONE_TYPED_CHILD(Seed);
109             IMPL_CLONE_TYPED_CHILD(PgenCounter);
110         }
111                 
112         IMPL_XMLOBJECT_CLONE(DSAKeyValue);
113         IMPL_TYPED_CHILD(P);
114         IMPL_TYPED_CHILD(Q);
115         IMPL_TYPED_CHILD(G);
116         IMPL_TYPED_CHILD(Y);
117         IMPL_TYPED_CHILD(J);
118         IMPL_TYPED_CHILD(Seed);
119         IMPL_TYPED_CHILD(PgenCounter);
120
121     protected:
122         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
123             PROC_TYPED_CHILD(P,XMLSIG_NS,false);
124             PROC_TYPED_CHILD(Q,XMLSIG_NS,false);
125             PROC_TYPED_CHILD(G,XMLSIG_NS,false);
126             PROC_TYPED_CHILD(Y,XMLSIG_NS,false);
127             PROC_TYPED_CHILD(J,XMLSIG_NS,false);
128             PROC_TYPED_CHILD(Seed,XMLSIG_NS,false);
129             PROC_TYPED_CHILD(PgenCounter,XMLSIG_NS,false);
130             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
131         }
132     };
133
134     class XMLTOOL_DLLLOCAL RSAKeyValueImpl : public virtual RSAKeyValue,
135         public AbstractComplexElement,
136         public AbstractDOMCachingXMLObject,
137         public AbstractXMLObjectMarshaller,
138         public AbstractXMLObjectUnmarshaller
139     {
140         void init() {
141             m_Modulus=nullptr;
142             m_Exponent=nullptr;
143             m_children.push_back(nullptr);
144             m_children.push_back(nullptr);
145             m_pos_Modulus=m_children.begin();
146             m_pos_Exponent=m_pos_Modulus;
147             ++m_pos_Exponent;
148         }
149         
150     public:
151         virtual ~RSAKeyValueImpl() {}
152
153         RSAKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
154                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
155             init();
156         }
157             
158         RSAKeyValueImpl(const RSAKeyValueImpl& src)
159                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
160             init();
161             IMPL_CLONE_TYPED_CHILD(Modulus);
162             IMPL_CLONE_TYPED_CHILD(Exponent);
163         }
164         
165         IMPL_XMLOBJECT_CLONE(RSAKeyValue);
166         IMPL_TYPED_CHILD(Modulus);
167         IMPL_TYPED_CHILD(Exponent);
168
169     protected:
170         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
171             PROC_TYPED_CHILD(Modulus,XMLSIG_NS,false);
172             PROC_TYPED_CHILD(Exponent,XMLSIG_NS,false);
173             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
174         }
175     };
176
177     class XMLTOOL_DLLLOCAL NamedCurveImpl : public virtual NamedCurve,
178         public AbstractComplexElement,
179         public AbstractDOMCachingXMLObject,
180         public AbstractXMLObjectMarshaller,
181         public AbstractXMLObjectUnmarshaller
182     {
183     public:
184         virtual ~NamedCurveImpl() {
185             XMLString::release(&m_URI);
186         }
187
188         NamedCurveImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
189             : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_URI(nullptr) {
190         }
191
192         NamedCurveImpl(const NamedCurveImpl& src)
193                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_URI(nullptr) {
194             IMPL_CLONE_ATTRIB(URI);
195         }
196
197         IMPL_XMLOBJECT_CLONE(NamedCurve);
198         IMPL_STRING_ATTRIB(URI);
199
200     protected:
201         void marshallAttributes(DOMElement* domElement) const {
202             MARSHALL_STRING_ATTRIB(URI,URI,nullptr);
203         }
204
205         void processAttribute(const DOMAttr* attribute) {
206             PROC_STRING_ATTRIB(URI,URI,nullptr);
207             AbstractXMLObjectUnmarshaller::processAttribute(attribute);
208         }
209     };
210
211     class XMLTOOL_DLLLOCAL ECKeyValueImpl : public virtual ECKeyValue,
212         public AbstractComplexElement,
213         public AbstractDOMCachingXMLObject,
214         public AbstractXMLObjectMarshaller,
215         public AbstractXMLObjectUnmarshaller
216     {
217         void init() {
218             m_Id=nullptr;
219             m_ECParameters=nullptr;
220             m_NamedCurve=nullptr;
221             m_PublicKey=nullptr;
222             m_children.push_back(nullptr);
223             m_children.push_back(nullptr);
224             m_children.push_back(nullptr);
225             m_pos_ECParameters=m_children.begin();
226             m_pos_NamedCurve=m_pos_ECParameters;
227             ++m_pos_NamedCurve;
228             m_pos_PublicKey=m_pos_NamedCurve;
229             ++m_pos_PublicKey;
230         }
231         
232     public:
233         virtual ~ECKeyValueImpl() {
234             XMLString::release(&m_Id);
235         }
236
237         ECKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
238                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
239             init();
240         }
241             
242         ECKeyValueImpl(const ECKeyValueImpl& src)
243                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
244             init();
245             IMPL_CLONE_ATTRIB(Id);
246             IMPL_CLONE_XMLOBJECT_CHILD(ECParameters);
247             IMPL_CLONE_TYPED_CHILD(NamedCurve);
248             IMPL_CLONE_TYPED_CHILD(PublicKey);
249         }
250         
251         IMPL_XMLOBJECT_CLONE(ECKeyValue);
252         IMPL_ID_ATTRIB_EX(Id,ID,nullptr);
253         IMPL_XMLOBJECT_CHILD(ECParameters);
254         IMPL_TYPED_CHILD(NamedCurve);
255         IMPL_TYPED_CHILD(PublicKey);
256
257     protected:
258         void marshallAttributes(DOMElement* domElement) const {
259             MARSHALL_ID_ATTRIB(Id,ID,nullptr);
260         }
261
262         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
263             PROC_TYPED_CHILD(NamedCurve,XMLSIG11_NS,false);
264             PROC_TYPED_CHILD(PublicKey,XMLSIG11_NS,false);
265
266             // Not really "unknown", but currently unwrapped.
267             static const XMLCh _ECParameters[] = UNICODE_LITERAL_12(E,C,P,a,r,a,m,e,t,e,r,s);
268             if (XMLString::equals(root->getLocalName(), _ECParameters) && XMLString::equals(root->getNamespaceURI(), XMLSIG11_NS)) {
269                 setECParameters(childXMLObject);
270                 return;
271             }
272
273             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
274         }
275
276         void processAttribute(const DOMAttr* attribute) {
277             PROC_ID_ATTRIB(Id,ID,nullptr);
278             AbstractXMLObjectUnmarshaller::processAttribute(attribute);
279         }
280     };
281
282     class XMLTOOL_DLLLOCAL KeyValueImpl : public virtual KeyValue,
283         public AbstractComplexElement,
284         public AbstractDOMCachingXMLObject,
285         public AbstractXMLObjectMarshaller,
286         public AbstractXMLObjectUnmarshaller
287     {
288         void init() {
289             m_DSAKeyValue=nullptr;
290             m_RSAKeyValue=nullptr;
291             m_ECKeyValue=nullptr;
292             m_UnknownXMLObject=nullptr;
293             m_children.push_back(nullptr);
294             m_children.push_back(nullptr);
295             m_children.push_back(nullptr);
296             m_children.push_back(nullptr);
297             m_pos_DSAKeyValue=m_children.begin();
298             m_pos_RSAKeyValue=m_pos_DSAKeyValue;
299             ++m_pos_RSAKeyValue;
300             m_pos_ECKeyValue=m_pos_RSAKeyValue;
301             ++m_pos_ECKeyValue;
302             m_pos_UnknownXMLObject=m_pos_ECKeyValue;
303             ++m_pos_UnknownXMLObject;
304         }
305
306     public:
307         virtual ~KeyValueImpl() {}
308
309         KeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
310                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
311             init();
312         }
313             
314         KeyValueImpl(const KeyValueImpl& src)
315                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
316             init();
317             IMPL_CLONE_TYPED_CHILD(DSAKeyValue);
318             IMPL_CLONE_TYPED_CHILD(RSAKeyValue);
319             IMPL_CLONE_TYPED_CHILD(ECKeyValue);
320             IMPL_CLONE_XMLOBJECT_CHILD(UnknownXMLObject);
321         }
322                 
323         IMPL_XMLOBJECT_CLONE(KeyValue);
324         IMPL_TYPED_CHILD(DSAKeyValue);
325         IMPL_TYPED_CHILD(RSAKeyValue);
326         IMPL_TYPED_CHILD(ECKeyValue);
327         IMPL_XMLOBJECT_CHILD(UnknownXMLObject);
328
329     protected:
330         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
331             PROC_TYPED_CHILD(DSAKeyValue,XMLSIG_NS,false);
332             PROC_TYPED_CHILD(RSAKeyValue,XMLSIG_NS,false);
333             PROC_TYPED_CHILD(ECKeyValue,XMLSIG11_NS,false);
334             
335             // Unknown child.
336             const XMLCh* nsURI=root->getNamespaceURI();
337             if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) {
338                 setUnknownXMLObject(childXMLObject);
339                 return;
340             }
341             
342             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
343         }
344     };
345
346     class XMLTOOL_DLLLOCAL DEREncodedKeyValueImpl : public virtual DEREncodedKeyValue,
347         public AbstractSimpleElement,
348         public AbstractDOMCachingXMLObject,
349         public AbstractXMLObjectMarshaller,
350         public AbstractXMLObjectUnmarshaller
351     {
352     public:
353         virtual ~DEREncodedKeyValueImpl() {
354             XMLString::release(&m_Id);
355         }
356
357         DEREncodedKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
358                 : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Id(nullptr) {
359         }
360
361         DEREncodedKeyValueImpl(const DEREncodedKeyValueImpl& src)
362                 : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src), m_Id(nullptr) {
363             IMPL_CLONE_ATTRIB(Id);
364         }
365
366         IMPL_XMLOBJECT_CLONE(DEREncodedKeyValue);
367         IMPL_ID_ATTRIB_EX(Id,ID,nullptr);
368
369     protected:
370         void marshallAttributes(DOMElement* domElement) const {
371             MARSHALL_ID_ATTRIB(Id,ID,nullptr);
372         }
373
374         void processAttribute(const DOMAttr* attribute) {
375             PROC_ID_ATTRIB(Id,ID,nullptr);
376             AbstractXMLObjectUnmarshaller::processAttribute(attribute);
377         }
378     };
379
380     class XMLTOOL_DLLLOCAL TransformImpl : public virtual Transform,
381         public AbstractComplexElement,
382         public AbstractDOMCachingXMLObject,
383         public AbstractXMLObjectMarshaller,
384         public AbstractXMLObjectUnmarshaller
385     {
386     public:
387         virtual ~TransformImpl() {
388             XMLString::release(&m_Algorithm);
389         }
390
391         TransformImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
392             : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Algorithm(nullptr) {
393         }
394             
395         TransformImpl(const TransformImpl& src)
396                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_Algorithm(nullptr) {
397             IMPL_CLONE_ATTRIB(Algorithm);
398             IMPL_CLONE_CHILDBAG_BEGIN;
399                 IMPL_CLONE_TYPED_CHILD_IN_BAG(XPath);
400                 IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(UnknownXMLObject);
401             IMPL_CLONE_CHILDBAG_END;
402         }
403         
404         IMPL_XMLOBJECT_CLONE(Transform);
405         IMPL_STRING_ATTRIB(Algorithm);
406         IMPL_TYPED_CHILDREN(XPath,m_children.end());
407         IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
408
409     protected:
410         void marshallAttributes(DOMElement* domElement) const {
411             MARSHALL_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr);
412         }
413
414         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
415             PROC_TYPED_CHILDREN(XPath,XMLSIG_NS,false);
416             
417             // Unknown child.
418             const XMLCh* nsURI=root->getNamespaceURI();
419             if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) {
420                 getUnknownXMLObjects().push_back(childXMLObject);
421                 return;
422             }
423             
424             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
425         }
426
427         void processAttribute(const DOMAttr* attribute) {
428             PROC_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr);
429             AbstractXMLObjectUnmarshaller::processAttribute(attribute);
430         }
431     };
432
433     class XMLTOOL_DLLLOCAL TransformsImpl : public virtual Transforms,
434         public AbstractComplexElement,
435         public AbstractDOMCachingXMLObject,
436         public AbstractXMLObjectMarshaller,
437         public AbstractXMLObjectUnmarshaller
438     {
439     public:
440         virtual ~TransformsImpl() {}
441
442         TransformsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
443             : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
444         }
445             
446         TransformsImpl(const TransformsImpl& src)
447                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
448             IMPL_CLONE_TYPED_CHILDREN(Transform);
449         }
450         
451         IMPL_XMLOBJECT_CLONE(Transforms);
452         IMPL_TYPED_CHILDREN(Transform,m_children.end());
453
454     protected:
455         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
456             PROC_TYPED_CHILDREN(Transform,XMLSIG_NS,false);
457             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
458         }
459     };
460
461     class XMLTOOL_DLLLOCAL RetrievalMethodImpl : public virtual RetrievalMethod,
462         public AbstractComplexElement,
463         public AbstractDOMCachingXMLObject,
464         public AbstractXMLObjectMarshaller,
465         public AbstractXMLObjectUnmarshaller
466     {
467         void init() {
468             m_URI=m_Type=nullptr;
469             m_Transforms=nullptr;
470             m_children.push_back(nullptr);
471             m_pos_Transforms=m_children.begin();
472         }
473         
474     public:
475         virtual ~RetrievalMethodImpl() {
476             XMLString::release(&m_URI);
477             XMLString::release(&m_Type);
478         }
479
480         RetrievalMethodImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
481             : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
482             init();
483         }
484             
485         RetrievalMethodImpl(const RetrievalMethodImpl& src)
486                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
487             init();
488             IMPL_CLONE_ATTRIB(URI);
489             IMPL_CLONE_ATTRIB(Type);
490             IMPL_CLONE_TYPED_CHILD(Transforms);
491         }
492         
493         IMPL_XMLOBJECT_CLONE(RetrievalMethod);
494         IMPL_STRING_ATTRIB(URI);
495         IMPL_STRING_ATTRIB(Type);
496         IMPL_TYPED_CHILD(Transforms);
497
498     protected:
499         void marshallAttributes(DOMElement* domElement) const {
500             MARSHALL_STRING_ATTRIB(URI,URI,nullptr);
501             MARSHALL_STRING_ATTRIB(Type,TYPE,nullptr);
502         }
503
504         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
505             PROC_TYPED_CHILD(Transforms,XMLSIG_NS,false);
506             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
507         }
508
509         void processAttribute(const DOMAttr* attribute) {
510             PROC_STRING_ATTRIB(URI,URI,nullptr);
511             PROC_STRING_ATTRIB(Type,TYPE,nullptr);
512             AbstractXMLObjectUnmarshaller::processAttribute(attribute);
513         }
514     };
515
516     class XMLTOOL_DLLLOCAL X509IssuerSerialImpl : public virtual X509IssuerSerial,
517         public AbstractComplexElement,
518         public AbstractDOMCachingXMLObject,
519         public AbstractXMLObjectMarshaller,
520         public AbstractXMLObjectUnmarshaller
521     {
522         void init() {
523             m_X509IssuerName=nullptr;
524             m_X509SerialNumber=nullptr;
525             m_children.push_back(nullptr);
526             m_children.push_back(nullptr);
527             m_pos_X509IssuerName=m_children.begin();
528             m_pos_X509SerialNumber=m_pos_X509IssuerName;
529             ++m_pos_X509SerialNumber;
530         }
531         
532     public:
533         virtual ~X509IssuerSerialImpl() {}
534
535         X509IssuerSerialImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
536                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
537             init();
538         }
539             
540         X509IssuerSerialImpl(const X509IssuerSerialImpl& src)
541                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
542             init();
543             IMPL_CLONE_TYPED_CHILD(X509IssuerName);
544             IMPL_CLONE_TYPED_CHILD(X509SerialNumber);
545         }
546         
547         IMPL_XMLOBJECT_CLONE(X509IssuerSerial);
548         IMPL_TYPED_CHILD(X509IssuerName);
549         IMPL_TYPED_CHILD(X509SerialNumber);
550
551     protected:
552         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
553             PROC_TYPED_CHILD(X509IssuerName,XMLSIG_NS,false);
554             PROC_TYPED_CHILD(X509SerialNumber,XMLSIG_NS,false);
555             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
556         }
557     };
558
559     class XMLTOOL_DLLLOCAL X509DigestImpl : public virtual X509Digest,
560         public AbstractComplexElement,
561         public AbstractDOMCachingXMLObject,
562         public AbstractXMLObjectMarshaller,
563         public AbstractXMLObjectUnmarshaller
564     {
565     public:
566         virtual ~X509DigestImpl() {
567             XMLString::release(&m_Algorithm);
568         }
569
570         X509DigestImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
571             : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Algorithm(nullptr) {
572         }
573
574         X509DigestImpl(const X509DigestImpl& src)
575                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_Algorithm(nullptr) {
576             IMPL_CLONE_ATTRIB(Algorithm);
577         }
578
579         IMPL_XMLOBJECT_CLONE(X509Digest);
580         IMPL_STRING_ATTRIB(Algorithm);
581
582     protected:
583         void marshallAttributes(DOMElement* domElement) const {
584             MARSHALL_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr);
585         }
586
587         void processAttribute(const DOMAttr* attribute) {
588             PROC_STRING_ATTRIB(Algorithm,ALGORITHM,nullptr);
589             AbstractXMLObjectUnmarshaller::processAttribute(attribute);
590         }
591     };
592
593
594     class XMLTOOL_DLLLOCAL X509DataImpl : public virtual X509Data,
595         public AbstractComplexElement,
596         public AbstractDOMCachingXMLObject,
597         public AbstractXMLObjectMarshaller,
598         public AbstractXMLObjectUnmarshaller
599     {
600     public:
601         virtual ~X509DataImpl() {}
602
603         X509DataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
604             : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
605         }
606             
607         X509DataImpl(const X509DataImpl& src)
608                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
609             IMPL_CLONE_CHILDBAG_BEGIN;
610                 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509Certificate);
611                 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509CRL);
612                 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509SubjectName);
613                 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509IssuerSerial);
614                 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509SKI);
615                 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509Digest);
616                 IMPL_CLONE_TYPED_CHILD_IN_BAG(OCSPResponse);
617                 IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(UnknownXMLObject);
618             IMPL_CLONE_CHILDBAG_END;
619         }
620         
621         IMPL_XMLOBJECT_CLONE(X509Data);
622         IMPL_TYPED_CHILDREN(X509IssuerSerial,m_children.end());
623         IMPL_TYPED_CHILDREN(X509SKI,m_children.end());
624         IMPL_TYPED_CHILDREN(X509SubjectName,m_children.end());
625         IMPL_TYPED_CHILDREN(X509Certificate,m_children.end());
626         IMPL_TYPED_CHILDREN(X509CRL,m_children.end());
627         IMPL_TYPED_CHILDREN(X509Digest,m_children.end());
628         IMPL_TYPED_CHILDREN(OCSPResponse,m_children.end());
629         IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
630
631     protected:
632         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
633             PROC_TYPED_CHILDREN(X509IssuerSerial,XMLSIG_NS,false);
634             PROC_TYPED_CHILDREN(X509SKI,XMLSIG_NS,false);
635             PROC_TYPED_CHILDREN(X509SubjectName,XMLSIG_NS,false);
636             PROC_TYPED_CHILDREN(X509Certificate,XMLSIG_NS,false);
637             PROC_TYPED_CHILDREN(X509CRL,XMLSIG_NS,false);
638             PROC_TYPED_CHILDREN(X509Digest,XMLSIG11_NS,false);
639             PROC_TYPED_CHILDREN(OCSPResponse,XMLSIG11_NS,false);
640             
641             // Unknown child.
642             const XMLCh* nsURI=root->getNamespaceURI();
643             if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) {
644                 getUnknownXMLObjects().push_back(childXMLObject);
645                 return;
646             }
647             
648             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
649         }
650     };
651
652     class XMLTOOL_DLLLOCAL SPKIDataImpl : public virtual SPKIData,
653         public AbstractComplexElement,
654         public AbstractDOMCachingXMLObject,
655         public AbstractXMLObjectMarshaller,
656         public AbstractXMLObjectUnmarshaller
657     {
658         vector< pair<SPKISexp*,XMLObject*> > m_SPKISexps;
659
660     public:
661         virtual ~SPKIDataImpl() {}
662
663         SPKIDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
664             : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
665         }
666             
667         SPKIDataImpl(const SPKIDataImpl& src)
668                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
669             for (vector< pair<SPKISexp*,XMLObject*> >::const_iterator i = src.m_SPKISexps.begin(); i != src.m_SPKISexps.end(); ++i) {
670                 if (i->first) {
671                     getSPKISexps().push_back(make_pair(i->first->cloneSPKISexp(),(i->second ? i->second->clone() : (XMLObject*)nullptr)));
672                 }
673             }
674         }
675         
676         IMPL_XMLOBJECT_CLONE(SPKIData);
677
678     public:
679         VectorOfPairs(SPKISexp,XMLObject) getSPKISexps() {
680             return VectorOfPairs(SPKISexp,XMLObject)(this, m_SPKISexps, &m_children, m_children.end());
681         }
682         
683         const vector< pair<SPKISexp*,XMLObject*> >& getSPKISexps() const {
684             return m_SPKISexps;
685         }
686         
687     protected:
688         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
689             if (XMLHelper::isNodeNamed(root,XMLSIG_NS,SPKISexp::LOCAL_NAME)) {
690                 SPKISexp* typesafe=dynamic_cast<SPKISexp*>(childXMLObject);
691                 if (typesafe) {
692                     getSPKISexps().push_back(make_pair(typesafe,(XMLObject*)nullptr));
693                     return;
694                 }
695             }
696
697             // Unknown child (has to be paired with the last SPKISexp processed.
698             const XMLCh* nsURI=root->getNamespaceURI();
699             if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) {
700                 // Update second half of pair in vector, and in master list.
701                 if (!m_SPKISexps.empty() && m_SPKISexps.back().second==nullptr) {
702                     m_SPKISexps.back().second=childXMLObject;
703                     m_children.back()=childXMLObject;
704                     return;
705                 }
706                 else
707                     throw UnmarshallingException("Extension element must follow ds:SPKISexp element.");
708             }
709             
710             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
711         }
712     };
713
714     class XMLTOOL_DLLLOCAL PGPDataImpl : public virtual PGPData,
715         public AbstractComplexElement,
716         public AbstractDOMCachingXMLObject,
717         public AbstractXMLObjectMarshaller,
718         public AbstractXMLObjectUnmarshaller
719     {
720         void init() {
721             m_PGPKeyID=nullptr;
722             m_PGPKeyPacket=nullptr;
723             m_children.push_back(nullptr);
724             m_children.push_back(nullptr);
725             m_pos_PGPKeyID=m_children.begin();
726             m_pos_PGPKeyPacket=m_pos_PGPKeyID;
727             ++m_pos_PGPKeyPacket;
728         }
729         
730     public:
731         virtual ~PGPDataImpl() {}
732
733         PGPDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
734                 : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
735             init();
736         }
737             
738         PGPDataImpl(const PGPDataImpl& src)
739                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
740             init();
741             IMPL_CLONE_TYPED_CHILD(PGPKeyID);
742             IMPL_CLONE_TYPED_CHILD(PGPKeyPacket);
743             IMPL_CLONE_XMLOBJECT_CHILDREN(UnknownXMLObject);
744         }
745         
746         IMPL_XMLOBJECT_CLONE(PGPData);
747         IMPL_TYPED_CHILD(PGPKeyID);
748         IMPL_TYPED_CHILD(PGPKeyPacket);
749         IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
750
751     protected:
752         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
753             PROC_TYPED_CHILD(PGPKeyID,XMLSIG_NS,false);
754             PROC_TYPED_CHILD(PGPKeyPacket,XMLSIG_NS,false);
755
756             // Unknown child.
757             const XMLCh* nsURI=root->getNamespaceURI();
758             if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) {
759                 getUnknownXMLObjects().push_back(childXMLObject);
760                 return;
761             }
762
763             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
764         }
765     };
766
767     class XMLTOOL_DLLLOCAL KeyInfoReferenceImpl : public virtual KeyInfoReference,
768         public AbstractComplexElement,
769         public AbstractDOMCachingXMLObject,
770         public AbstractXMLObjectMarshaller,
771         public AbstractXMLObjectUnmarshaller
772     {
773         void init() {
774             m_Id=m_URI=nullptr;
775         }
776
777     public:
778         virtual ~KeyInfoReferenceImpl() {
779             XMLString::release(&m_Id);
780             XMLString::release(&m_URI);
781         }
782
783         KeyInfoReferenceImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
784             : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
785             init();
786         }
787
788         KeyInfoReferenceImpl(const KeyInfoReferenceImpl& src)
789                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src) {
790             init();
791             IMPL_CLONE_ATTRIB(Id);
792             IMPL_CLONE_ATTRIB(URI);
793         }
794
795         IMPL_XMLOBJECT_CLONE(KeyInfoReference);
796         IMPL_ID_ATTRIB_EX(Id,ID,nullptr);
797         IMPL_STRING_ATTRIB(URI);
798
799     protected:
800         void marshallAttributes(DOMElement* domElement) const {
801             MARSHALL_ID_ATTRIB(Id,ID,nullptr);
802             MARSHALL_STRING_ATTRIB(URI,URI,nullptr);
803         }
804
805         void processAttribute(const DOMAttr* attribute) {
806             PROC_ID_ATTRIB(Id,ID,nullptr);
807             PROC_STRING_ATTRIB(URI,URI,nullptr);
808             AbstractXMLObjectUnmarshaller::processAttribute(attribute);
809         }
810     };
811
812     class XMLTOOL_DLLLOCAL KeyInfoImpl : public virtual KeyInfo,
813         public AbstractComplexElement,
814         public AbstractDOMCachingXMLObject,
815         public AbstractXMLObjectMarshaller,
816         public AbstractXMLObjectUnmarshaller
817     {
818     public:
819         virtual ~KeyInfoImpl() {
820             XMLString::release(&m_Id);
821         }
822
823         KeyInfoImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
824             : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Id(nullptr) {
825         }
826             
827         KeyInfoImpl(const KeyInfoImpl& src)
828                 : AbstractXMLObject(src), AbstractComplexElement(src), AbstractDOMCachingXMLObject(src), m_Id(nullptr) {
829             IMPL_CLONE_ATTRIB(Id);
830             IMPL_CLONE_CHILDBAG_BEGIN;
831                 IMPL_CLONE_TYPED_CHILD_IN_BAG(X509Data);
832                 IMPL_CLONE_TYPED_CHILD_IN_BAG(KeyName);
833                 IMPL_CLONE_TYPED_CHILD_IN_BAG(KeyValue);
834                 IMPL_CLONE_TYPED_CHILD_IN_BAG(DEREncodedKeyValue);
835                 IMPL_CLONE_TYPED_CHILD_IN_BAG(RetrievalMethod);
836                 IMPL_CLONE_TYPED_CHILD_IN_BAG(MgmtData);
837                 IMPL_CLONE_TYPED_CHILD_IN_BAG(SPKIData);
838                 IMPL_CLONE_TYPED_CHILD_IN_BAG(PGPData);
839                 IMPL_CLONE_TYPED_CHILD_IN_BAG(KeyInfoReference);
840                 IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(UnknownXMLObject);
841             IMPL_CLONE_CHILDBAG_END;
842         }
843         
844         IMPL_XMLOBJECT_CLONE(KeyInfo);
845         IMPL_ID_ATTRIB_EX(Id,ID,nullptr);
846         IMPL_TYPED_CHILDREN(KeyName,m_children.end());
847         IMPL_TYPED_CHILDREN(KeyValue,m_children.end());
848         IMPL_TYPED_CHILDREN(DEREncodedKeyValue,m_children.end());
849         IMPL_TYPED_CHILDREN(RetrievalMethod,m_children.end());
850         IMPL_TYPED_CHILDREN(X509Data,m_children.end());
851         IMPL_TYPED_CHILDREN(MgmtData,m_children.end());
852         IMPL_TYPED_CHILDREN(SPKIData,m_children.end());
853         IMPL_TYPED_CHILDREN(PGPData,m_children.end());
854         IMPL_TYPED_CHILDREN(KeyInfoReference,m_children.end());
855         IMPL_XMLOBJECT_CHILDREN(UnknownXMLObject,m_children.end());
856
857     protected:
858         void marshallAttributes(DOMElement* domElement) const {
859             MARSHALL_ID_ATTRIB(Id,ID,nullptr);
860         }
861
862         void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
863             PROC_TYPED_CHILDREN(X509Data,XMLSIG_NS,false);
864             PROC_TYPED_CHILDREN(KeyName,XMLSIG_NS,false);
865             PROC_TYPED_CHILDREN(KeyValue,XMLSIG_NS,false);
866             PROC_TYPED_CHILDREN(DEREncodedKeyValue,XMLSIG11_NS,false);
867             PROC_TYPED_CHILDREN(RetrievalMethod,XMLSIG_NS,false);
868             PROC_TYPED_CHILDREN(MgmtData,XMLSIG_NS,false);
869             PROC_TYPED_CHILDREN(SPKIData,XMLSIG_NS,false);
870             PROC_TYPED_CHILDREN(PGPData,XMLSIG_NS,false);
871             PROC_TYPED_CHILDREN(KeyInfoReference,XMLSIG11_NS,false);
872             
873             // Unknown child.
874             const XMLCh* nsURI=root->getNamespaceURI();
875             if (!XMLString::equals(nsURI,XMLSIG_NS) && nsURI && *nsURI) {
876                 getUnknownXMLObjects().push_back(childXMLObject);
877                 return;
878             }
879             
880             AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
881         }
882
883         void processAttribute(const DOMAttr* attribute) {
884             PROC_ID_ATTRIB(Id,ID,nullptr);
885             AbstractXMLObjectUnmarshaller::processAttribute(attribute);
886         }
887     };
888    
889     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,KeyName);
890     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,MgmtData);
891     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Modulus);
892     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Exponent);
893     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Seed);
894     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,PgenCounter);
895     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,P);
896     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Q);
897     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,G);
898     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Y);
899     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,J);
900     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,XPath);
901     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509IssuerName);
902     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509SerialNumber);
903     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509SKI);
904     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509SubjectName);
905     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509Certificate);
906     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,X509CRL);
907     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,SPKISexp);
908     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,PGPKeyID);
909     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,PGPKeyPacket);
910
911     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,OCSPResponse);
912     DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,PublicKey);
913 };
914
915 #if defined (_MSC_VER)
916     #pragma warning( pop )
917 #endif
918
919 // Builder Implementations
920
921 IMPL_XMLOBJECTBUILDER(X509IssuerSerial);
922 IMPL_XMLOBJECTBUILDER(X509IssuerName);
923 IMPL_XMLOBJECTBUILDER(X509SerialNumber);
924 IMPL_XMLOBJECTBUILDER(X509SKI);
925 IMPL_XMLOBJECTBUILDER(X509SubjectName);
926 IMPL_XMLOBJECTBUILDER(X509Certificate);
927 IMPL_XMLOBJECTBUILDER(X509CRL);
928 IMPL_XMLOBJECTBUILDER(X509Data);
929 IMPL_XMLOBJECTBUILDER(XPath);
930 IMPL_XMLOBJECTBUILDER(Transform);
931 IMPL_XMLOBJECTBUILDER(Transforms);
932 IMPL_XMLOBJECTBUILDER(RetrievalMethod);
933 IMPL_XMLOBJECTBUILDER(KeyName);
934 IMPL_XMLOBJECTBUILDER(MgmtData);
935 IMPL_XMLOBJECTBUILDER(Modulus);
936 IMPL_XMLOBJECTBUILDER(Exponent);
937 IMPL_XMLOBJECTBUILDER(Seed);
938 IMPL_XMLOBJECTBUILDER(PgenCounter);
939 IMPL_XMLOBJECTBUILDER(P);
940 IMPL_XMLOBJECTBUILDER(Q);
941 IMPL_XMLOBJECTBUILDER(G);
942 IMPL_XMLOBJECTBUILDER(Y);
943 IMPL_XMLOBJECTBUILDER(J);
944 IMPL_XMLOBJECTBUILDER(DSAKeyValue);
945 IMPL_XMLOBJECTBUILDER(RSAKeyValue);
946 IMPL_XMLOBJECTBUILDER(KeyValue);
947 IMPL_XMLOBJECTBUILDER(KeyInfo);
948 IMPL_XMLOBJECTBUILDER(SPKISexp);
949 IMPL_XMLOBJECTBUILDER(SPKIData);
950 IMPL_XMLOBJECTBUILDER(PGPKeyID);
951 IMPL_XMLOBJECTBUILDER(PGPKeyPacket);
952 IMPL_XMLOBJECTBUILDER(PGPData);
953
954 IMPL_XMLOBJECTBUILDER(DEREncodedKeyValue);
955 IMPL_XMLOBJECTBUILDER(ECKeyValue);
956 IMPL_XMLOBJECTBUILDER(KeyInfoReference);
957 IMPL_XMLOBJECTBUILDER(NamedCurve);
958 IMPL_XMLOBJECTBUILDER(OCSPResponse);
959 IMPL_XMLOBJECTBUILDER(PublicKey);
960 IMPL_XMLOBJECTBUILDER(X509Digest);
961
962 // Unicode literals
963
964 const XMLCh KeyInfo::LOCAL_NAME[] =                 UNICODE_LITERAL_7(K,e,y,I,n,f,o);
965 const XMLCh KeyInfo::TYPE_NAME[] =                  UNICODE_LITERAL_11(K,e,y,I,n,f,o,T,y,p,e);
966 const XMLCh KeyInfo::ID_ATTRIB_NAME[] =             UNICODE_LITERAL_2(I,d);
967 const XMLCh KeyValue::LOCAL_NAME[] =                UNICODE_LITERAL_8(K,e,y,V,a,l,u,e);
968 const XMLCh KeyValue::TYPE_NAME[] =                 UNICODE_LITERAL_12(K,e,y,V,a,l,u,e,T,y,p,e);
969 const XMLCh DSAKeyValue::LOCAL_NAME[] =             UNICODE_LITERAL_11(D,S,A,K,e,y,V,a,l,u,e);
970 const XMLCh DSAKeyValue::TYPE_NAME[] =              UNICODE_LITERAL_15(D,S,A,K,e,y,V,a,l,u,e,T,y,p,e);
971 const XMLCh RSAKeyValue::LOCAL_NAME[] =             UNICODE_LITERAL_11(R,S,A,K,e,y,V,a,l,u,e);
972 const XMLCh RSAKeyValue::TYPE_NAME[] =              UNICODE_LITERAL_15(R,S,A,K,e,y,V,a,l,u,e,T,y,p,e);
973 const XMLCh MgmtData::LOCAL_NAME[] =                UNICODE_LITERAL_8(M,g,m,t,D,a,t,a);
974 const XMLCh KeyName::LOCAL_NAME[] =                 UNICODE_LITERAL_7(K,e,y,N,a,m,e);
975 const XMLCh Modulus::LOCAL_NAME[] =                 UNICODE_LITERAL_7(M,o,d,u,l,u,s);
976 const XMLCh Exponent::LOCAL_NAME[] =                UNICODE_LITERAL_8(E,x,p,o,n,e,n,t);
977 const XMLCh Seed::LOCAL_NAME[] =                    UNICODE_LITERAL_4(S,e,e,d);
978 const XMLCh PgenCounter::LOCAL_NAME[] =             UNICODE_LITERAL_11(P,g,e,n,C,o,u,n,t,e,r);
979 const XMLCh P::LOCAL_NAME[] =                       UNICODE_LITERAL_1(P);
980 const XMLCh Q::LOCAL_NAME[] =                       UNICODE_LITERAL_1(Q);
981 const XMLCh G::LOCAL_NAME[] =                       UNICODE_LITERAL_1(G);
982 const XMLCh Y::LOCAL_NAME[] =                       UNICODE_LITERAL_1(Y);
983 const XMLCh J::LOCAL_NAME[] =                       UNICODE_LITERAL_1(J);
984 const XMLCh XPath::LOCAL_NAME[] =                   UNICODE_LITERAL_5(X,P,a,t,h);
985 const XMLCh Transform::LOCAL_NAME[] =               UNICODE_LITERAL_9(T,r,a,n,s,f,o,r,m);
986 const XMLCh Transform::TYPE_NAME[] =                UNICODE_LITERAL_13(T,r,a,n,s,f,o,r,m,T,y,p,e);
987 const XMLCh Transform::ALGORITHM_ATTRIB_NAME[] =    UNICODE_LITERAL_9(A,l,g,o,r,i,t,h,m);
988 const XMLCh Transforms::LOCAL_NAME[] =              UNICODE_LITERAL_10(T,r,a,n,s,f,o,r,m,s);
989 const XMLCh Transforms::TYPE_NAME[] =               UNICODE_LITERAL_14(T,r,a,n,s,f,o,r,m,s,T,y,p,e);
990 const XMLCh RetrievalMethod::LOCAL_NAME[] =         UNICODE_LITERAL_15(R,e,t,r,i,e,v,a,l,M,e,t,h,o,d);
991 const XMLCh RetrievalMethod::TYPE_NAME[] =          UNICODE_LITERAL_19(R,e,t,r,i,e,v,a,l,M,e,t,h,o,d,T,y,p,e);
992 const XMLCh RetrievalMethod::URI_ATTRIB_NAME[] =    UNICODE_LITERAL_3(U,R,I);
993 const XMLCh RetrievalMethod::TYPE_ATTRIB_NAME[] =   UNICODE_LITERAL_4(T,y,p,e);
994 const XMLCh SPKISexp::LOCAL_NAME[] =                UNICODE_LITERAL_8(S,P,K,I,S,e,x,p);
995 const XMLCh SPKIData::LOCAL_NAME[] =                UNICODE_LITERAL_8(S,P,K,I,D,a,t,a);
996 const XMLCh SPKIData::TYPE_NAME[] =                 UNICODE_LITERAL_12(S,P,K,I,D,a,t,a,T,y,p,e);
997 const XMLCh PGPKeyID::LOCAL_NAME[] =                UNICODE_LITERAL_8(P,G,P,K,e,y,I,D);
998 const XMLCh PGPKeyPacket::LOCAL_NAME[] =            UNICODE_LITERAL_12(P,G,P,K,e,y,P,a,c,k,e,t);
999 const XMLCh PGPData::LOCAL_NAME[] =                 UNICODE_LITERAL_7(P,G,P,D,a,t,a);
1000 const XMLCh PGPData::TYPE_NAME[] =                  UNICODE_LITERAL_11(P,G,P,D,a,t,a,T,y,p,e);
1001
1002 const XMLCh DEREncodedKeyValue::LOCAL_NAME[] =      UNICODE_LITERAL_18(D,E,R,E,n,c,o,d,e,d,K,e,y,V,a,l,u,e);
1003 const XMLCh DEREncodedKeyValue::TYPE_NAME[] =       UNICODE_LITERAL_22(D,E,R,E,n,c,o,d,e,d,K,e,y,V,a,l,u,e,T,y,p,e);
1004 const XMLCh DEREncodedKeyValue::ID_ATTRIB_NAME[] =  UNICODE_LITERAL_2(I,d);
1005 const XMLCh ECKeyValue::LOCAL_NAME[] =              UNICODE_LITERAL_10(E,C,K,e,y,V,a,l,u,e);
1006 const XMLCh ECKeyValue::TYPE_NAME[] =               UNICODE_LITERAL_14(E,C,K,e,y,V,a,l,u,e,T,y,p,e);
1007 const XMLCh ECKeyValue::ID_ATTRIB_NAME[] =          UNICODE_LITERAL_2(I,d);
1008 const XMLCh KeyInfoReference::LOCAL_NAME[] =        UNICODE_LITERAL_16(K,e,y,I,n,f,o,R,e,f,e,r,e,n,c,e);
1009 const XMLCh KeyInfoReference::TYPE_NAME[] =         UNICODE_LITERAL_20(K,e,y,I,n,f,o,R,e,f,e,r,e,n,c,e,T,y,p,e);
1010 const XMLCh KeyInfoReference::ID_ATTRIB_NAME[] =    UNICODE_LITERAL_2(I,d);
1011 const XMLCh KeyInfoReference::URI_ATTRIB_NAME[] =   UNICODE_LITERAL_3(U,R,I);
1012 const XMLCh NamedCurve::LOCAL_NAME[] =              UNICODE_LITERAL_10(N,a,m,e,d,C,u,r,v,e);
1013 const XMLCh NamedCurve::TYPE_NAME[] =               UNICODE_LITERAL_14(N,a,m,e,d,C,u,r,v,e,T,y,p,e);
1014 const XMLCh NamedCurve::URI_ATTRIB_NAME[] =         UNICODE_LITERAL_3(U,R,I);
1015 const XMLCh OCSPResponse::LOCAL_NAME[] =            UNICODE_LITERAL_12(O,C,S,P,R,e,s,p,o,n,s,e);
1016 const XMLCh PublicKey::LOCAL_NAME[] =               UNICODE_LITERAL_9(P,u,b,l,i,c,K,e,y);
1017 const XMLCh X509Digest::ALGORITHM_ATTRIB_NAME[] =   UNICODE_LITERAL_9(A,l,g,o,r,i,t,h,m);
1018
1019 #define XCH(ch) chLatin_##ch
1020 #define XNUM(d) chDigit_##d
1021
1022 const XMLCh X509Data::LOCAL_NAME[] = {
1023     XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(D), XCH(a), XCH(t), XCH(a), chNull
1024     };
1025 const XMLCh X509Data::TYPE_NAME[] = {
1026     XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(D), XCH(a), XCH(t), XCH(a), XCH(T), XCH(y), XCH(p), XCH(e), chNull
1027     };
1028 const XMLCh X509IssuerSerial::LOCAL_NAME[] = {
1029     XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(I), XCH(s), XCH(s), XCH(u), XCH(e), XCH(r),
1030     XCH(S), XCH(e), XCH(r), XCH(i), XCH(a), XCH(l), chNull
1031     };
1032 const XMLCh X509IssuerSerial::TYPE_NAME[] = {
1033     XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(I), XCH(s), XCH(s), XCH(u), XCH(e), XCH(r),
1034     XCH(S), XCH(e), XCH(r), XCH(i), XCH(a), XCH(l), XCH(T), XCH(y), XCH(p), XCH(e), chNull
1035     };
1036 const XMLCh X509IssuerName::LOCAL_NAME[] = {
1037     XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(I), XCH(s), XCH(s), XCH(u), XCH(e), XCH(r),
1038     XCH(N), XCH(a), XCH(m), XCH(e), chNull
1039     };
1040 const XMLCh X509SerialNumber::LOCAL_NAME[] = {
1041     XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(S), XCH(e), XCH(r), XCH(i), XCH(a), XCH(l),
1042     XCH(N), XCH(u), XCH(m), XCH(b), XCH(e), XCH(r), chNull
1043     };
1044 const XMLCh X509SKI::LOCAL_NAME[] = { XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(S), XCH(K), XCH(I), chNull };
1045 const XMLCh X509SubjectName::LOCAL_NAME[] = {
1046     XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(S), XCH(u), XCH(b), XCH(j), XCH(e), XCH(c), XCH(t),
1047     XCH(N), XCH(a), XCH(m), XCH(e), chNull
1048     };
1049 const XMLCh X509Certificate::LOCAL_NAME[] = {
1050     XCH(X), XNUM(5), XNUM(0), XNUM(9),
1051     XCH(C), XCH(e), XCH(r), XCH(t), XCH(i), XCH(f), XCH(i), XCH(c), XCH(a), XCH(t), XCH(e), chNull
1052     };
1053 const XMLCh X509CRL::LOCAL_NAME[] = { XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(C), XCH(R), XCH(L), chNull };
1054 const XMLCh X509Digest::LOCAL_NAME[] = {
1055     XCH(X), XNUM(5), XNUM(0), XNUM(9), XCH(D), XCH(i), XCH(g), XCH(e), XCH(s), XCH(t), chNull
1056     };
1057 const XMLCh X509Digest::TYPE_NAME[] = {
1058     XCH(X), XNUM(5), XNUM(0), XNUM(9),  XCH(D), XCH(i), XCH(g), XCH(e), XCH(s), XCH(t), XCH(T), XCH(y), XCH(p), XCH(e), chNull
1059     };
1060
1061 const XMLCh RetrievalMethod::TYPE_DSAKEYVALUE[] = {
1062     chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
1063     chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
1064     chDigit_2, chDigit_0, chDigit_0, chDigit_0, chForwardSlash, chDigit_0, chDigit_9, chForwardSlash,
1065     chLatin_x, chLatin_m, chLatin_l, chLatin_d, chLatin_s, chLatin_i, chLatin_g, chPound,
1066     chLatin_D, chLatin_S, chLatin_A, chLatin_K, chLatin_e, chLatin_y, chLatin_V, chLatin_a, chLatin_l, chLatin_u, chLatin_e, chNull
1067     };
1068
1069 const XMLCh RetrievalMethod::TYPE_RSAKEYVALUE[] = {
1070     chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
1071     chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
1072     chDigit_2, chDigit_0, chDigit_0, chDigit_0, chForwardSlash, chDigit_0, chDigit_9, chForwardSlash,
1073     chLatin_x, chLatin_m, chLatin_l, chLatin_d, chLatin_s, chLatin_i, chLatin_g, chPound,
1074     chLatin_R, chLatin_S, chLatin_A, chLatin_K, chLatin_e, chLatin_y, chLatin_V, chLatin_a, chLatin_l, chLatin_u, chLatin_e, chNull
1075     };
1076
1077 const XMLCh RetrievalMethod::TYPE_X509DATA[] = {
1078     chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
1079     chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
1080     chDigit_2, chDigit_0, chDigit_0, chDigit_0, chForwardSlash, chDigit_0, chDigit_9, chForwardSlash,
1081     chLatin_x, chLatin_m, chLatin_l, chLatin_d, chLatin_s, chLatin_i, chLatin_g, chPound,
1082     chLatin_X, chDigit_5, chDigit_0, chDigit_9, chLatin_D, chLatin_a, chLatin_t, chLatin_a, chNull
1083     };