1e6f14d015913a90d4b1514966161e1f46a07793
[shibboleth/cpp-opensaml.git] / samltest / signature / SAML1AssertionTest.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/saml1/core/Assertions.h>\r
19 \r
20 #include <fstream>\r
21 \r
22 using namespace opensaml::saml1;\r
23 \r
24 class SAML1AssertionTest : public CxxTest::TestSuite, public SAMLSignatureTestBase {\r
25 public:\r
26     void setUp() {\r
27         childElementsFile  = data_path + "signature/SAML1Assertion.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         NameIdentifier* n=NameIdentifierBuilder::buildNameIdentifier();\r
43         n->setName(nameid.get());        \r
44         Subject* subject=SubjectBuilder::buildSubject();\r
45         subject->setNameIdentifier(n);\r
46 \r
47         AuthenticationStatement* statement=AuthenticationStatementBuilder::buildAuthenticationStatement();\r
48         statement->setAuthenticationInstant(issueInstant.get());\r
49         statement->setAuthenticationMethod(method.get());\r
50         statement->setSubject(subject);\r
51         \r
52         auto_ptr<Assertion> assertion(AssertionBuilder::buildAssertion());\r
53         assertion->setAssertionID(id.get());\r
54         assertion->setIssueInstant(issueInstant.get());\r
55         assertion->setIssuer(issuer.get());\r
56         assertion->getAuthenticationStatements().push_back(statement);\r
57 \r
58         // Append a Signature.\r
59         Signature* sig=SignatureBuilder::buildSignature();\r
60         assertion->setSignature(sig);\r
61         sig->setSigningKey(m_key->clone());\r
62 \r
63         // Build KeyInfo.\r
64         KeyInfo* keyInfo=KeyInfoBuilder::buildKeyInfo();\r
65         X509Data* x509Data=X509DataBuilder::buildX509Data();\r
66         keyInfo->getX509Datas().push_back(x509Data);\r
67         for_each(m_certs.begin(),m_certs.end(),bind1st(_addcert(),x509Data));\r
68         sig->setKeyInfo(keyInfo);\r
69 \r
70         // Sign while marshalling.\r
71         vector<Signature*> sigs(1,sig);\r
72         DOMElement* rootElement = NULL;\r
73         try {\r
74             rootElement=assertion->marshall((DOMDocument*)NULL,&sigs);\r
75         }\r
76         catch (XMLToolingException& e) {\r
77             TS_TRACE(e.what());\r
78             throw;\r
79         }\r
80         \r
81         string buf;\r
82         XMLHelper::serialize(rootElement, buf);\r
83         istringstream in(buf);\r
84         DOMDocument* doc=XMLToolingConfig::getConfig().getParser().parse(in);\r
85         const XMLObjectBuilder* b = XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
86         \r
87         assertEquals(expectedChildElementsDOM, b->buildFromDocument(doc));\r
88         \r
89         try {\r
90             SignatureProfileValidator spv;\r
91             SignatureValidator sv(new KeyResolver(m_key->clone()));\r
92             spv.validate(assertion->getSignature());\r
93             sv.validate(assertion->getSignature());\r
94         }\r
95         catch (XMLToolingException& e) {\r
96             TS_TRACE(e.what());\r
97             throw;\r
98         }\r
99     }\r
100 \r
101 };\r