diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-08-17 00:45:59 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-08-17 00:46:19 +0100 |
| commit | 01e08cb5fef34a33524e404ae8e2ad7d029d0a22 (patch) | |
| tree | b2512bdbb9376cf95b233ab58d0ecd25a86a55f1 /src | |
| parent | 2f6087e528c1a48fed0ac7166b1ff8704684c87a (diff) | |
Use PKL when verifying DCPs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/pkl.cc | 13 | ||||
| -rw-r--r-- | src/pkl.h | 6 | ||||
| -rw-r--r-- | src/verify.cc | 54 |
3 files changed, 64 insertions, 9 deletions
@@ -35,6 +35,7 @@ #include "exceptions.h" #include "util.h" #include "raw_convert.h" +#include "dcp_assert.h" #include <libxml++/libxml++.h> #include <boost/foreach.hpp> @@ -112,3 +113,15 @@ PKL::write (boost::filesystem::path file, shared_ptr<const CertificateChain> sig doc.write_to_file (file.string(), "UTF-8"); } + +string +PKL::hash (string id) const +{ + BOOST_FOREACH (shared_ptr<Asset> i, _asset_list) { + if (i->id() == id) { + return i->hash; + } + } + + DCP_ASSERT (false); +} @@ -36,6 +36,7 @@ #include "object.h" #include "types.h" +#include "util.h" #include "certificate_chain.h" #include <libcxml/cxml.h> #include <boost/filesystem.hpp> @@ -59,6 +60,8 @@ public: return _standard; } + std::string hash (std::string id) const; + void add_asset (std::string id, boost::optional<std::string> annotation_text, std::string hash, int64_t size, std::string type); void write (boost::filesystem::path file, boost::shared_ptr<const CertificateChain> signer) const; @@ -68,7 +71,8 @@ private: { public: Asset (cxml::ConstNodePtr node) - : annotation_text (node->optional_string_child("AnnotationText")) + : Object (remove_urn_uuid(node->string_child("Id"))) + , annotation_text (node->optional_string_child("AnnotationText")) , hash (node->string_child("Hash")) , size (node->number_child<int64_t>("Size")) , type (node->string_child("Type")) diff --git a/src/verify.cc b/src/verify.cc index 87958ed9..1e8c3091 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -53,13 +53,35 @@ using boost::function; using namespace dcp; -static bool -verify_asset (shared_ptr<ReelAsset> asset, function<void (float)> progress) +enum Result { + RESULT_GOOD, + RESULT_CPL_PKL_DIFFER, + RESULT_BAD +}; + +static Result +verify_asset (shared_ptr<DCP> dcp, shared_ptr<ReelAsset> reel_asset, function<void (float)> progress) { - string actual_hash = asset->asset_ref()->hash(progress); - optional<string> cpl_hash = asset->hash(); - DCP_ASSERT (cpl_hash); - return actual_hash != *cpl_hash; + string const actual_hash = reel_asset->asset_ref()->hash(progress); + + shared_ptr<PKL> pkl = dcp->pkl(); + /* We've read this DCP in so it must have a PKL */ + DCP_ASSERT (pkl); + + shared_ptr<Asset> asset = reel_asset->asset_ref().asset(); + cout << "looking for hash of " << reel_asset->asset_ref()->id() << "\n"; + string const pkl_hash = pkl->hash (reel_asset->asset_ref()->id()); + + optional<string> cpl_hash = reel_asset->hash(); + if (cpl_hash && *cpl_hash != pkl_hash) { + return RESULT_CPL_PKL_DIFFER; + } + + if (actual_hash != pkl_hash) { + return RESULT_BAD; + } + + return RESULT_GOOD; } list<VerificationNote> @@ -89,14 +111,30 @@ dcp::verify (vector<boost::filesystem::path> directories, function<void (string, stage ("Checking reel", optional<boost::filesystem::path>()); if (reel->main_picture()) { stage ("Checking picture asset hash", reel->main_picture()->asset()->file()); - if (verify_asset (reel->main_picture(), progress)) { + Result const r = verify_asset (dcp, reel->main_picture(), progress); + switch (r) { + case RESULT_BAD: notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, "Picture asset hash is incorrect.")); + break; + case RESULT_CPL_PKL_DIFFER: + notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, "PKL and CPL hashes differ for picture asset.")); + break; + default: + break; } } if (reel->main_sound()) { stage ("Checking sound asset hash", reel->main_sound()->asset()->file()); - if (verify_asset (reel->main_sound(), progress)) { + Result const r = verify_asset (dcp, reel->main_sound(), progress); + switch (r) { + case RESULT_BAD: notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, "Sound asset hash is incorrect.")); + break; + case RESULT_CPL_PKL_DIFFER: + notes.push_back (VerificationNote (VerificationNote::VERIFY_ERROR, "PKL and CPL hashes differ for sound asset.")); + break; + default: + break; } } } |
