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