shared_ptr<cxml::Node> root (new cxml::Node (doc->get_root_node ()));
xmlpp::Node* signature = root->node_child("Signature")->node();
signer->add_signature_value (signature, "ds");
- doc->write_to_file_formatted ("/home/carl/foo.xml", "UTF-8");
_xml_kdm->signature = xml::Signature (shared_ptr<cxml::Node> (new cxml::Node (signature)));
}
KDM::as_xml (boost::filesystem::path path) const
{
shared_ptr<xmlpp::Document> doc = _xml_kdm->as_xml ();
- doc->write_to_file_formatted (path.string(), "UTF-8");
+ /* This must *not* be the _formatted version, otherwise the signature
+ will be wrong.
+ */
+ doc->write_to_file (path.string(), "UTF-8");
}
string
KDM::as_xml () const
{
shared_ptr<xmlpp::Document> doc = _xml_kdm->as_xml ();
- return doc->write_to_string_formatted ("UTF-8");
+ /* This must *not* be the _formatted version, otherwise the signature
+ will be wrong.
+ */
+ return doc->write_to_string ("UTF-8");
}
KDMKey::KDMKey (
node->done ();
}
- void as_xml (Writer& writer, xmlpp::Element* node) const
+ void as_xml (xmlpp::Element* node) const
{
xmlpp::Element* reference = node->add_child ("Reference", "ds");
reference->set_attribute ("URI", uri);
reference->add_child("DigestMethod", "ds")->set_attribute ("Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256");
reference->add_child("DigestValue", "ds")->add_child_text (digest_value);
-
- if (!uri.empty ()) {
- xmlAddID (0, writer.document->cobj(), (const xmlChar *) uri.substr(1).c_str(), writer.references[uri.substr(1)]->cobj ());
- }
}
std::string uri;
node->done ();
}
- void as_xml (Writer& writer, xmlpp::Element* node) const
+ void as_xml (xmlpp::Element* node) const
{
xmlpp::Element* si = node->add_child ("SignedInfo", "ds");
si->add_child ("CanonicalizationMethod", "ds")->set_attribute ("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments");
si->add_child ("SignatureMethod", "ds")->set_attribute ("Algorithm", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
- authenticated_public.as_xml (writer, si);
- authenticated_private.as_xml (writer, si);
+ authenticated_public.as_xml (si);
+ authenticated_private.as_xml (si);
node->add_child("SignatureValue", "ds")->add_child_text (signature_value);
authenticated_public.as_xml (writer, root->add_child ("AuthenticatedPublic"));
authenticated_private.as_xml (writer, root->add_child ("AuthenticatedPrivate"));
- signature.as_xml (writer, root->add_child ("Signature", "ds"));
+ signature.as_xml (root->add_child ("Signature", "ds"));
+
+ for (std::map<std::string, xmlpp::Attribute*>::const_iterator i = writer.references.begin(); i != writer.references.end(); ++i) {
+ xmlAddID (0, writer.document->cobj(), (const xmlChar *) i->first.c_str(), i->second->cobj ());
+ }
return writer.document;
}
shared_ptr<libdcp::Signer> signer (
new libdcp::Signer (
chain,
- "test/data/signer.key"
+ "build/test/signer/leaf.key"
)
);
kdm.as_xml ("build/test/bar.kdm.xml");
system ("xmllint --path schema --nonet --noout --schema schema/SMPTE-430-1-2006-Amd-1-2009-KDM.xsd build/test/bar.kdm.xml");
+ system ("xmlsec1 verify "
+ "--pubkey-cert-pem build/test/signer/leaf.signed.pem "
+ "--trusted-pem build/test/signer/intermediate.signed.pem "
+ "--trusted-pem build/test/signer/ca.self-signed.pem "
+ "--id-attr:Id http://www.smpte-ra.org/schemas/430-3/2006/ETM:AuthenticatedPublic "
+ "--id-attr:Id http://www.smpte-ra.org/schemas/430-3/2006/ETM:AuthenticatedPrivate "
+ "build/test/bar.kdm.xml");
}