Replace custom code with CredentialResolver.
[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         Locker locker(m_resolver);\r
70         sig->setSigningKey(m_resolver->getKey());\r
71 \r
72         // Build KeyInfo.\r
73         KeyInfo* keyInfo=KeyInfoBuilder::buildKeyInfo();\r
74         X509Data* x509Data=X509DataBuilder::buildX509Data();\r
75         keyInfo->getX509Datas().push_back(x509Data);\r
76         for_each(m_resolver->getCertificates().begin(),m_resolver->getCertificates().end(),bind1st(_addcert(),x509Data));\r
77         sig->setKeyInfo(keyInfo);\r
78 \r
79         // Sign while marshalling.\r
80         vector<Signature*> sigs(1,sig);\r
81         DOMElement* rootElement = NULL;\r
82         try {\r
83             rootElement=assertion->marshall((DOMDocument*)NULL,&sigs);\r
84         }\r
85         catch (XMLToolingException& e) {\r
86             TS_TRACE(e.what());\r
87             throw;\r
88         }\r
89         \r
90         string buf;\r
91         XMLHelper::serialize(rootElement, buf);\r
92         istringstream in(buf);\r
93         DOMDocument* doc=XMLToolingConfig::getConfig().getParser().parse(in);\r
94         const XMLObjectBuilder* b = XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
95         \r
96         assertEquals(expectedChildElementsDOM, b->buildFromDocument(doc));\r
97         \r
98         try {\r
99             SignatureProfileValidator spv;\r
100             SignatureValidator sv(new KeyResolver(m_resolver->getKey()));\r
101             spv.validate(assertion->getSignature());\r
102             sv.validate(assertion->getSignature());\r
103         }\r
104         catch (XMLToolingException& e) {\r
105             TS_TRACE(e.what());\r
106             throw;\r
107         }\r
108     }\r
109 \r
110 };\r