X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fround_trip_test.cc;h=c5ad414ceb2be47d1e1062d6a3c4a7d94edc7998;hb=d6b800e1c9a3cdb4f85a2308190afe9f0a856ed4;hp=e94d8c728ef865c5c8db12c19f2ba91f4f3800eb;hpb=d88c2244d4f90d54164fcc856c3ba73809756381;p=libdcp.git diff --git a/test/round_trip_test.cc b/test/round_trip_test.cc index e94d8c72..c5ad414c 100644 --- a/test/round_trip_test.cc +++ b/test/round_trip_test.cc @@ -1,68 +1,78 @@ /* - Copyright (C) 2013 Carl Hetherington + Copyright (C) 2013-2019 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of libdcp. + + libdcp 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. - This program is distributed in the hope that it will be useful, + libdcp 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 this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - + along with libdcp. If not, see . + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. */ -#include "certificates.h" -#include "kdm.h" -#include "signer.h" -#include "mono_picture_mxf.h" -#include "sound_mxf.h" +#include "certificate.h" +#include "decrypted_kdm.h" +#include "encrypted_kdm.h" +#include "certificate_chain.h" +#include "mono_picture_asset.h" +#include "sound_asset.h" #include "reel.h" #include "test.h" #include "cpl.h" #include "mono_picture_frame.h" -#include "argb_frame.h" -#include "signer_chain.h" -#include "mono_picture_mxf_writer.h" +#include "certificate_chain.h" +#include "mono_picture_asset_writer.h" +#include "mono_picture_asset_reader.h" #include "reel_picture_asset.h" #include "reel_mono_picture_asset.h" -#include "file.h" +#include "openjpeg_image.h" +#include "rgb_xyz.h" +#include "colour_conversion.h" #include +#include #include + using std::list; -using boost::shared_ptr; +using std::make_shared; +using std::shared_ptr; +using std::string; +using std::vector; +using boost::scoped_array; -/* Build an encrypted picture MXF and a KDM for it and check that the KDM can be decrypted */ + +/** Build an encrypted picture asset and a KDM for it and check that the KDM can be decrypted */ BOOST_AUTO_TEST_CASE (round_trip_test) { - boost::filesystem::remove_all ("build/test/signer"); - boost::filesystem::create_directory ("build/test/signer"); - dcp::make_signer_chain ("build/test/signer", "openssl"); - - dcp::CertificateChain chain; - chain.add (shared_ptr (new dcp::Certificate (boost::filesystem::path ("build/test/signer/ca.self-signed.pem")))); - chain.add (shared_ptr (new dcp::Certificate (boost::filesystem::path ("build/test/signer/intermediate.signed.pem")))); - chain.add (shared_ptr (new dcp::Certificate (boost::filesystem::path ("build/test/signer/leaf.signed.pem")))); - - shared_ptr signer ( - new dcp::Signer ( - chain, - "test/data/signer.key" - ) - ); + auto signer = make_shared(boost::filesystem::path ("openssl")); boost::filesystem::path work_dir = "build/test/round_trip_test"; boost::filesystem::create_directory (work_dir); - shared_ptr mxf_A (new dcp::MonoPictureMXF (dcp::Fraction (24, 1))); - shared_ptr writer = mxf_A->start_write (work_dir / "video.mxf", dcp::SMPTE, false); - dcp::File j2c ("test/data/32x32_red_square.j2c"); + auto asset_A = make_shared(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto writer = asset_A->start_write (work_dir / "video.mxf", false); + dcp::ArrayData j2c ("test/data/flat_red.j2c"); for (int i = 0; i < 24; ++i) { writer->write (j2c.data (), j2c.size ()); } @@ -70,54 +80,64 @@ BOOST_AUTO_TEST_CASE (round_trip_test) dcp::Key key; - mxf_A->set_key (key); + asset_A->set_key (key); - shared_ptr cpl (new dcp::CPL ("A Test DCP", dcp::FEATURE)); - shared_ptr reel (new dcp::Reel ()); - reel->add (shared_ptr (new dcp::ReelMonoPictureAsset (mxf_A, 0))); + auto cpl = make_shared("A Test DCP", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE); + auto reel = make_shared(); + reel->add (make_shared(asset_A, 0)); cpl->add (reel); + dcp::LocalTime start; + start.set_year (start.year() + 1); + dcp::LocalTime end; + end.set_year (end.year() + 2); + /* A KDM using our certificate chain's leaf key pair */ - dcp::KDM kdm_A ( + dcp::DecryptedKDM kdm_A ( cpl, - signer, - signer->certificates().leaf(), - boost::posix_time::time_from_string ("2013-01-01 00:00:00"), - boost::posix_time::time_from_string ("2013-01-08 00:00:00"), + key, + start, + end, "libdcp", + "test", "2012-07-17T04:45:18+00:00" ); boost::filesystem::path const kdm_file = work_dir / "kdm.xml"; - kdm_A.as_xml (kdm_file); + kdm_A.encrypt(signer, signer->leaf(), vector(), dcp::Formulation::MODIFIED_TRANSITIONAL_1, true, 0).as_xml (kdm_file); /* Reload the KDM, using our private key to decrypt it */ - dcp::KDM kdm_B (kdm_file, "build/test/signer/leaf.key"); + dcp::DecryptedKDM kdm_B (dcp::EncryptedKDM (dcp::file_to_string (kdm_file)), signer->key().get ()); /* Check that the decrypted KDMKeys are the same as the ones we started with */ BOOST_CHECK_EQUAL (kdm_A.keys().size(), kdm_B.keys().size()); - list keys_A = kdm_A.keys (); - list keys_B = kdm_B.keys (); - list::const_iterator i = keys_A.begin(); - list::const_iterator j = keys_B.begin(); + auto keys_A = kdm_A.keys (); + auto keys_B = kdm_B.keys (); + auto i = keys_A.begin(); + auto j = keys_B.begin(); while (i != keys_A.end ()) { BOOST_CHECK (*i == *j); ++i; ++j; } - /* Reload the picture MXF */ - shared_ptr mxf_B ( - new dcp::MonoPictureMXF (work_dir / "video.mxf") - ); + /* Reload the picture asset */ + auto asset_B = make_shared(work_dir / "video.mxf"); BOOST_CHECK (!kdm_B.keys().empty ()); - mxf_B->set_key (kdm_B.keys().front().key()); + asset_B->set_key (kdm_B.keys().front().key()); + + auto xyz_A = asset_A->start_read()->get_frame(0)->xyz_image (); + auto xyz_B = asset_B->start_read()->get_frame(0)->xyz_image (); + + scoped_array frame_A (new uint8_t[xyz_A->size().width * xyz_A->size().height * 4]); + dcp::xyz_to_rgba (xyz_A, dcp::ColourConversion::srgb_to_xyz(), frame_A.get(), xyz_A->size().width * 4); + + scoped_array frame_B (new uint8_t[xyz_B->size().width * xyz_B->size().height * 4]); + dcp::xyz_to_rgba (xyz_B, dcp::ColourConversion::srgb_to_xyz(), frame_B.get(), xyz_B->size().width * 4); - shared_ptr frame_A = mxf_A->get_frame(0)->argb_frame (); - shared_ptr frame_B = mxf_B->get_frame(0)->argb_frame (); - BOOST_CHECK_EQUAL (frame_A->size().width, frame_B->size().width); - BOOST_CHECK_EQUAL (frame_A->size().height, frame_B->size().height); - BOOST_CHECK_EQUAL (memcmp (frame_A->data(), frame_B->data(), frame_A->size().width * frame_A->size().height), 0); + BOOST_CHECK_EQUAL (xyz_A->size().width, xyz_B->size().width); + BOOST_CHECK_EQUAL (xyz_A->size().height, xyz_B->size().height); + BOOST_CHECK_EQUAL (memcmp (frame_A.get(), frame_B.get(), xyz_A->size().width * xyz_A->size().height * 4), 0); }