X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fdcp.cc;h=30a3c3a430150cbc32e3ac7ff7a28af0e2921ccf;hb=5384418af0299194ecf3e27fd2e443e7d882a713;hp=45ff69d1300aa49ca63a7f1dc8d6c8c0e43bf3c1;hpb=ca49c78799e5e48afe2ea321ba0edf17c1a39550;p=libdcp.git diff --git a/src/dcp.cc b/src/dcp.cc index 45ff69d1..30a3c3a4 100644 --- a/src/dcp.cc +++ b/src/dcp.cc @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include #include #include @@ -39,10 +41,12 @@ #include "util.h" #include "metadata.h" #include "exceptions.h" -#include "cpl_file.h" -#include "pkl_file.h" -#include "asset_map.h" +#include "parse/pkl.h" +#include "parse/asset_map.h" #include "reel.h" +#include "cpl.h" +#include "encryption.h" +#include "kdm.h" using std::string; using std::list; @@ -50,31 +54,31 @@ using std::stringstream; using std::ofstream; using std::ostream; using boost::shared_ptr; +using boost::lexical_cast; using namespace libdcp; DCP::DCP (string directory) : _directory (directory) - , _encrypted (false) { boost::filesystem::create_directories (directory); } void -DCP::write_xml () const +DCP::write_xml (bool interop, XMLMetadata const & metadata, shared_ptr crypt) const { - for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { - (*i)->write_xml (_encrypted, _certificates, _signer_key); + for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { + (*i)->write_xml (interop, metadata, crypt); } string pkl_uuid = make_uuid (); - string pkl_path = write_pkl (pkl_uuid); + string pkl_path = write_pkl (pkl_uuid, interop, metadata, crypt); write_volindex (); - write_assetmap (pkl_uuid, boost::filesystem::file_size (pkl_path)); + write_assetmap (pkl_uuid, boost::filesystem::file_size (pkl_path), interop, metadata); } std::string -DCP::write_pkl (string pkl_uuid) const +DCP::write_pkl (string pkl_uuid, bool interop, XMLMetadata const & metadata, shared_ptr crypt) const { assert (!_cpls.empty ()); @@ -85,36 +89,39 @@ DCP::write_pkl (string pkl_uuid) const p /= s.str(); xmlpp::Document doc; - xmlpp::Element* pkl = doc.create_root_node("PackingList", "http://www.smpte-ra.org/schemas/429-8/2007/PKL"); - if (_encrypted) { + xmlpp::Element* pkl; + if (interop) { + pkl = doc.create_root_node("PackingList", "http://www.digicine.com/PROTO-ASDCP-PKL-20040311#"); + } else { + pkl = doc.create_root_node("PackingList", "http://www.smpte-ra.org/schemas/429-8/2007/PKL"); + } + + if (crypt) { pkl->set_namespace_declaration ("http://www.w3.org/2000/09/xmldsig#", "dsig"); } pkl->add_child("Id")->add_child_text ("urn:uuid:" + pkl_uuid); /* XXX: this is a bit of a hack */ pkl->add_child("AnnotationText")->add_child_text(_cpls.front()->name()); - pkl->add_child("IssueDate")->add_child_text (Metadata::instance()->issue_date); - pkl->add_child("Issuer")->add_child_text (Metadata::instance()->issuer); - pkl->add_child("Creator")->add_child_text (Metadata::instance()->creator); - - { - xmlpp::Element* asset_list = pkl->add_child("AssetList"); - list > a = assets (); - for (list >::const_iterator i = a.begin(); i != a.end(); ++i) { - (*i)->write_to_pkl (asset_list); - } + pkl->add_child("IssueDate")->add_child_text (metadata.issue_date); + pkl->add_child("Issuer")->add_child_text (metadata.issuer); + pkl->add_child("Creator")->add_child_text (metadata.creator); - for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { - (*i)->write_to_pkl (asset_list); - } + xmlpp::Element* asset_list = pkl->add_child("AssetList"); + list > a = assets (); + for (list >::const_iterator i = a.begin(); i != a.end(); ++i) { + (*i)->write_to_pkl (asset_list); + } + + for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { + (*i)->write_to_pkl (asset_list); } - if (_encrypted) { - sign (pkl, _certificates, _signer_key); + if (crypt) { + sign (pkl, crypt->certificates, crypt->signer_key, interop); } - doc.write_to_file_formatted (p.string(), "UTF-8"); - + doc.write_to_file_formatted (p.string (), "UTF-8"); return p.string (); } @@ -124,55 +131,55 @@ DCP::write_volindex () const boost::filesystem::path p; p /= _directory; p /= "VOLINDEX.xml"; - ofstream vi (p.string().c_str()); - vi << "\n" - << "\n" - << " 1\n" - << "\n"; + xmlpp::Document doc; + xmlpp::Element* root = doc.create_root_node ("VolumeIndex", "http://www.smpte-ra.org/schemas/429-9/2007/AM"); + root->add_child("Index")->add_child_text ("1"); + doc.write_to_file_formatted (p.string (), "UTF-8"); } void -DCP::write_assetmap (string pkl_uuid, int pkl_length) const +DCP::write_assetmap (string pkl_uuid, int pkl_length, bool interop, XMLMetadata const & metadata) const { boost::filesystem::path p; p /= _directory; p /= "ASSETMAP.xml"; - ofstream am (p.string().c_str()); - - am << "\n" - << "\n" - << " urn:uuid:" << make_uuid() << "\n" - << " " << Metadata::instance()->creator << "\n" - << " 1\n" - << " " << Metadata::instance()->issue_date << "\n" - << " " << Metadata::instance()->issuer << "\n" - << " \n"; - - am << " \n" - << " urn:uuid:" << pkl_uuid << "\n" - << " true\n" - << " \n" - << " \n" - << " " << pkl_uuid << "_pkl.xml\n" - << " 1\n" - << " 0\n" - << " " << pkl_length << "\n" - << " \n" - << " \n" - << " \n"; + + xmlpp::Document doc; + xmlpp::Element* root; + if (interop) { + root = doc.create_root_node ("AssetMap", "http://www.digicine.com/PROTO-ASDCP-AM-20040311#"); + } else { + root = doc.create_root_node ("AssetMap", "http://www.smpte-ra.org/schemas/429-9/2007/AM"); + } + + root->add_child("Id")->add_child_text ("urn:uuid:" + make_uuid()); + root->add_child("Creator")->add_child_text (metadata.creator); + root->add_child("VolumeCount")->add_child_text ("1"); + root->add_child("IssueDate")->add_child_text (metadata.issue_date); + root->add_child("Issuer")->add_child_text (metadata.issuer); + xmlpp::Node* asset_list = root->add_child ("AssetList"); + + xmlpp::Node* asset = asset_list->add_child ("Asset"); + asset->add_child("Id")->add_child_text ("urn:uuid:" + pkl_uuid); + asset->add_child("PackingList")->add_child_text ("true"); + xmlpp::Node* chunk_list = asset->add_child ("ChunkList"); + xmlpp::Node* chunk = chunk_list->add_child ("Chunk"); + chunk->add_child("Path")->add_child_text (pkl_uuid + "_pkl.xml"); + chunk->add_child("VolumeIndex")->add_child_text ("1"); + chunk->add_child("Offset")->add_child_text ("0"); + chunk->add_child("Length")->add_child_text (lexical_cast (pkl_length)); - for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { - (*i)->write_to_assetmap (am); + for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { + (*i)->write_to_assetmap (asset_list); } list > a = assets (); for (list >::const_iterator i = a.begin(); i != a.end(); ++i) { - (*i)->write_to_assetmap (am); + (*i)->write_to_assetmap (asset_list); } - am << " \n" - << "\n"; + doc.write_to_file_formatted (p.string (), "UTF-8"); } @@ -181,35 +188,35 @@ DCP::read (bool require_mxfs) { Files files; - shared_ptr asset_map; + shared_ptr asset_map; try { boost::filesystem::path p = _directory; p /= "ASSETMAP"; if (boost::filesystem::exists (p)) { - asset_map.reset (new AssetMap (p.string ())); + asset_map.reset (new libdcp::parse::AssetMap (p.string ())); } else { p = _directory; p /= "ASSETMAP.xml"; if (boost::filesystem::exists (p)) { - asset_map.reset (new AssetMap (p.string ())); + asset_map.reset (new libdcp::parse::AssetMap (p.string ())); } else { - throw DCPReadError ("could not find AssetMap file"); + boost::throw_exception (DCPReadError ("could not find AssetMap file")); } } } catch (FileError& e) { - throw FileError ("could not load AssetMap file", files.asset_map); + boost::throw_exception (FileError ("could not load AssetMap file", files.asset_map)); } - for (list >::const_iterator i = asset_map->assets.begin(); i != asset_map->assets.end(); ++i) { + for (list >::const_iterator i = asset_map->assets.begin(); i != asset_map->assets.end(); ++i) { if ((*i)->chunks.size() != 1) { - throw XMLError ("unsupported asset chunk count"); + boost::throw_exception (XMLError ("unsupported asset chunk count")); } boost::filesystem::path t = _directory; t /= (*i)->chunks.front()->path; - if (ends_with (t.string(), ".mxf") || ends_with (t.string(), ".ttf")) { + if (boost::algorithm::ends_with (t.string(), ".mxf") || boost::algorithm::ends_with (t.string(), ".ttf")) { continue; } @@ -230,24 +237,24 @@ DCP::read (bool require_mxfs) if (files.pkl.empty ()) { files.pkl = t.string(); } else { - throw DCPReadError ("duplicate PKLs found"); + boost::throw_exception (DCPReadError ("duplicate PKLs found")); } } } if (files.cpls.empty ()) { - throw FileError ("no CPL files found", ""); + boost::throw_exception (FileError ("no CPL files found", "")); } if (files.pkl.empty ()) { - throw FileError ("no PKL file found", ""); + boost::throw_exception (FileError ("no PKL file found", "")); } - shared_ptr pkl; + shared_ptr pkl; try { - pkl.reset (new PKLFile (files.pkl)); + pkl.reset (new parse::PKL (files.pkl)); } catch (FileError& e) { - throw FileError ("could not load PKL file", files.pkl); + boost::throw_exception (FileError ("could not load PKL file", files.pkl)); } /* Cross-check */ @@ -259,18 +266,18 @@ DCP::read (bool require_mxfs) } bool -DCP::equals (DCP const & other, EqualityOptions opt, list& notes) const +DCP::equals (DCP const & other, EqualityOptions opt, boost::function note) const { if (_cpls.size() != other._cpls.size()) { - notes.push_back ("CPL counts differ"); + note (ERROR, "CPL counts differ"); return false; } - list >::const_iterator a = _cpls.begin (); - list >::const_iterator b = other._cpls.begin (); + list >::const_iterator a = _cpls.begin (); + list >::const_iterator b = other._cpls.begin (); while (a != _cpls.end ()) { - if (!(*a)->equals (*b->get(), opt, notes)) { + if (!(*a)->equals (*b->get(), opt, note)) { return false; } ++a; @@ -280,7 +287,6 @@ DCP::equals (DCP const & other, EqualityOptions opt, list& notes) const return true; } - void DCP::add_cpl (shared_ptr cpl) { @@ -299,7 +305,7 @@ list > DCP::assets () const { list > a; - for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { + for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { list > t = (*i)->assets (); a.merge (t); } @@ -309,406 +315,28 @@ DCP::assets () const return a; } -CPL::CPL (string directory, string name, ContentKind content_kind, int length, int frames_per_second) - : _directory (directory) - , _name (name) - , _content_kind (content_kind) - , _length (length) - , _fps (frames_per_second) -{ - _uuid = make_uuid (); -} - -CPL::CPL (string directory, string file, shared_ptr asset_map, bool require_mxfs) - : _directory (directory) - , _content_kind (FEATURE) - , _length (0) - , _fps (0) -{ - /* Read the XML */ - shared_ptr cpl; - try { - cpl.reset (new CPLFile (file)); - } catch (FileError& e) { - throw FileError ("could not load CPL file", file); - } - - /* Now cherry-pick the required bits into our own data structure */ - - _name = cpl->annotation_text; - _content_kind = cpl->content_kind; - - for (list >::iterator i = cpl->reels.begin(); i != cpl->reels.end(); ++i) { - - shared_ptr p; - - if ((*i)->asset_list->main_picture) { - p = (*i)->asset_list->main_picture; - } else { - p = (*i)->asset_list->main_stereoscopic_picture; - } - - _fps = p->edit_rate.numerator; - _length += p->duration; - - shared_ptr picture; - shared_ptr sound; - shared_ptr subtitle; - - /* Some rather twisted logic to decide if we are 3D or not; - some DCPs give a MainStereoscopicPicture to indicate 3D, others - just have a FrameRate twice the EditRate and apparently - expect you to divine the fact that they are hence 3D. - */ - - if (!(*i)->asset_list->main_stereoscopic_picture && p->edit_rate == p->frame_rate) { - - try { - picture.reset (new MonoPictureAsset ( - _directory, - asset_map->asset_from_id (p->id)->chunks.front()->path, - _fps, - (*i)->asset_list->main_picture->entry_point, - (*i)->asset_list->main_picture->duration - ) - ); - } catch (MXFFileError) { - if (require_mxfs) { - throw; - } - } - - } else { - - try { - picture.reset (new StereoPictureAsset ( - _directory, - asset_map->asset_from_id (p->id)->chunks.front()->path, - _fps, - p->entry_point, - p->duration - ) - ); - } catch (MXFFileError) { - if (require_mxfs) { - throw; - } - } - - } - - if ((*i)->asset_list->main_sound) { - - try { - sound.reset (new SoundAsset ( - _directory, - asset_map->asset_from_id ((*i)->asset_list->main_sound->id)->chunks.front()->path, - _fps, - (*i)->asset_list->main_sound->entry_point, - (*i)->asset_list->main_sound->duration - ) - ); - } catch (MXFFileError) { - if (require_mxfs) { - throw; - } - } - } - - if ((*i)->asset_list->main_subtitle) { - - subtitle.reset (new SubtitleAsset ( - _directory, - asset_map->asset_from_id ((*i)->asset_list->main_subtitle->id)->chunks.front()->path - ) - ); - } - - _reels.push_back (shared_ptr (new Reel (picture, sound, subtitle))); - } -} - -void -CPL::add_reel (shared_ptr reel) -{ - _reels.push_back (reel); -} - -void -CPL::write_xml (bool encrypted, CertificateChain const & certificates, string const & signer_key) const -{ - boost::filesystem::path p; - p /= _directory; - stringstream s; - s << _uuid << "_cpl.xml"; - p /= s.str(); - - xmlpp::Document doc; - xmlpp::Element* cpl = doc.create_root_node("CompositionPlaylist", "http://www.smpte-ra.org/schemas/429-7/2006/CPL"); - - if (encrypted) { - cpl->set_namespace_declaration ("http://www.w3.org/2000/09/xmldsig#", "dsig"); - } - - cpl->add_child("Id")->add_child_text ("urn:uuid:" + _uuid); - cpl->add_child("AnnotationText")->add_child_text (_name); - cpl->add_child("IssueDate")->add_child_text (Metadata::instance()->issue_date); - cpl->add_child("Creator")->add_child_text (Metadata::instance()->creator); - cpl->add_child("ContentTitleText")->add_child_text (_name); - cpl->add_child("ContentKind")->add_child_text (content_kind_to_string (_content_kind)); - - { - xmlpp::Element* cv = cpl->add_child ("ContentVersion"); - cv->add_child("Id")->add_child_text ("urn:uri:" + _uuid + "_" + Metadata::instance()->issue_date); - cv->add_child("LabelText")->add_child_text (_uuid + "_" + Metadata::instance()->issue_date); - } - - cpl->add_child("RatingList"); - - xmlpp::Element* reel_list = cpl->add_child("ReelList"); - for (list >::const_iterator i = _reels.begin(); i != _reels.end(); ++i) { - (*i)->write_to_cpl (reel_list); - } - - if (encrypted) { - sign (cpl, certificates, signer_key); - } - - doc.write_to_file_formatted (p.string(), "UTF-8"); - - _digest = make_digest (p.string (), 0); - _length = boost::filesystem::file_size (p.string ()); -} - -void -CPL::write_to_pkl (xmlpp::Element* p) const -{ - xmlpp::Element* asset = p->add_child("Asset"); - asset->add_child("Id")->add_child_text("urn:uuid:" + _uuid); - asset->add_child("Hash")->add_child_text(_digest); - asset->add_child("Size")->add_child_text(boost::lexical_cast (_length)); - asset->add_child("Type")->add_child_text("text/xml"); -} - -list > -CPL::assets () const -{ - list > a; - for (list >::const_iterator i = _reels.begin(); i != _reels.end(); ++i) { - if ((*i)->main_picture ()) { - a.push_back ((*i)->main_picture ()); - } - if ((*i)->main_sound ()) { - a.push_back ((*i)->main_sound ()); - } - if ((*i)->main_subtitle ()) { - a.push_back ((*i)->main_subtitle ()); - } - } - - return a; -} - -void -CPL::write_to_assetmap (ostream& s) const -{ - s << " \n" - << " urn:uuid:" << _uuid << "\n" - << " \n" - << " \n" - << " " << _uuid << "_cpl.xml\n" - << " 1\n" - << " 0\n" - << " " << _length << "\n" - << " \n" - << " \n" - << " \n"; -} - - - bool -CPL::equals (CPL const & other, EqualityOptions opt, list& notes) const +DCP::encrypted () const { - if (_name != other._name) { - notes.push_back ("names differ"); - return false; - } - - if (_content_kind != other._content_kind) { - notes.push_back ("content kinds differ"); - return false; - } - - if (_fps != other._fps) { - notes.push_back ("frames per second differ"); - return false; - } - - if (_length != other._length) { - notes.push_back ("lengths differ"); - return false; - } - - if (_reels.size() != other._reels.size()) { - notes.push_back ("reel counts differ"); - return false; - } - - list >::const_iterator a = _reels.begin (); - list >::const_iterator b = other._reels.begin (); - - while (a != _reels.end ()) { - if (!(*a)->equals (*b, opt, notes)) { - return false; + for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { + if ((*i)->encrypted ()) { + return true; } - ++a; - ++b; } - return true; + return false; } -shared_ptr -CPL::make_kdm (CertificateChain const & certificates, string const & signer_key, shared_ptr recipient_cert) const +void +DCP::add_kdm (KDM const & kdm) { - shared_ptr doc (new xmlpp::Document); - xmlpp::Element* root = doc->create_root_node ("DCinemaSecurityMessage"); - root->set_namespace_declaration ("http://www.smpte-ra.org/schemas/430-3/2006/ETM", ""); - root->set_namespace_declaration ("http://www.w3.org/2000/09/xmldsig#", "ds"); - root->set_namespace_declaration ("http://www.w3.org/2001/04/xmlenc#", "enc"); - - { - xmlpp::Element* authenticated_public = root->add_child("AuthenticatedPublic"); - authenticated_public->set_attribute("Id", "ID_AuthenticatedPublic"); - xmlAddID (0, doc->cobj(), (const xmlChar *) "ID_AuthenticatedPublic", authenticated_public->get_attribute("Id")->cobj()); - - authenticated_public->add_child("MessageId")->add_child_text("urn:uuid:" + make_uuid()); - authenticated_public->add_child("MessageType")->add_child_text("http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type"); - authenticated_public->add_child("AnnotationText")->add_child_text(Metadata::instance()->product_name); - authenticated_public->add_child("IssueDate")->add_child_text(Metadata::instance()->issue_date); - - { - xmlpp::Element* signer = authenticated_public->add_child("Signer"); - signer->add_child("X509IssuerName", "ds")->add_child_text ( - Certificate::name_for_xml (recipient_cert->issuer()) - ); - signer->add_child("X509SerialNumber", "ds")->add_child_text ( - recipient_cert->serial() - ); - } - - { - xmlpp::Element* required_extensions = authenticated_public->add_child("RequiredExtensions"); - - { - xmlpp::Element* kdm_required_extensions = required_extensions->add_child("KDMRequiredExtensions"); - kdm_required_extensions->set_namespace_declaration ("http://www.smpte-ra.org/schemas/430-1/2006/KDM"); - { - xmlpp::Element* recipient = kdm_required_extensions->add_child("Recipient"); - { - xmlpp::Element* serial_element = recipient->add_child("X509IssuerSerial"); - serial_element->add_child("X509IssuerName", "ds")->add_child_text ( - Certificate::name_for_xml (recipient_cert->issuer()) - ); - serial_element->add_child("X509SerialNumber", "ds")->add_child_text ( - recipient_cert->serial() - ); - } - - recipient->add_child("X509SubjectName")->add_child_text (Certificate::name_for_xml (recipient_cert->subject())); - } - - kdm_required_extensions->add_child("CompositionPlaylistId")->add_child_text("urn:uuid:" + _uuid); - kdm_required_extensions->add_child("ContentTitleText")->add_child_text(_name); - kdm_required_extensions->add_child("ContentAuthenticator")->add_child_text(certificates.leaf()->thumbprint()); - kdm_required_extensions->add_child("ContentKeysNotValidBefore")->add_child_text("XXX"); - kdm_required_extensions->add_child("ContentKeysNotValidAfter")->add_child_text("XXX"); - - { - xmlpp::Element* authorized_device_info = kdm_required_extensions->add_child("AuthorizedDeviceInfo"); - authorized_device_info->add_child("DeviceListIdentifier")->add_child_text("urn:uuid:" + make_uuid()); - authorized_device_info->add_child("DeviceListDescription")->add_child_text(recipient_cert->subject()); - { - xmlpp::Element* device_list = authorized_device_info->add_child("DeviceList"); - device_list->add_child("CertificateThumbprint")->add_child_text(recipient_cert->thumbprint()); - } - } - - { - xmlpp::Element* key_id_list = kdm_required_extensions->add_child("KeyIdList"); - list > a = assets(); - for (list >::iterator i = a.begin(); i != a.end(); ++i) { - /* XXX: non-MXF assets? */ - shared_ptr mxf = boost::dynamic_pointer_cast (*i); - if (mxf) { - mxf->add_typed_key_id (key_id_list); - } - } - } - - { - xmlpp::Element* forensic_mark_flag_list = kdm_required_extensions->add_child("ForensicMarkFlagList"); - forensic_mark_flag_list->add_child("ForensicMarkFlag")->add_child_text ( - "http://www.smpte-ra.org/430-1/2006/KDM#mrkflg-picture-disable" - ); - forensic_mark_flag_list->add_child("ForensicMarkFlag")->add_child_text ( - "http://www.smpte-ra.org/430-1/2006/KDM#mrkflg-audio-disable" - ); - } - } - } - - authenticated_public->add_child("NonCriticalExtensions"); - } - - { - xmlpp::Element* authenticated_private = root->add_child("AuthenticatedPrivate"); - authenticated_private->set_attribute ("Id", "ID_AuthenticatedPrivate"); - xmlAddID (0, doc->cobj(), (const xmlChar *) "ID_AuthenticatedPrivate", authenticated_private->get_attribute("Id")->cobj()); - { - xmlpp::Element* encrypted_key = authenticated_private->add_child ("EncryptedKey", "enc"); - { - xmlpp::Element* encryption_method = encrypted_key->add_child ("EncryptionMethod", "enc"); - encryption_method->set_attribute ("Algorithm", "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"); - encryption_method->add_child("DigestMethod", "ds")->set_attribute("Algorithm", "http://www.w3.org/2000/09/xmldsig#sha1"); - } - - xmlpp::Element* cipher_data = authenticated_private->add_child ("CipherData", "enc"); - cipher_data->add_child("CipherValue", "enc")->add_child_text("XXX"); - } - } + list ciphers = kdm.ciphers (); - /* XXX: x2 one for each mxf? */ - - { - xmlpp::Element* signature = root->add_child("Signature", "ds"); - - { - xmlpp::Element* signed_info = signature->add_child("SignedInfo", "ds"); - signed_info->add_child("CanonicalizationMethod", "ds")->set_attribute( - "Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments" - ); - signed_info->add_child("SignatureMethod", "ds")->set_attribute( - "Algorithm", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" - ); - { - xmlpp::Element* reference = signed_info->add_child("Reference", "ds"); - reference->set_attribute("URI", "#ID_AuthenticatedPublic"); - reference->add_child("DigestMethod", "ds")->set_attribute("Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256"); - reference->add_child("DigestValue", "ds"); - } - - { - xmlpp::Element* reference = signed_info->add_child("Reference", "ds"); - reference->set_attribute("URI", "#ID_AuthenticatedPrivate"); - reference->add_child("DigestMethod", "ds")->set_attribute("Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256"); - reference->add_child("DigestValue", "ds"); - } + for (list >::iterator i = _cpls.begin(); i != _cpls.end(); ++i) { + for (list::iterator j = ciphers.begin(); j != ciphers.end(); ++j) { + if (j->cpl_id() == (*i)->id()) { + (*i)->add_kdm (kdm); + } } - - add_signature_value (signature, certificates, signer_key, "ds"); } - - return doc; }