ba17ee6b1fcf8e1028afc26567175d3560664783
[libdcp.git] / src / kdm.h
1 /*
2     Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef LIBDCP_KDM_H
21 #define LIBDCP_KDM_H
22
23 #include <boost/filesystem.hpp>
24 #include <boost/scoped_ptr.hpp>
25 #include <boost/date_time/posix_time/posix_time.hpp>
26 #include "key.h"
27 #include "metadata.h"
28
29 namespace libdcp {
30
31 namespace xml {
32         class DCinemaSecurityMessage;
33 };
34
35 class Signer;
36 class Certificate;
37 class CPL;
38
39 /** A single key for encrypting or decrypting an MXF.  One or more of these
40  *  are delivered in a KDM.
41  */
42 class KDMKey
43 {
44 public:
45         KDMKey (uint8_t const *, int);
46
47         KDMKey (
48                 boost::shared_ptr<const Signer> signer,
49                 std::string cpl_id, std::string key_id, boost::posix_time::ptime from, boost::posix_time::ptime until, Key key
50                 );
51         
52         KDMKey (KDMKey const &);
53
54         KDMKey& operator= (KDMKey const &);
55
56         std::string cpl_id () const {
57                 return _cpl_id;
58         }
59         
60         std::string key_id () const {
61                 return _key_id;
62         }
63
64         std::string not_valid_before () const {
65                 return _not_valid_before;
66         }
67
68         std::string not_valid_after () const {
69                 return _not_valid_after;
70         }
71
72         Key key () const {
73                 return _key;
74         }
75
76         std::string encrypted_base64 (boost::shared_ptr<const Certificate>) const;
77         
78 private:
79         void get (uint8_t *, uint8_t const **, int) const;
80         std::string get (uint8_t const **, int) const;
81         std::string get_uuid (uint8_t const **) const;
82         void put (uint8_t **, uint8_t const *, int) const;
83         void put (uint8_t **, std::string) const;
84         void put_uuid (uint8_t **, std::string) const;
85         
86         uint8_t _signer_thumbprint[20];
87         std::string _cpl_id;
88         std::string _key_type;
89         std::string _key_id;
90         std::string _not_valid_before;
91         std::string _not_valid_after;
92         Key _key;
93 };
94
95 class KDM
96 {
97 public:
98         KDM (boost::filesystem::path, boost::filesystem::path);
99
100         KDM (
101                 boost::shared_ptr<const CPL> cpl, boost::shared_ptr<const Signer>, boost::shared_ptr<const Certificate> recipient_cert,
102                 boost::posix_time::ptime not_valid_before, boost::posix_time::ptime not_valid_after,
103                 std::string annotation_text, std::string issue_date
104                 );
105
106         std::list<KDMKey> keys () const {
107                 return _keys;
108         }
109
110         void as_xml (boost::filesystem::path) const;
111         std::string as_xml () const;
112
113 private:
114         /** Unencrypted MXF content keys */
115         std::list<KDMKey> _keys;
116
117         boost::shared_ptr<xml::DCinemaSecurityMessage> xml_kdm;
118 };
119
120
121 }
122
123 #endif