0245bcefbfa52fb5099d71e2643a19a817a1ad76
[shibboleth/cpp-opensaml.git] / samltest / signature / SAML2AssertionTest.h
1 /*\r
2  *  Copyright 2001-2005 Internet2\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 #include "signature/SAMLSignatureTestBase.h"\r
18 #include <saml/saml2/core/Assertions.h>\r
19 \r
20 #include <fstream>\r
21 \r
22 using namespace opensaml::saml2;\r
23 \r
24 class SAML2AssertionTest : public CxxTest::TestSuite, public SAMLSignatureTestBase {\r
25 public:\r
26     void setUp() {\r
27         childElementsFile  = data_path + "signature/SAML2Assertion.xml";\r
28         SAMLSignatureTestBase::setUp();\r
29     }\r
30 \r
31     void tearDown() {\r
32         SAMLSignatureTestBase::tearDown();\r
33     }\r
34 \r
35     void testSignature() {\r
36         auto_ptr_XMLCh issuer("issuer");\r
37         auto_ptr_XMLCh issueInstant("1970-01-02T01:01:02.100Z");\r
38         auto_ptr_XMLCh id("ident");\r
39         auto_ptr_XMLCh method("method");\r
40         auto_ptr_XMLCh nameid("John Doe");\r
41         \r
42         Issuer* is=IssuerBuilder::buildIssuer();\r
43         is->setName(issuer.get());\r
44 \r
45         NameID* n=NameIDBuilder::buildNameID();\r
46         n->setName(nameid.get());        \r
47         Subject* subject=SubjectBuilder::buildSubject();\r
48         subject->setNameID(n);\r
49 \r
50         AuthnStatement* statement=AuthnStatementBuilder::buildAuthnStatement();\r
51         statement->setAuthnInstant(issueInstant.get());\r
52 \r
53         AuthnContext* ac=AuthnContextBuilder::buildAuthnContext();\r
54         AuthnContextClassRef* acc=AuthnContextClassRefBuilder::buildAuthnContextClassRef();\r
55         acc->setReference(method.get());\r
56         ac->setAuthnContextClassRef(acc);\r
57         statement->setAuthnContext(ac);\r
58         \r
59         auto_ptr<Assertion> assertion(AssertionBuilder::buildAssertion());\r
60         assertion->setID(id.get());\r
61         assertion->setIssueInstant(issueInstant.get());\r
62         assertion->setIssuer(is);\r
63         assertion->setSubject(subject);\r
64         assertion->getAuthnStatements().push_back(statement);\r
65 \r
66         // Append a Signature.\r
67         Signature* sig=SignatureBuilder::buildSignature();\r
68         assertion->setSignature(sig);\r
69         sig->setSigningKey(m_key->clone());\r
70 \r
71         // Build KeyInfo.\r
72         KeyInfo* keyInfo=KeyInfoBuilder::buildKeyInfo();\r
73         X509Data* x509Data=X509DataBuilder::buildX509Data();\r
74         keyInfo->getX509Datas().push_back(x509Data);\r
75         for_each(m_certs.begin(),m_certs.end(),bind1st(_addcert(),x509Data));\r
76         sig->setKeyInfo(keyInfo);\r
77 \r
78         // Sign while marshalling.\r
79         vector<Signature*> sigs(1,sig);\r
80         DOMElement* rootElement = NULL;\r
81         try {\r
82             rootElement=assertion->marshall((DOMDocument*)NULL,&sigs);\r
83         }\r
84         catch (XMLToolingException& e) {\r
85             TS_TRACE(e.what());\r
86             throw;\r
87         }\r
88         \r
89         string buf;\r
90         XMLHelper::serialize(rootElement, buf);\r
91         istringstream in(buf);\r
92         DOMDocument* doc=XMLToolingConfig::getConfig().getParser().parse(in);\r
93         const XMLObjectBuilder* b = XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
94         \r
95         assertEquals(expectedChildElementsDOM, b->buildFromDocument(doc));\r
96         \r
97         try {\r
98             SignatureProfileValidator spv;\r
99             SignatureValidator sv(new KeyResolver(m_key->clone()));\r
100             spv.validate(assertion->getSignature());\r
101             sv.validate(assertion->getSignature());\r
102         }\r
103         catch (XMLToolingException& e) {\r
104             TS_TRACE(e.what());\r
105             throw;\r
106         }\r
107     }\r
108 \r
109 };\r