Actually encrypt AuthenticatedPrivate section of KDM.
[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 "key.h"
26 #include "metadata.h"
27
28 namespace libdcp {
29
30 namespace xml {
31         class DCinemaSecurityMessage;
32 };
33
34 class Signer;
35 class Certificate;
36 class CPL;
37
38 /** A single key for encrypting or decrypting an MXF.  One or more of these
39  *  are delivered in a KDM.
40  */
41 class KDMKey
42 {
43 public:
44         KDMKey (uint8_t const *, int);
45
46         KDMKey (
47                 boost::shared_ptr<const Signer> signer,
48                 std::string cpl_id, std::string key_id, boost::posix_time::ptime from, boost::posix_time::ptime until, Key key
49                 );
50         
51         KDMKey (KDMKey const &);
52
53         KDMKey& operator= (KDMKey const &);
54
55         std::string cpl_id () const {
56                 return _cpl_id;
57         }
58         
59         std::string key_id () const {
60                 return _key_id;
61         }
62
63         std::string not_valid_before () const {
64                 return _not_valid_before;
65         }
66
67         std::string not_valid_after () const {
68                 return _not_valid_after;
69         }
70
71         Key key () const {
72                 return _key;
73         }
74
75         std::string encrypted_base64 (boost::shared_ptr<const Certificate>) const;
76         
77 private:
78         void get (uint8_t *, uint8_t const **, int) const;
79         std::string get (uint8_t const **, int) const;
80         std::string get_uuid (uint8_t const **) const;
81         void put (uint8_t **, uint8_t const *, int) const;
82         void put (uint8_t **, std::string) const;
83         void put_uuid (uint8_t **, std::string) const;
84         
85         uint8_t _signer_thumbprint[20];
86         std::string _cpl_id;
87         std::string _key_type;
88         std::string _key_id;
89         std::string _not_valid_before;
90         std::string _not_valid_after;
91         Key _key;
92 };
93
94 class KDM
95 {
96 public:
97         KDM (boost::filesystem::path, boost::filesystem::path);
98
99         KDM (
100                 boost::shared_ptr<const CPL> cpl, boost::shared_ptr<const Signer>, boost::shared_ptr<const Certificate> recipient_cert,
101                 boost::posix_time::ptime not_valid_before, boost::posix_time::ptime not_valid_after,
102                 std::string annotation_text, std::string issue_date
103                 );
104
105         std::list<KDMKey> keys () const {
106                 return _keys;
107         }
108
109         void as_xml (boost::filesystem::path) const;
110
111 private:
112         std::string _message_id;
113         std::list<KDMKey> _keys;
114
115         boost::shared_ptr<xml::DCinemaSecurityMessage> xml_kdm;
116 };
117
118
119 }
120
121 #endif