Convert from NULL macro to nullptr, remove unused zlib code.
[shibboleth/cpp-opensaml.git] / saml / signature / ContentReference.cpp
1 /*
2  *  Copyright 2001-2010 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  * ContentReference.cpp
19  * 
20  * SAML-specific signature reference profile.
21  */
22  
23 #include "internal.h"
24 #include "signature/ContentReference.h"
25 #include "signature/SignableObject.h"
26
27 #include <xmltooling/signature/Signature.h>
28 #include <xercesc/util/XMLUniDefs.hpp>
29 #include <xsec/dsig/DSIGReference.hpp>
30 #include <xsec/dsig/DSIGSignature.hpp>
31 #include <xsec/dsig/DSIGTransformC14n.hpp>
32
33 using namespace opensaml;
34 using namespace xmltooling;
35 using namespace std;
36
37 ContentReference::ContentReference(const SignableObject& signableObject)
38     : m_signableObject(signableObject), m_digest(nullptr), m_c14n(nullptr)
39 {
40 }
41
42 ContentReference::~ContentReference()
43 {
44 }
45
46 void ContentReference::createReferences(DSIGSignature* sig)
47 {
48     DSIGReference* ref = nullptr;
49     const XMLCh* id=m_signableObject.getXMLID();
50     if (!id || !*id)
51         ref=sig->createReference(&chNull, m_digest ? m_digest : DSIGConstants::s_unicodeStrURISHA1);  // whole doc reference
52     else {
53         XMLCh* buf=new XMLCh[XMLString::stringLen(id) + 2];
54         buf[0]=chPound;
55         buf[1]=chNull;
56         XMLString::catString(buf,id);
57         try {
58             ref=sig->createReference(buf, m_digest ? m_digest : DSIGConstants::s_unicodeStrURISHA1);
59             delete[] buf;
60         }
61         catch(...) {
62             delete[] buf;
63             throw;
64         }
65     }
66     
67     ref->appendEnvelopedSignatureTransform();
68     DSIGTransformC14n* c14n=ref->appendCanonicalizationTransform(m_c14n ? m_c14n : DSIGConstants::s_unicodeStrURIEXC_C14N_NOC);
69
70     if (!m_c14n || m_c14n == DSIGConstants::s_unicodeStrURIEXC_C14N_NOC || m_c14n == DSIGConstants::s_unicodeStrURIEXC_C14N_COM) {
71         // Compute inclusive prefix set.
72         set<xstring> prefix_set;
73         XMLHelper::getNonVisiblyUsedPrefixes(m_signableObject, prefix_set);
74         prefix_set.insert(m_prefixes.begin(), m_prefixes.end());
75
76         // Build up the string of prefixes.
77         xstring prefixes;
78         static const XMLCh _default[] = { chPound, chLatin_d, chLatin_e, chLatin_f, chLatin_a, chLatin_u, chLatin_l, chLatin_t, chNull };
79         for (set<xstring>::const_iterator p = prefix_set.begin(); p != prefix_set.end(); ++p) {
80             prefixes += (p->empty() ? _default : p->c_str());
81             prefixes += chSpace;
82         }
83         if (!prefixes.empty()) {
84             prefixes.erase(prefixes.begin() + prefixes.size() - 1);
85             c14n->setInclusiveNamespaces(XMLString::replicate(prefixes.c_str()));
86         }
87     }
88 }
89
90 void ContentReference::addInclusivePrefix(const XMLCh* prefix)
91 {
92     m_prefixes.insert(prefix ? prefix : &chNull);
93 }
94
95 void ContentReference::setDigestAlgorithm(const XMLCh* digest)
96 {
97     m_digest = digest;
98 }
99
100 void ContentReference::setCanonicalizationMethod(const XMLCh* c14n)
101 {
102     m_c14n = c14n;
103 }