1 /*
2  *  Copyright (C) 2005-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "media/drm/CryptoSession.h"
12 
13 class CJNIMediaDrm;
14 class CJNIMediaDrmCryptoSession;
15 
16 namespace DRM
17 {
18   class CharVecBuffer : public XbmcCommons::Buffer
19   {
20   public:
CharVecBuffer(const XbmcCommons::Buffer & buf)21     inline CharVecBuffer(const XbmcCommons::Buffer& buf) : XbmcCommons::Buffer(buf) {};
22 
CharVecBuffer(const std::vector<char> & vec)23     inline CharVecBuffer(const std::vector<char>& vec)
24       : XbmcCommons::Buffer(vec.size())
25     {
26       memcpy(data(), vec.data(), vec.size());
27     }
28 
29     inline operator std::vector<char>() const
30     {
31       return std::vector<char>(data(), data() + capacity());
32     }
33   };
34 
35   class CharVecBuffer;
36 
37   class CMediaDrmCryptoSession : public CCryptoSession
38   {
39   public:
40     static void Register();
41     CMediaDrmCryptoSession(const std::string& UUID, const std::string& cipherAlgo, const std::string& macAlgo);
42     ~CMediaDrmCryptoSession() override;
43 
44     // Interface methods
45     XbmcCommons::Buffer GetKeyRequest(const XbmcCommons::Buffer& init, const std::string& mimeType, bool offlineKey, const std::map<std::string, std::string>& parameters) override;
46     std::string GetPropertyString(const std::string& name) override;
47     std::string ProvideKeyResponse(const XbmcCommons::Buffer& response) override;
48     void RemoveKeys() override;
49     void RestoreKeys(const std::string& keySetId) override;
50     void SetPropertyString(const std::string& name, const std::string& value) override;
51 
52     // Crypto methods
53     XbmcCommons::Buffer Decrypt(const XbmcCommons::Buffer& cipherKeyId, const XbmcCommons::Buffer& input, const XbmcCommons::Buffer& iv) override;
54     XbmcCommons::Buffer Encrypt(const XbmcCommons::Buffer& cipherKeyId, const XbmcCommons::Buffer& input, const XbmcCommons::Buffer& iv) override;
55     XbmcCommons::Buffer Sign(const XbmcCommons::Buffer& macKeyId, const XbmcCommons::Buffer& message) override;
56     bool Verify(const XbmcCommons::Buffer& macKeyId, const XbmcCommons::Buffer& message, const XbmcCommons::Buffer& signature ) override;
57 
58   private:
59     static CCryptoSession* Create(const std::string& UUID, const std::string& cipherAlgo, const std::string& hmacAlgo);
60     bool OpenSession();
61     void CloseSession();
62     bool ProvisionRequest();
63 
64     CJNIMediaDrm* m_mediaDrm;
65     CJNIMediaDrmCryptoSession* m_cryptoSession;
66 
67     std::string m_cipherAlgo;
68     std::string  m_macAlgo;
69     std::string m_keySetId;
70 
71     bool m_hasKeys;
72 
73     CharVecBuffer* m_sessionId;
74   };
75 
76 } //namespace
77