Add nil flag to AttributeValue.
[shibboleth/cpp-opensaml.git] / saml / saml2 / core / Assertions.h
1 /*
2  *  Copyright 2001-2007 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  * @file saml/saml2/core/Assertions.h
19  * 
20  * XMLObjects representing the SAML 2.0 Assertions schema
21  */
22
23 #ifndef __saml2_assertions_h__
24 #define __saml2_assertions_h__
25
26 #include <saml/Assertion.h>
27 #include <saml/util/SAMLConstants.h>
28
29 #include <xmltooling/XMLObjectBuilder.h>
30 #include <xmltooling/encryption/Encryption.h>
31 #include <xmltooling/security/CredentialCriteria.h>
32 #include <xmltooling/security/CredentialResolver.h>
33 #include <xmltooling/signature/Signature.h>
34 #include <xmltooling/util/DateTime.h>
35
36 #define DECL_SAML2OBJECTBUILDER(cname) \
37     DECL_XMLOBJECTBUILDER(SAML_API,cname,samlconstants::SAML20_NS,samlconstants::SAML20_PREFIX)
38
39 namespace opensaml {
40
41     namespace saml2md {
42         class SAML_API MetadataProvider;
43         class SAML_API MetadataCredentialCriteria;
44     };
45
46     /**
47      * @namespace opensaml::saml2
48      * SAML 2.0 assertion namespace
49      */
50     namespace saml2 {
51         
52         // Forward references
53         class SAML_API Assertion;
54         class SAML_API EncryptedAssertion;
55
56         /**
57          * Marker interface for SAML types that can be encrypted.
58          */
59         class SAML_API EncryptableObject : public virtual xmltooling::XMLObject
60         {
61         protected:
62             EncryptableObject() {}
63             virtual ~EncryptableObject() {}
64         };
65         
66         DECL_XMLOBJECT_SIMPLE(SAML_API,AssertionIDRef,AssertionID,SAML 2.0 AssertionIDRef element);
67         DECL_XMLOBJECT_SIMPLE(SAML_API,AssertionURIRef,AssertionURI,SAML 2.0 AssertionURIRef element);
68         DECL_XMLOBJECT_SIMPLE(SAML_API,Audience,AudienceURI,SAML 2.0 Audience element);
69         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthnContextClassRef,Reference,SAML 2.0 AuthnContextClassRef element);
70         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthnContextDeclRef,Reference,SAML 2.0 AuthnContextDeclRef element);
71         DECL_XMLOBJECT_SIMPLE(SAML_API,AuthenticatingAuthority,ID,SAML 2.0 AuthenticatingAuthority element);
72
73         BEGIN_XMLOBJECT(SAML_API,EncryptedElementType,xmltooling::XMLObject,SAML 2.0 EncryptedElementType type);
74             DECL_TYPED_FOREIGN_CHILD(EncryptedData,xmlencryption);
75             DECL_TYPED_FOREIGN_CHILDREN(EncryptedKey,xmlencryption);
76             /** EncryptedElementType local name */
77             static const XMLCh TYPE_NAME[];
78             
79             /**
80              * Encrypts an object to a single recipient using this object as a container.
81              * 
82              * @param xmlObject         object to encrypt
83              * @param metadataProvider  a locked MetadataProvider to supply encryption keys
84              * @param criteria          metadata-based CredentialCriteria to use
85              * @param compact           true iff compact KeyInfo should be used
86              * @param algorithm         optionally specifies data encryption algorithm if none can be determined from metadata
87              * @return  the encrypted object
88              */
89             virtual void encrypt(
90                 const EncryptableObject& xmlObject,
91                 const saml2md::MetadataProvider& metadataProvider,
92                 saml2md::MetadataCredentialCriteria& criteria,
93                 bool compact=false,
94                 const XMLCh* algorithm=NULL
95                 );
96
97             /**
98              * Encrypts an object to multiple recipients using this object as a container.
99              * 
100              * @param xmlObject     object to encrypt
101              * @param recipients    pairs containing a locked MetadataProvider to supply encryption keys,
102              *                      and a metadata-based CredentialCriteria to use
103              * @param compact       true iff compact KeyInfo should be used
104              * @param algorithm     optionally specifies data encryption algorithm if none can be determined from metadata
105              * @return  the encrypted object
106              */
107             virtual void encrypt(
108                 const EncryptableObject& xmlObject,
109                 const std::vector< std::pair<const saml2md::MetadataProvider*, saml2md::MetadataCredentialCriteria*> >& recipients,
110                 bool compact=false,
111                 const XMLCh* algorithm=NULL
112                 );
113
114             /**
115              * Decrypts the element using the supplied CredentialResolver.
116              *
117              * <p>The object returned will be unmarshalled around the decrypted DOM element in a
118              * new Document owned by the object.
119              * 
120              * @param credResolver  locked resolver supplying decryption keys
121              * @param recipient     identifier naming the recipient (the entity performing the decryption)
122              * @param criteria      optional external criteria to use with resolver
123              * @return  the decrypted and unmarshalled object
124              */
125             virtual xmltooling::XMLObject* decrypt(
126                 const xmltooling::CredentialResolver& credResolver, const XMLCh* recipient, xmltooling::CredentialCriteria* criteria=NULL
127                 ) const;
128         END_XMLOBJECT;
129
130         BEGIN_XMLOBJECT(SAML_API,EncryptedID,EncryptedElementType,SAML 2.0 EncryptedID element);
131         END_XMLOBJECT;
132
133         BEGIN_XMLOBJECT(SAML_API,BaseID,EncryptableObject,SAML 2.0 BaseID abstract element);
134             DECL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER);
135             DECL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER);
136         END_XMLOBJECT;
137
138         BEGIN_XMLOBJECT(SAML_API,NameIDType,xmltooling::XMLObject,SAML 2.0 NameIDType type);
139             DECL_STRING_ATTRIB(NameQualifier,NAMEQUALIFIER);
140             DECL_STRING_ATTRIB(SPNameQualifier,SPNAMEQUALIFIER);
141             DECL_STRING_ATTRIB(Format,FORMAT);
142             DECL_STRING_ATTRIB(SPProvidedID,SPPROVIDEDID);
143             DECL_SIMPLE_CONTENT(Name);
144             /** NameIDType local name */
145             static const XMLCh TYPE_NAME[];
146             /** Unspecified name format ID */
147             static const XMLCh UNSPECIFIED[];
148             /** Email address name format ID */
149             static const XMLCh EMAIL[];
150             /** X.509 subject name format ID */
151             static const XMLCh X509_SUBJECT[];
152             /** Windows domain qualified name format ID */
153             static const XMLCh WIN_DOMAIN_QUALIFIED[];
154             /** Kerberos principal name format ID */
155             static const XMLCh KERBEROS[];
156             /** Entity identifier name format ID */
157             static const XMLCh ENTITY[];
158             /** Persistent identifier name format ID */
159             static const XMLCh PERSISTENT[];
160             /** Transient identifier name format ID */
161             static const XMLCh TRANSIENT[];
162         END_XMLOBJECT;
163
164         BEGIN_XMLOBJECT2(SAML_API,NameID,NameIDType,EncryptableObject,SAML 2.0 NameID element);
165         END_XMLOBJECT;
166
167         BEGIN_XMLOBJECT(SAML_API,Issuer,NameIDType,SAML 2.0 Issuer element);
168         END_XMLOBJECT;
169
170         BEGIN_XMLOBJECT(SAML_API,Condition,xmltooling::XMLObject,SAML 2.0 Condition element);
171         END_XMLOBJECT;
172         
173         BEGIN_XMLOBJECT(SAML_API,AudienceRestriction,Condition,SAML 2.0 AudienceRestriction element);
174             DECL_TYPED_CHILDREN(Audience);
175             /** AudienceRestrictionType local name */
176             static const XMLCh TYPE_NAME[];
177         END_XMLOBJECT;
178
179         BEGIN_XMLOBJECT(SAML_API,OneTimeUse,Condition,SAML 2.0 OneTimeUse element);
180             /** OneTimeUseType local name */
181             static const XMLCh TYPE_NAME[];
182         END_XMLOBJECT;
183
184         BEGIN_XMLOBJECT(SAML_API,ProxyRestriction,Condition,SAML 2.0 ProxyRestriction element);
185             DECL_INTEGER_ATTRIB(Count,COUNT);
186             DECL_TYPED_CHILDREN(Audience);
187             /** ProxyRestrictionType local name */
188             static const XMLCh TYPE_NAME[];
189         END_XMLOBJECT;
190
191         BEGIN_XMLOBJECT(SAML_API,Conditions,xmltooling::XMLObject,SAML 2.0 Conditions element);
192             DECL_DATETIME_ATTRIB(NotBefore,NOTBEFORE);
193             DECL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER);
194             DECL_TYPED_CHILDREN(AudienceRestriction);
195             DECL_TYPED_CHILDREN(OneTimeUse);
196             DECL_TYPED_CHILDREN(ProxyRestriction);
197             DECL_TYPED_CHILDREN(Condition);
198             /** ConditionsType local name */
199             static const XMLCh TYPE_NAME[];
200         END_XMLOBJECT;
201
202         BEGIN_XMLOBJECT(SAML_API,SubjectConfirmationDataType,xmltooling::XMLObject,SAML 2.0 SubjectConfirmationDataType base type);
203             DECL_DATETIME_ATTRIB(NotBefore,NOTBEFORE);
204             DECL_DATETIME_ATTRIB(NotOnOrAfter,NOTONORAFTER);
205             DECL_STRING_ATTRIB(Recipient,RECIPIENT);
206             DECL_STRING_ATTRIB(InResponseTo,INRESPONSETO);
207             DECL_STRING_ATTRIB(Address,ADDRESS);
208         END_XMLOBJECT;
209
210         BEGIN_XMLOBJECT2(SAML_API,SubjectConfirmationData,SubjectConfirmationDataType,xmltooling::ElementProxy,SAML 2.0 SubjectConfirmationData element);
211             DECL_SIMPLE_CONTENT(Data);
212         END_XMLOBJECT;
213
214         BEGIN_XMLOBJECT2(SAML_API,KeyInfoConfirmationDataType,SubjectConfirmationDataType,xmltooling::AttributeExtensibleXMLObject,SAML 2.0 KeyInfoConfirmationDataType type);
215             DECL_TYPED_FOREIGN_CHILDREN(KeyInfo,xmlsignature);
216             /** KeyInfoConfirmationDataType local name */
217             static const XMLCh TYPE_NAME[];
218         END_XMLOBJECT;
219         
220         BEGIN_XMLOBJECT(SAML_API,SubjectConfirmation,xmltooling::XMLObject,SAML 2.0 SubjectConfirmation element);
221             DECL_STRING_ATTRIB(Method,METHOD);
222             DECL_TYPED_CHILD(BaseID);
223             DECL_TYPED_CHILD(NameID);
224             DECL_TYPED_CHILD(EncryptedID);
225             DECL_XMLOBJECT_CHILD(SubjectConfirmationData);
226             /** SubjectConfirmationType local name */
227             static const XMLCh TYPE_NAME[];
228             /** Bearer confirmation method */
229             static const XMLCh BEARER[];
230             /** Holder of key confirmation method */
231             static const XMLCh HOLDER_KEY[];
232             /** Sender vouches confirmation method */
233             static const XMLCh SENDER_VOUCHES[];
234         END_XMLOBJECT;
235
236         BEGIN_XMLOBJECT(SAML_API,Subject,xmltooling::XMLObject,SAML 2.0 Subject element);
237             DECL_TYPED_CHILD(BaseID);
238             DECL_TYPED_CHILD(NameID);
239             DECL_TYPED_CHILD(EncryptedID);
240             DECL_TYPED_CHILDREN(SubjectConfirmation);
241             /** SubjectType local name */
242             static const XMLCh TYPE_NAME[];
243         END_XMLOBJECT;
244
245         BEGIN_XMLOBJECT(SAML_API,Statement,xmltooling::XMLObject,SAML 2.0 Statement element);
246         END_XMLOBJECT;
247
248         BEGIN_XMLOBJECT(SAML_API,SubjectLocality,xmltooling::XMLObject,SAML 2.0 SubjectLocality element);
249             DECL_STRING_ATTRIB(Address,ADDRESS);
250             DECL_STRING_ATTRIB(DNSName,DNSNAME);
251             /** SubjectLocalityType local name */
252             static const XMLCh TYPE_NAME[];
253         END_XMLOBJECT;
254
255         BEGIN_XMLOBJECT(SAML_API,AuthnContextDecl,xmltooling::ElementProxy,SAML 2.0 AuthnContextDecl element);
256         END_XMLOBJECT;
257
258         BEGIN_XMLOBJECT(SAML_API,AuthnContext,xmltooling::XMLObject,SAML 2.0 AuthnContext element);
259             DECL_TYPED_CHILD(AuthnContextClassRef);
260             DECL_XMLOBJECT_CHILD(AuthnContextDecl);
261             DECL_TYPED_CHILD(AuthnContextDeclRef);
262             DECL_TYPED_CHILDREN(AuthenticatingAuthority);
263             /** AuthnContextType local name */
264             static const XMLCh TYPE_NAME[];
265         END_XMLOBJECT;
266
267         BEGIN_XMLOBJECT(SAML_API,AuthnStatement,Statement,SAML 2.0 AuthnStatement element);
268             DECL_DATETIME_ATTRIB(AuthnInstant,AUTHNINSTANT);
269             DECL_STRING_ATTRIB(SessionIndex,SESSIONINDEX);
270             DECL_DATETIME_ATTRIB(SessionNotOnOrAfter,SESSIONNOTONORAFTER);
271             DECL_TYPED_CHILD(SubjectLocality);
272             DECL_TYPED_CHILD(AuthnContext);
273             /** AuthnStatementType local name */
274             static const XMLCh TYPE_NAME[];
275         END_XMLOBJECT;
276
277         BEGIN_XMLOBJECT(SAML_API,Action,xmltooling::XMLObject,SAML 2.0 Action element);
278             DECL_STRING_ATTRIB(Namespace,NAMESPACE);
279             DECL_SIMPLE_CONTENT(Action);
280             /** ActionType local name */
281             static const XMLCh TYPE_NAME[];
282             /** Read/Write/Execute/Delete/Control Action Namespace */
283             static const XMLCh RWEDC_NEG_ACTION_NAMESPACE[];
284             /** Read/Write/Execute/Delete/Control with Negation Action Namespace */
285             static const XMLCh RWEDC_ACTION_NAMESPACE[];
286             /** Get/Head/Put/Post Action Namespace */
287             static const XMLCh GHPP_ACTION_NAMESPACE[];
288             /** UNIX File Permissions Action Namespace */
289             static const XMLCh UNIX_ACTION_NAMESPACE[];
290         END_XMLOBJECT;
291
292         BEGIN_XMLOBJECT(SAML_API,Evidence,xmltooling::XMLObject,SAML 2.0 Evidence element);
293             DECL_TYPED_CHILDREN(AssertionIDRef);
294             DECL_TYPED_CHILDREN(AssertionURIRef);
295             DECL_TYPED_CHILDREN(Assertion);
296             DECL_TYPED_CHILDREN(EncryptedAssertion);
297             /** EvidenceType local name */
298             static const XMLCh TYPE_NAME[];
299         END_XMLOBJECT;
300
301         BEGIN_XMLOBJECT(SAML_API,AuthzDecisionStatement,Statement,SAML 2.0 AuthzDecisionStatement element);
302             DECL_STRING_ATTRIB(Resource,RESOURCE);
303             DECL_STRING_ATTRIB(Decision,DECISION);
304             DECL_TYPED_CHILDREN(Action);
305             DECL_TYPED_CHILD(Evidence);
306             /** AuthzDecisionStatementType local name */
307             static const XMLCh TYPE_NAME[];
308             /** Permit Decision */
309             static const XMLCh DECISION_PERMIT[];
310             /** Deny Decision */
311             static const XMLCh DECISION_DENY[];
312             /** Indeterminate Decision */
313             static const XMLCh DECISION_INDETERMINATE[];
314         END_XMLOBJECT;
315
316         BEGIN_XMLOBJECT(SAML_API,AttributeValue,xmltooling::ElementProxy,SAML 2.0 AttributeValue element);
317                 DECL_BOOLEAN_ATTRIB(Nil,NIL,false);
318         END_XMLOBJECT;
319
320         BEGIN_XMLOBJECT2(SAML_API,Attribute,xmltooling::AttributeExtensibleXMLObject,EncryptableObject,SAML 2.0 Attribute element);
321             DECL_STRING_ATTRIB(Name,NAME);
322             DECL_STRING_ATTRIB(NameFormat,NAMEFORMAT);
323             DECL_STRING_ATTRIB(FriendlyName,FRIENDLYNAME);
324             DECL_XMLOBJECT_CHILDREN(AttributeValue);
325             /** AttributeType local name */
326             static const XMLCh TYPE_NAME[];
327             /** Unspecified attribute name format ID */
328             static const XMLCh UNSPECIFIED[];
329             /** URI reference attribute name format ID */
330             static const XMLCh URI_REFERENCE[];
331             /** Basic attribute name format ID */
332             static const XMLCh BASIC[];
333         END_XMLOBJECT;
334
335         BEGIN_XMLOBJECT(SAML_API,EncryptedAttribute,EncryptedElementType,SAML 2.0 EncryptedAttribute element);
336         END_XMLOBJECT;
337
338         BEGIN_XMLOBJECT(SAML_API,AttributeStatement,Statement,SAML 2.0 AttributeStatement element);
339             DECL_TYPED_CHILDREN(Attribute);
340             DECL_TYPED_CHILDREN(EncryptedAttribute);
341             /** AttributeStatementType local name */
342             static const XMLCh TYPE_NAME[];
343         END_XMLOBJECT;
344
345         BEGIN_XMLOBJECT(SAML_API,EncryptedAssertion,EncryptedElementType,SAML 2.0 EncryptedAssertion element);
346         END_XMLOBJECT;
347
348         BEGIN_XMLOBJECT(SAML_API,Advice,xmltooling::ElementExtensibleXMLObject,SAML 2.0 Advice element);
349             DECL_TYPED_CHILDREN(AssertionIDRef);
350             DECL_TYPED_CHILDREN(AssertionURIRef);
351             DECL_TYPED_CHILDREN(Assertion);
352             DECL_TYPED_CHILDREN(EncryptedAssertion);
353             /** AdviceType local name */
354             static const XMLCh TYPE_NAME[];
355         END_XMLOBJECT;
356
357         /**
358          * SAML 2.0 assertion or protocol message.
359          */
360         class SAML_API RootObject : virtual public opensaml::RootObject
361         {
362         protected:
363             RootObject() {}
364         public:
365             virtual ~RootObject() {}
366             
367             /** Gets the Version attribute. */
368             virtual const XMLCh* getVersion() const=0;
369             
370             /** Gets the Issuer. */
371             virtual Issuer* getIssuer() const=0;
372         };
373
374         BEGIN_XMLOBJECT3(SAML_API,Assertion,saml2::RootObject,opensaml::Assertion,EncryptableObject,SAML 2.0 Assertion element);
375             DECL_INHERITED_STRING_ATTRIB(Version,VER);
376             DECL_INHERITED_STRING_ATTRIB(ID,ID);
377             DECL_INHERITED_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT);
378             DECL_INHERITED_TYPED_CHILD(Issuer);
379             DECL_TYPED_CHILD(Subject);
380             DECL_TYPED_CHILD(Conditions);
381             DECL_TYPED_CHILD(Advice);
382             DECL_TYPED_CHILDREN(Statement);
383             DECL_TYPED_CHILDREN(AuthnStatement);
384             DECL_TYPED_CHILDREN(AttributeStatement);
385             DECL_TYPED_CHILDREN(AuthzDecisionStatement);
386             /** AssertionType local name */
387             static const XMLCh TYPE_NAME[];
388         END_XMLOBJECT;
389
390         DECL_SAML2OBJECTBUILDER(Action);
391         DECL_SAML2OBJECTBUILDER(Advice);
392         DECL_SAML2OBJECTBUILDER(Assertion);
393         DECL_SAML2OBJECTBUILDER(AssertionIDRef);
394         DECL_SAML2OBJECTBUILDER(AssertionURIRef);
395         DECL_SAML2OBJECTBUILDER(Attribute);
396         DECL_SAML2OBJECTBUILDER(AttributeStatement);
397         DECL_SAML2OBJECTBUILDER(AttributeValue);
398         DECL_SAML2OBJECTBUILDER(Audience);
399         DECL_SAML2OBJECTBUILDER(AudienceRestriction);
400         DECL_SAML2OBJECTBUILDER(AuthenticatingAuthority);
401         DECL_SAML2OBJECTBUILDER(AuthnContext);
402         DECL_SAML2OBJECTBUILDER(AuthnContextClassRef);
403         DECL_SAML2OBJECTBUILDER(AuthnContextDecl);
404         DECL_SAML2OBJECTBUILDER(AuthnContextDeclRef);
405         DECL_SAML2OBJECTBUILDER(AuthnStatement);
406         DECL_SAML2OBJECTBUILDER(AuthzDecisionStatement);
407         DECL_SAML2OBJECTBUILDER(Conditions);
408         DECL_SAML2OBJECTBUILDER(EncryptedAssertion);
409         DECL_SAML2OBJECTBUILDER(EncryptedAttribute);
410         DECL_SAML2OBJECTBUILDER(EncryptedID);
411         DECL_SAML2OBJECTBUILDER(Evidence);
412         DECL_SAML2OBJECTBUILDER(Issuer);
413         DECL_SAML2OBJECTBUILDER(NameID);
414         DECL_SAML2OBJECTBUILDER(OneTimeUse);
415         DECL_SAML2OBJECTBUILDER(ProxyRestriction);
416         DECL_SAML2OBJECTBUILDER(Subject);
417         DECL_SAML2OBJECTBUILDER(SubjectConfirmation);
418         DECL_SAML2OBJECTBUILDER(SubjectConfirmationData);
419         DECL_SAML2OBJECTBUILDER(SubjectLocality);
420         
421         /**
422          * Builder for NameIDType objects.
423          * 
424          * This is customized to force the element name to be specified.
425          */
426         class SAML_API NameIDTypeBuilder : public xmltooling::XMLObjectBuilder {
427         public:
428             virtual ~NameIDTypeBuilder() {}
429             /** Builder that allows element/type override. */
430 #ifdef HAVE_COVARIANT_RETURNS
431             virtual NameIDType* buildObject(
432 #else
433             virtual xmltooling::XMLObject* buildObject(
434 #endif
435                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
436                 ) const;
437         
438             /** Singleton builder. */
439             static NameIDType* buildNameIDType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
440                 const NameIDTypeBuilder* b = dynamic_cast<const NameIDTypeBuilder*>(
441                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,NameIDType::TYPE_NAME))
442                     );
443                 if (b) {
444                     xmltooling::QName schemaType(samlconstants::SAML20_NS,NameIDType::TYPE_NAME,samlconstants::SAML20_PREFIX);
445 #ifdef HAVE_COVARIANT_RETURNS
446                     return b->buildObject(nsURI, localName, prefix, &schemaType);
447 #else
448                     return dynamic_cast<NameIDType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
449 #endif
450                 }
451                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for NameIDType.");
452             }
453         };
454
455         /**
456          * Builder for KeyInfoConfirmationDataType objects.
457          * 
458          * This is customized to return a SubjectConfirmationData element with an
459          * xsi:type of KeyInfoConfirmationDataType.
460          */
461         class SAML_API KeyInfoConfirmationDataTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
462         public:
463             virtual ~KeyInfoConfirmationDataTypeBuilder() {}
464             /** Default builder. */
465 #ifdef HAVE_COVARIANT_RETURNS
466             virtual KeyInfoConfirmationDataType* buildObject() const {
467 #else
468             virtual xmltooling::XMLObject* buildObject() const {
469 #endif
470                 xmltooling::QName schemaType(
471                     samlconstants::SAML20_NS,KeyInfoConfirmationDataType::TYPE_NAME,samlconstants::SAML20_PREFIX
472                     );
473                 return buildObject(
474                     samlconstants::SAML20_NS,KeyInfoConfirmationDataType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType
475                     );
476             }
477             /** Builder that allows element/type override. */
478 #ifdef HAVE_COVARIANT_RETURNS
479             virtual KeyInfoConfirmationDataType* buildObject(
480 #else
481             virtual xmltooling::XMLObject* buildObject(
482 #endif
483                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
484                 ) const;
485         
486             /** Singleton builder. */
487             static KeyInfoConfirmationDataType* buildKeyInfoConfirmationDataType() {
488                 const KeyInfoConfirmationDataTypeBuilder* b = dynamic_cast<const KeyInfoConfirmationDataTypeBuilder*>(
489                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,KeyInfoConfirmationDataType::TYPE_NAME))
490                     );
491                 if (b)
492 #ifdef HAVE_COVARIANT_RETURNS
493                     return b->buildObject();
494 #else
495                     return dynamic_cast<KeyInfoConfirmationDataType*>(b->buildObject());
496 #endif
497                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for KeyInfoConfirmationDataType.");
498             }
499         };
500
501         /**
502          * Registers builders and validators for SAML 2.0 Assertion classes into the runtime.
503          */
504         void SAML_API registerAssertionClasses();
505     };
506 };
507
508 #endif /* __saml2_assertions_h__ */