Initial work on 'ECinema' KDMs.
authorCarl Hetherington <cth@carlh.net>
Tue, 16 Apr 2019 12:35:54 +0000 (13:35 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 13 May 2019 10:07:46 +0000 (11:07 +0100)
src/lib/decrypted_ecinema_kdm.cc [new file with mode: 0644]
src/lib/decrypted_ecinema_kdm.h [new file with mode: 0644]
src/lib/encrypted_ecinema_kdm.cc [new file with mode: 0644]
src/lib/encrypted_ecinema_kdm.h [new file with mode: 0644]
src/lib/wscript
src/tools/dcpomatic_ecinema.cc
src/wx/player_config_dialog.cc

diff --git a/src/lib/decrypted_ecinema_kdm.cc b/src/lib/decrypted_ecinema_kdm.cc
new file mode 100644 (file)
index 0000000..2cb4f61
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+    Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+
+#include "encrypted_ecinema_kdm.h"
+#include "decrypted_ecinema_kdm.h"
+#include <dcp/key.h>
+#include <dcp/certificate.h>
+
+using dcp::Certificate;
+
+DecryptedECinemaKDM::DecryptedECinemaKDM (dcp::Key content_key)
+       : _content_key (content_key)
+{
+
+}
+
+EncryptedECinemaKDM
+DecryptedECinemaKDM::encrypt (Certificate recipient)
+{
+       return EncryptedECinemaKDM (_content_key, recipient);
+}
+
+#endif
diff --git a/src/lib/decrypted_ecinema_kdm.h b/src/lib/decrypted_ecinema_kdm.h
new file mode 100644 (file)
index 0000000..b0fc206
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+    Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+
+#include "encrypted_ecinema_kdm.h"
+#include <dcp/key.h>
+#include <dcp/data.h>
+#include <dcp/certificate.h>
+
+class DecryptedECinemaKDM
+{
+public:
+       DecryptedECinemaKDM (dcp::Key content_key);
+
+       EncryptedECinemaKDM encrypt (dcp::Certificate recipient);
+
+private:
+       /** unenecrypted content key */
+       dcp::Key _content_key;
+};
+
+#endif
diff --git a/src/lib/encrypted_ecinema_kdm.cc b/src/lib/encrypted_ecinema_kdm.cc
new file mode 100644 (file)
index 0000000..196caee
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+    Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+
+#include "encrypted_ecinema_kdm.h"
+#include <dcp/key.h>
+#include <dcp/certificate.h>
+#include <openssl/rsa.h>
+#include <iostream>
+
+using std::cout;
+using boost::shared_ptr;
+using dcp::Certificate;
+
+EncryptedECinemaKDM::EncryptedECinemaKDM (dcp::Key content_key, Certificate recipient)
+{
+       RSA* rsa = recipient.public_key ();
+       dcp::Data encrypted (RSA_size(rsa));
+       int const N = RSA_public_encrypt (content_key.length(), content_key.value(), encrypted.data().get(), rsa, RSA_PKCS1_OAEP_PADDING);
+}
+
+#endif
diff --git a/src/lib/encrypted_ecinema_kdm.h b/src/lib/encrypted_ecinema_kdm.h
new file mode 100644 (file)
index 0000000..decf9e9
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+    Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+
+#include <dcp/key.h>
+#include <dcp/data.h>
+#include <dcp/certificate.h>
+
+class DecryptedECinemaKDM;
+
+class EncryptedECinemaKDM
+{
+public:
+
+private:
+       friend class DecryptedECinemaKDM;
+
+       EncryptedECinemaKDM (dcp::Key key, dcp::Certificate recipient);
+
+       /** encrypted content key */
+       dcp::Data _content_key;
+};
+
+#endif
index 267600bf808ed9049c2d3717fb96a2bbbb6a608f..c5a270f6536cac8972d043f362c9984f78fdc6af 100644 (file)
@@ -73,6 +73,7 @@ sources = """
           decoder.cc
           decoder_factory.cc
           decoder_part.cc
+          decrypted_ecinema_kdm.cc
           digester.cc
           dkdm_wrapper.cc
           dolby_cp750.cc
@@ -83,6 +84,7 @@ sources = """
           encode_server.cc
           encode_server_finder.cc
           encoded_log_entry.cc
+          encrypted_ecinema_kdm.cc
           environment_info.cc
           event_history.cc
           examine_content_job.cc
index 64874cbefd0fef88982c954f74a32154966dac30..76305d12de55d11ac066528bd6121ce36e2c1a53 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2018-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 */
 
 #include "lib/version.h"
+#include "lib/decrypted_ecinema_kdm.h"
+#include "lib/config.h"
+#include <dcp/key.h>
 extern "C" {
 #include <libavformat/avformat.h>
+#include <libavutil/aes_ctr.h>
 }
 #include <boost/filesystem.hpp>
 #include <boost/optional.hpp>
+#include <openssl/rand.h>
 #include <getopt.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -41,6 +46,7 @@ help (string n)
        cerr << "Syntax: " << n << " [OPTION] <FILE>\n"
             << "  -v, --version        show DCP-o-matic version\n"
             << "  -h, --help           show this help\n"
+            << "  -o, --output         output directory\n"
             << "\n"
             << "<FILE> is the unencrypted .mp4 file.\n";
 }
@@ -83,7 +89,7 @@ main (int argc, char* argv[])
        }
 
        if (!output) {
-               cerr << "You must specify --output or -o\n";
+               cerr << "You must specify --output-media or -o\n";
                exit (EXIT_FAILURE);
        }
 
@@ -146,7 +152,11 @@ main (int argc, char* argv[])
                exit (EXIT_FAILURE);
        }
 
-       if (avformat_write_header (output_fc, 0) < 0) {
+       dcp::Key key (AES_CTR_KEY_SIZE);
+       AVDictionary* options = 0;
+       av_dict_set (&options, "encryption_key", key.hex().c_str(), 0);
+
+       if (avformat_write_header (output_fc, &options) < 0) {
                cerr << "Could not write header to output.\n";
                exit (EXIT_FAILURE);
        }
@@ -169,4 +179,6 @@ main (int argc, char* argv[])
 
        avformat_free_context (input_fc);
        avformat_free_context (output_fc);
+
+       DecryptedECinemaKDM kdm (key);
 }
index 6f4aaeb2149a92381f791552df1d0f002d8ff9d8..61b278a594473041bcfb3ae28222230d6e4c38c1 100644 (file)
@@ -471,12 +471,12 @@ public:
 private:
        void setup ()
        {
-               vector<string> columns;
-               columns.push_back(wx_to_std(_("Manufacturer ID")));
-               columns.push_back(wx_to_std(_("Product code")));
-               columns.push_back(wx_to_std(_("Serial")));
-               columns.push_back(wx_to_std(_("Manufacture week")));
-               columns.push_back(wx_to_std(_("Manufacture year")));
+               vector<EditableListColumn> columns;
+               columns.push_back(EditableListColumn(wx_to_std(_("Manufacturer ID"))));
+               columns.push_back(EditableListColumn(wx_to_std(_("Product code"))));
+               columns.push_back(EditableListColumn(wx_to_std(_("Serial"))));
+               columns.push_back(EditableListColumn(wx_to_std(_("Manufacture week"))));
+               columns.push_back(EditableListColumn(wx_to_std(_("Manufacture year"))));
                _monitor_list = new EditableList<Monitor, MonitorDialog> (
                        _panel,
                        columns,
@@ -484,8 +484,7 @@ private:
                        boost::bind (&Config::set_required_monitors, Config::instance(), _1),
                        boost::bind (&DevicesPage::monitor_column, this, _1, _2),
                        true,
-                       true,
-                       100
+                       true
                        );
                _panel->GetSizer()->Add(_monitor_list, 1, wxEXPAND | wxALL, _border);