Merge master; at least partially.
authorCarl Hetherington <cth@carlh.net>
Tue, 2 Jul 2013 11:47:17 +0000 (12:47 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 2 Jul 2013 11:47:17 +0000 (12:47 +0100)
1  2 
src/cpl.cc
src/subtitle_asset.cc
test/wscript
wscript

diff --cc src/cpl.cc
index 1ca64f888e1b730d51b2fa10af7e8c1706554fff,685454df4cb140f51bb9a75866652e68544d771e..c59fc853d918976ca9b1dd8b3e05df9655c07a4a
@@@ -27,7 -27,8 +27,9 @@@
  #include "parse/asset_map.h"
  #include "reel.h"
  #include "metadata.h"
 +#include "encryption.h"
+ #include "exceptions.h"
+ #include "compose.hpp"
  
  using std::string;
  using std::stringstream;
@@@ -175,7 -176,7 +177,7 @@@ CPL::add_reel (shared_ptr<const Reel> r
  }
  
  void
- CPL::write_xml (shared_ptr<Encryption> crypt, XMLMetadata const & metadata) const
 -CPL::write_xml (XMLMetadata const & metadata) const
++CPL::write_xml (XMLMetadata const & metadata, shared_ptr<Encryption> crypt) const
  {
        boost::filesystem::path p;
        p /= _directory;
@@@ -306,155 -300,3 +310,155 @@@ CPL::equals (CPL const & other, Equalit
  
        return true;
  }
-               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);
 +
 +shared_ptr<xmlpp::Document>
 +CPL::make_kdm (
 +      CertificateChain const & certificates,
 +      string const & signer_key,
 +      shared_ptr<const Certificate> recipient_cert,
 +      boost::posix_time::ptime from,
 +      boost::posix_time::ptime until
 +      ) const
 +{
 +      assert (recipient_cert);
 +      
 +      shared_ptr<xmlpp::Document> 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 (MXFMetadata::instance()->product_name);
++              authenticated_public->add_child("IssueDate")->add_child_text (MXFMetadata::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<shared_ptr<const Asset> > a = assets();
 +                                      for (list<shared_ptr<const Asset> >::iterator i = a.begin(); i != a.end(); ++i) {
 +                                              /* XXX: non-MXF assets? */
 +                                              shared_ptr<const MXFAsset> mxf = boost::dynamic_pointer_cast<const MXFAsset> (*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");
 +              }
 +      }
 +      
 +      /* 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");
 +                      }
 +              }
 +              
 +              add_signature_value (signature, certificates, signer_key, "ds");
 +      }
 +
 +      return doc;
 +}
index 80cc1ea66f0f22dc02ea0fa0d1680606f4ffb77f,2a244a27cff6b75067b78e8362c5d32480ee7924..7f4d47d0d4cb7980e59e9751663388acf2bafa64
@@@ -20,8 -20,8 +20,9 @@@
  #include <fstream>
  #include <boost/lexical_cast.hpp>
  #include <boost/algorithm/string.hpp>
 +#include <libxml++/nodes/element.h>
  #include "subtitle_asset.h"
+ #include "parse/subtitle.h"
  #include "util.h"
  #include "xml.h"
  
diff --cc test/wscript
index d22875e91ad8852d4e500b08a9e520d82d148f0c,4a2f60a589edba9082a1f05cf9a590144c8fefcf..2892bf9ebd2d2915bfc5755e18053efbc1cfb8a1
@@@ -18,7 -18,7 +18,7 @@@ def configure(conf)
  def build(bld):
      obj = bld(features = 'cxx cxxprogram')
      obj.name   = 'tests'
-     obj.uselib = 'BOOST_TEST OPENJPEG XMLSEC1'
 -    obj.uselib = 'BOOST_TEST OPENJPEG CXML'
++    obj.uselib = 'BOOST_TEST OPENJPEG CXML XMLSEC1'
      obj.use    = 'libdcp'
      obj.source = 'tests.cc'
      obj.target = 'tests'
diff --cc wscript
Simple merge