diff options
| author | Carl Hetherington <cth@carlh.net> | 2022-11-27 23:11:32 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2022-11-27 23:11:32 +0100 |
| commit | ee231792fe8ec4d4f26ad81778ca5ae6187e46be (patch) | |
| tree | a966ef096304a7634c75c2db193c612b90377385 | |
| parent | 43ec2d1e3a5fdb53d1e3c4239695b39198e79167 (diff) | |
Add make_kdm.cc example.
| -rw-r--r-- | examples/make_kdm.cc | 119 | ||||
| -rw-r--r-- | examples/wscript | 2 | ||||
| -rwxr-xr-x | run/examples/make_kdm | 12 |
3 files changed, 132 insertions, 1 deletions
diff --git a/examples/make_kdm.cc b/examples/make_kdm.cc new file mode 100644 index 00000000..958b2ba6 --- /dev/null +++ b/examples/make_kdm.cc @@ -0,0 +1,119 @@ +/* + Copyright (C) 2012-2022 Carl Hetherington <cth@carlh.net> + + 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. + + 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 libdcp. If not, see <http://www.gnu.org/licenses/>. +*/ + + +/* If you are using an installed libdcp, these #includes would need to be changed to +#include <dcp/decrypted_kdm.h> +... etc. ... +*/ + +#include "certificate_chain.h" +#include "decrypted_kdm.h" +#include "encrypted_kdm.h" +#include "key.h" +#include "util.h" + + +constexpr char recipient_certificate[] = "-----BEGIN CERTIFICATE-----\n" +"MIIEaTCCA1GgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBhTEWMBQGA1UEChMNZGNw\n" +"b21hdGljLmNvbTEWMBQGA1UECxMNZGNwb21hdGljLmNvbTEsMCoGA1UEAxMjLmRj\n" +"cG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUxJTAjBgNVBC4THEJyRE1x\n" +"TjF4bytQcy9ZZTdLTmVhNzRHdlI5Yz0wHhcNMjIwOTIwMTk1MTQxWhcNMzIwOTIy\n" +"MTk1MTQxWjB/MRYwFAYDVQQKEw1kY3BvbWF0aWMuY29tMRYwFAYDVQQLEw1kY3Bv\n" +"bWF0aWMuY29tMSYwJAYDVQQDEx1DUy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuTEVB\n" +"RjElMCMGA1UELhMcSmR4aEVZdURUR05RQlh2TFpsWEZReVVGSzdZPTCCASIwDQYJ\n" +"KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOWq+41uCQbcwQ8+Sh3kVUiG7b9SjU5k\n" +"L8my4IEW2ajjUSDff/a2AM7W+BBAzuAWXpZe2+x+/UdAKOIBLFuyWFKbKLMgh0i0\n" +"WuukOqeEdr+ZD09PgvHriEk9pXcYDhGxp3OmLVR7kmK0mn+SwLfNZ2LUGJSItGra\n" +"ciOPcJgbj/2jyqIkFOz6oZk4xPNdhhM1q41ledTQY/DjesoQqCVZv+lJlAOhc7Sy\n" +"vynk6WXF+PtRYjTqMFuHKAjZaNjKBFu60gYp3xVdmAyOmD/7DHFtum9HgTr0GM9l\n" +"NfBuU7tFjwl7uylB8/Eff2OLo1cSOH+O2uvzaat1ceYETlCLDeyneY8CAwEAAaOB\n" +"6DCB5TAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIFoDAdBgNVHQ4EFgQUJdxhEYuD\n" +"TGNQBXvLZlXFQyUFK7YwgagGA1UdIwSBoDCBnYAUBrDMqN1xo+Ps/Ye7KNea74Gv\n" +"R9ehgYGkfzB9MRYwFAYDVQQKEw1kY3BvbWF0aWMuY29tMRYwFAYDVQQLEw1kY3Bv\n" +"bWF0aWMuY29tMSQwIgYDVQQDExsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1Qx\n" +"JTAjBgNVBC4THFc4YnBZTXkyVlF2WllDcGhOVWRqUVhLcGVNYz2CAQYwDQYJKoZI\n" +"hvcNAQELBQADggEBAHNocvxiWHwh0JKgf5cS1x7NHjnL9V5NSKRFH6qKZkSEWOdk\n" +"05+n99zxDzjh600DAAp8QIQ8FgC93TXsBg/owrKyZhVpDaRt5ZmUaLmmJUFBtEkJ\n" +"qmlXmZGu213zTCT1coMFNXiEImhUt/vd5JOmNsGydCyzEipr7vt8aDr/xCCJdcUo\n" +"y2Q5MfrD5wC4PgPBampSsbIu6IrTfx5kbrKIg/4X2VGFzyNDHz8N4+wfPGBuo4Ra\n" +"6YWAd58LUb1Wp7dP27HkQH74QRPvrVNOC4vcjnHnBtlWmFzGOi+1e4stWupL7IYd\n" +"Apivqyi9TqCUHkjLyuZPjEU30borxqrl918Z/Co=\n" +"-----END CERTIFICATE-----\n"; + + +int main() +{ + /* The parameter to this call specifies where resources can be found, i.e. + * the tags and schema directories. + */ + dcp::init(boost::filesystem::path(".")); + + /* Make a KDM to hold one or more asset keys */ + dcp::DecryptedKDM decrypted_kdm( + // valid from time + dcp::LocalTime("2023-01-20T09:30:00"), + // valid to time + dcp::LocalTime("2023-11-01T09:30:00"), + // annotation text + "KDM annotation", + // content title text + "KDM content title", + // issue date; using dcp::LocalTime() gives the time when the code is run + dcp::LocalTime().as_string() + ); + + /* Add a key which can decrypt an asset; you should do this for each encrypted asset + * that the KDM must unlock. + */ + decrypted_kdm.add_key( + // key type (MDIK is for image MXFs) + std::string{"MDIK"}, + // key ID + "01234567-89ab-cdef-0123-456789abcdef", + // key + dcp::Key("00112233445566778899aabbccddeeff"), + // CPL ID + "fedcba98-7654-3210-fedc-ba9876543210", + // Standard for KDM (interop/SMPTE) + dcp::Standard::SMPTE + ); + + /* Make a certificate chain to sign the KDM */ + auto signer = std::make_shared<dcp::CertificateChain>("/usr/bin/openssl", 365); + + /* Certificate of the recipient projector/media block */ + dcp::Certificate recipient(recipient_certificate); + + /* Encrypt the KDM */ + auto encrypted_kdm = decrypted_kdm.encrypt( + signer, + recipient, + {}, + dcp::Formulation::MODIFIED_TRANSITIONAL_1, + false, + {} + ); + + /* Dump the XML to the console */ + std::cout << encrypted_kdm.as_xml(); + + return 0; +} + diff --git a/examples/wscript b/examples/wscript index 234d0240..d062af1b 100644 --- a/examples/wscript +++ b/examples/wscript @@ -17,7 +17,7 @@ # def build(bld): - for example in ['make_dcp', 'read_dcp']: + for example in ['make_dcp', 'read_dcp', 'make_kdm']: obj = bld(features='cxx cxxprogram') obj.name = example obj.use = 'libdcp%s' % bld.env.API_VERSION diff --git a/run/examples/make_kdm b/run/examples/make_kdm new file mode 100755 index 00000000..2358696a --- /dev/null +++ b/run/examples/make_kdm @@ -0,0 +1,12 @@ +#!/bin/bash + +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:build/src +if [ "$1" == "--debug" ]; then + shift + gdb --args build/examples/make_kdm "$@" +elif [ "$1" == "--valgrind" ]; then + shift + valgrind --tool="memcheck" --leak-check=full --show-reachable=yes build/examples/make_kdm "$@" +else + build/examples/make_kdm "$@" +fi |
