Multi-line svn commit, see body.
[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         END_XMLOBJECT;
318
319         BEGIN_XMLOBJECT2(SAML_API,Attribute,xmltooling::AttributeExtensibleXMLObject,EncryptableObject,SAML 2.0 Attribute element);
320             DECL_STRING_ATTRIB(Name,NAME);
321             DECL_STRING_ATTRIB(NameFormat,NAMEFORMAT);
322             DECL_STRING_ATTRIB(FriendlyName,FRIENDLYNAME);
323             DECL_XMLOBJECT_CHILDREN(AttributeValue);
324             /** AttributeType local name */
325             static const XMLCh TYPE_NAME[];
326             /** Unspecified attribute name format ID */
327             static const XMLCh UNSPECIFIED[];
328             /** URI reference attribute name format ID */
329             static const XMLCh URI_REFERENCE[];
330             /** Basic attribute name format ID */
331             static const XMLCh BASIC[];
332         END_XMLOBJECT;
333
334         BEGIN_XMLOBJECT(SAML_API,EncryptedAttribute,EncryptedElementType,SAML 2.0 EncryptedAttribute element);
335         END_XMLOBJECT;
336
337         BEGIN_XMLOBJECT(SAML_API,AttributeStatement,Statement,SAML 2.0 AttributeStatement element);
338             DECL_TYPED_CHILDREN(Attribute);
339             DECL_TYPED_CHILDREN(EncryptedAttribute);
340             /** AttributeStatementType local name */
341             static const XMLCh TYPE_NAME[];
342         END_XMLOBJECT;
343
344         BEGIN_XMLOBJECT(SAML_API,EncryptedAssertion,EncryptedElementType,SAML 2.0 EncryptedAssertion element);
345         END_XMLOBJECT;
346
347         BEGIN_XMLOBJECT(SAML_API,Advice,xmltooling::ElementExtensibleXMLObject,SAML 2.0 Advice element);
348             DECL_TYPED_CHILDREN(AssertionIDRef);
349             DECL_TYPED_CHILDREN(AssertionURIRef);
350             DECL_TYPED_CHILDREN(Assertion);
351             DECL_TYPED_CHILDREN(EncryptedAssertion);
352             /** AdviceType local name */
353             static const XMLCh TYPE_NAME[];
354         END_XMLOBJECT;
355
356         /**
357          * SAML 2.0 assertion or protocol message.
358          */
359         class SAML_API RootObject : virtual public opensaml::RootObject
360         {
361         protected:
362             RootObject() {}
363         public:
364             virtual ~RootObject() {}
365             
366             /** Gets the Version attribute. */
367             virtual const XMLCh* getVersion() const=0;
368             
369             /** Gets the Issuer. */
370             virtual Issuer* getIssuer() const=0;
371         };
372
373         BEGIN_XMLOBJECT3(SAML_API,Assertion,saml2::RootObject,opensaml::Assertion,EncryptableObject,SAML 2.0 Assertion element);
374             DECL_INHERITED_STRING_ATTRIB(Version,VER);
375             DECL_INHERITED_STRING_ATTRIB(ID,ID);
376             DECL_INHERITED_DATETIME_ATTRIB(IssueInstant,ISSUEINSTANT);
377             DECL_INHERITED_TYPED_CHILD(Issuer);
378             DECL_TYPED_CHILD(Subject);
379             DECL_TYPED_CHILD(Conditions);
380             DECL_TYPED_CHILD(Advice);
381             DECL_TYPED_CHILDREN(Statement);
382             DECL_TYPED_CHILDREN(AuthnStatement);
383             DECL_TYPED_CHILDREN(AttributeStatement);
384             DECL_TYPED_CHILDREN(AuthzDecisionStatement);
385             /** AssertionType local name */
386             static const XMLCh TYPE_NAME[];
387         END_XMLOBJECT;
388
389         DECL_SAML2OBJECTBUILDER(Action);
390         DECL_SAML2OBJECTBUILDER(Advice);
391         DECL_SAML2OBJECTBUILDER(Assertion);
392         DECL_SAML2OBJECTBUILDER(AssertionIDRef);
393         DECL_SAML2OBJECTBUILDER(AssertionURIRef);
394         DECL_SAML2OBJECTBUILDER(Attribute);
395         DECL_SAML2OBJECTBUILDER(AttributeStatement);
396         DECL_SAML2OBJECTBUILDER(AttributeValue);
397         DECL_SAML2OBJECTBUILDER(Audience);
398         DECL_SAML2OBJECTBUILDER(AudienceRestriction);
399         DECL_SAML2OBJECTBUILDER(AuthenticatingAuthority);
400         DECL_SAML2OBJECTBUILDER(AuthnContext);
401         DECL_SAML2OBJECTBUILDER(AuthnContextClassRef);
402         DECL_SAML2OBJECTBUILDER(AuthnContextDecl);
403         DECL_SAML2OBJECTBUILDER(AuthnContextDeclRef);
404         DECL_SAML2OBJECTBUILDER(AuthnStatement);
405         DECL_SAML2OBJECTBUILDER(AuthzDecisionStatement);
406         DECL_SAML2OBJECTBUILDER(Conditions);
407         DECL_SAML2OBJECTBUILDER(EncryptedAssertion);
408         DECL_SAML2OBJECTBUILDER(EncryptedAttribute);
409         DECL_SAML2OBJECTBUILDER(EncryptedID);
410         DECL_SAML2OBJECTBUILDER(Evidence);
411         DECL_SAML2OBJECTBUILDER(Issuer);
412         DECL_SAML2OBJECTBUILDER(NameID);
413         DECL_SAML2OBJECTBUILDER(OneTimeUse);
414         DECL_SAML2OBJECTBUILDER(ProxyRestriction);
415         DECL_SAML2OBJECTBUILDER(Subject);
416         DECL_SAML2OBJECTBUILDER(SubjectConfirmation);
417         DECL_SAML2OBJECTBUILDER(SubjectConfirmationData);
418         DECL_SAML2OBJECTBUILDER(SubjectLocality);
419         
420         /**
421          * Builder for NameIDType objects.
422          * 
423          * This is customized to force the element name to be specified.
424          */
425         class SAML_API NameIDTypeBuilder : public xmltooling::XMLObjectBuilder {
426         public:
427             virtual ~NameIDTypeBuilder() {}
428             /** Builder that allows element/type override. */
429 #ifdef HAVE_COVARIANT_RETURNS
430             virtual NameIDType* buildObject(
431 #else
432             virtual xmltooling::XMLObject* buildObject(
433 #endif
434                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
435                 ) const;
436         
437             /** Singleton builder. */
438             static NameIDType* buildNameIDType(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL) {
439                 const NameIDTypeBuilder* b = dynamic_cast<const NameIDTypeBuilder*>(
440                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,NameIDType::TYPE_NAME))
441                     );
442                 if (b) {
443                     xmltooling::QName schemaType(samlconstants::SAML20_NS,NameIDType::TYPE_NAME,samlconstants::SAML20_PREFIX);
444 #ifdef HAVE_COVARIANT_RETURNS
445                     return b->buildObject(nsURI, localName, prefix, &schemaType);
446 #else
447                     return dynamic_cast<NameIDType*>(b->buildObject(nsURI, localName, prefix, &schemaType));
448 #endif
449                 }
450                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for NameIDType.");
451             }
452         };
453
454         /**
455          * Builder for KeyInfoConfirmationDataType objects.
456          * 
457          * This is customized to return a SubjectConfirmationData element with an
458          * xsi:type of KeyInfoConfirmationDataType.
459          */
460         class SAML_API KeyInfoConfirmationDataTypeBuilder : public xmltooling::ConcreteXMLObjectBuilder {
461         public:
462             virtual ~KeyInfoConfirmationDataTypeBuilder() {}
463             /** Default builder. */
464 #ifdef HAVE_COVARIANT_RETURNS
465             virtual KeyInfoConfirmationDataType* buildObject() const {
466 #else
467             virtual xmltooling::XMLObject* buildObject() const {
468 #endif
469                 xmltooling::QName schemaType(
470                     samlconstants::SAML20_NS,KeyInfoConfirmationDataType::TYPE_NAME,samlconstants::SAML20_PREFIX
471                     );
472                 return buildObject(
473                     samlconstants::SAML20_NS,KeyInfoConfirmationDataType::LOCAL_NAME,samlconstants::SAML20_PREFIX,&schemaType
474                     );
475             }
476             /** Builder that allows element/type override. */
477 #ifdef HAVE_COVARIANT_RETURNS
478             virtual KeyInfoConfirmationDataType* buildObject(
479 #else
480             virtual xmltooling::XMLObject* buildObject(
481 #endif
482                 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL
483                 ) const;
484         
485             /** Singleton builder. */
486             static KeyInfoConfirmationDataType* buildKeyInfoConfirmationDataType() {
487                 const KeyInfoConfirmationDataTypeBuilder* b = dynamic_cast<const KeyInfoConfirmationDataTypeBuilder*>(
488                     XMLObjectBuilder::getBuilder(xmltooling::QName(samlconstants::SAML20_NS,KeyInfoConfirmationDataType::TYPE_NAME))
489                     );
490                 if (b)
491 #ifdef HAVE_COVARIANT_RETURNS
492                     return b->buildObject();
493 #else
494                     return dynamic_cast<KeyInfoConfirmationDataType*>(b->buildObject());
495 #endif
496                 throw xmltooling::XMLObjectException("Unable to obtain typed builder for KeyInfoConfirmationDataType.");
497             }
498         };
499
500         /**
501          * Registers builders and validators for SAML 2.0 Assertion classes into the runtime.
502          */
503         void SAML_API registerAssertionClasses();
504     };
505 };
506
507 #endif /* __saml2_assertions_h__ */