Replace custom code with CredentialResolver.
[shibboleth/cpp-opensaml.git] / samltest / signature / SAML1ResponseTest.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 \r
19 #include <saml/saml1/core/Protocols.h>\r
20 \r
21 #include <fstream>\r
22 \r
23 using namespace opensaml::saml1p;\r
24 using namespace opensaml::saml1;\r
25 \r
26 class SAML1ResponseTest : public CxxTest::TestSuite, public SAMLSignatureTestBase {\r
27 public:\r
28     void setUp() {\r
29         childElementsFile  = data_path + "signature/SAML1Response.xml";\r
30         SAMLSignatureTestBase::setUp();\r
31     }\r
32 \r
33     void tearDown() {\r
34         SAMLSignatureTestBase::tearDown();\r
35     }\r
36 \r
37     void testSignature() {\r
38         auto_ptr_XMLCh issuer("issuer");\r
39         auto_ptr_XMLCh issueInstant("1970-01-02T01:01:02.100Z");\r
40         auto_ptr_XMLCh aid("aident");\r
41         auto_ptr_XMLCh rid("rident");\r
42         auto_ptr_XMLCh method("method");\r
43         auto_ptr_XMLCh nameid("John Doe");\r
44         \r
45         NameIdentifier* n=NameIdentifierBuilder::buildNameIdentifier();\r
46         n->setName(nameid.get());        \r
47         Subject* subject=SubjectBuilder::buildSubject();\r
48         subject->setNameIdentifier(n);\r
49 \r
50         AuthenticationStatement* statement=AuthenticationStatementBuilder::buildAuthenticationStatement();\r
51         statement->setAuthenticationInstant(issueInstant.get());\r
52         statement->setAuthenticationMethod(method.get());\r
53         statement->setSubject(subject);\r
54         \r
55         Assertion* assertion=AssertionBuilder::buildAssertion();\r
56         assertion->setAssertionID(aid.get());\r
57         assertion->setIssueInstant(issueInstant.get());\r
58         assertion->setIssuer(issuer.get());\r
59         assertion->getAuthenticationStatements().push_back(statement);\r
60 \r
61         // Append a Signature.\r
62         assertion->setSignature(SignatureBuilder::buildSignature());\r
63         Locker locker(m_resolver);\r
64         assertion->getSignature()->setSigningKey(m_resolver->getKey());\r
65 \r
66         // Build KeyInfo.\r
67         KeyInfo* keyInfo=KeyInfoBuilder::buildKeyInfo();\r
68         X509Data* x509Data=X509DataBuilder::buildX509Data();\r
69         keyInfo->getX509Datas().push_back(x509Data);\r
70         for_each(m_resolver->getCertificates().begin(),m_resolver->getCertificates().end(),bind1st(_addcert(),x509Data));\r
71         assertion->getSignature()->setKeyInfo(keyInfo);\r
72 \r
73         // Sign assertion while marshalling.\r
74         vector<Signature*> sigs(1,assertion->getSignature());\r
75         DOMElement* rootElement = NULL;\r
76         try {\r
77             rootElement=assertion->marshall((DOMDocument*)NULL,&sigs);\r
78         }\r
79         catch (XMLToolingException& e) {\r
80             TS_TRACE(e.what());\r
81             delete assertion;\r
82             throw;\r
83         }\r
84 \r
85         StatusCode* sc=StatusCodeBuilder::buildStatusCode();\r
86         sc->setValue(&StatusCode::SUCCESS);\r
87         Status* status=StatusBuilder::buildStatus();\r
88         status->setStatusCode(sc);\r
89 \r
90         auto_ptr<Response> response(ResponseBuilder::buildResponse());\r
91         response->setResponseID(rid.get());\r
92         response->setIssueInstant(issueInstant.get());\r
93         response->setStatus(status);\r
94         response->getAssertions().push_back(assertion);\r
95         response->setSignature(SignatureBuilder::buildSignature());\r
96         response->getSignature()->setSigningKey(m_resolver->getKey());\r
97         response->getSignature()->setKeyInfo(keyInfo->cloneKeyInfo());\r
98 \r
99         // Sign response while marshalling.\r
100         sigs.clear();\r
101         sigs.push_back(response->getSignature());\r
102         rootElement = NULL;\r
103         try {\r
104             rootElement=response->marshall((DOMDocument*)NULL,&sigs);\r
105         }\r
106         catch (XMLToolingException& e) {\r
107             TS_TRACE(e.what());\r
108             throw;\r
109         }\r
110 \r
111         string buf;\r
112         XMLHelper::serialize(rootElement, buf);\r
113         istringstream in(buf);\r
114         DOMDocument* doc=XMLToolingConfig::getConfig().getParser().parse(in);\r
115         const XMLObjectBuilder* b = XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
116         \r
117         assertEquals(expectedChildElementsDOM, b->buildFromDocument(doc));\r
118         \r
119         try {\r
120             SignatureProfileValidator spv;\r
121             spv.validate(assertion->getSignature());\r
122             spv.validate(response->getSignature());\r
123 \r
124             SignatureValidator sv(new KeyResolver(m_resolver->getKey()));\r
125             sv.validate(assertion->getSignature());\r
126             sv.validate(response->getSignature());\r
127         }\r
128         catch (XMLToolingException& e) {\r
129             TS_TRACE(e.what());\r
130             throw;\r
131         }\r
132     }\r
133 \r
134 };\r