summaryrefslogtreecommitdiffstats
path: root/xbmc/interfaces/legacy/DrmCryptoSession.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xbmc/interfaces/legacy/DrmCryptoSession.h342
1 files changed, 342 insertions, 0 deletions
diff --git a/xbmc/interfaces/legacy/DrmCryptoSession.h b/xbmc/interfaces/legacy/DrmCryptoSession.h
new file mode 100644
index 0000000..816bec8
--- /dev/null
+++ b/xbmc/interfaces/legacy/DrmCryptoSession.h
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "AddonClass.h"
+#include "Exception.h"
+#include "commons/Buffer.h"
+
+#include <map>
+#include <vector>
+
+namespace DRM
+{
+ class CCryptoSession;
+}
+
+namespace XBMCAddon
+{
+
+ typedef std::vector<char> charVec;
+
+ namespace xbmcdrm
+ {
+
+ XBMCCOMMONS_STANDARD_EXCEPTION(DRMException);
+
+ //
+ /// \defgroup python_xbmcdrm Library - xbmcdrm
+ ///@{
+ /// @brief **Kodi's %DRM class.**
+ ///
+ /// Offers classes and functions that allow a developer to work with
+ /// DRM-protected contents like Widevine.
+ ///
+ /// This type of functionality is closely related to the type of %DRM
+ /// used and the service to be implemented.
+ ///
+ /// Using the \ref xbmcdrm_CryptoSession "CryptoSession" constructor allow you
+ /// to have access to a %DRM session.
+ /// With a %DRM session you can read and write the %DRM properties
+ /// \ref xbmcdrm_GetPropertyString "GetPropertyString",
+ /// \ref xbmcdrm_SetPropertyString "SetPropertyString"
+ /// and establish session keys with
+ /// \ref xbmcdrm_GetKeyRequest "GetKeyRequest" and
+ /// \ref xbmcdrm_ProvideKeyResponse "ProvideKeyResponse",
+ /// or resume previous session keys with
+ /// \ref xbmcdrm_RestoreKeys "RestoreKeys".
+ ///
+ /// When the session keys are established you can use these methods
+ /// to perform various operations:
+ /// \ref xbmcdrm_Encrypt "Encrypt" /
+ /// \ref xbmcdrm_Decrypt "Decrypt" for data encryption / decryption,
+ /// \ref xbmcdrm_Sign "Sign" /
+ /// \ref xbmcdrm_Verify "Verify" for make or verify data-signature.
+ /// Useful for example to implement encrypted communication between
+ /// a client and the server.
+ ///
+ /// An example where such functionality is useful is the Message
+ /// Security Layer (MSL) transmission protocol used in some VOD applications.
+ /// This protocol (or rather framework) is used to increase the level of security
+ /// in the exchange of messages (such as licences, manifests or other data),
+ /// which defines a security extension / layer on top of the HTTP protocol.
+ ///
+ ///--------------------------------------------------------------------------
+ /// Constructor for %DRM crypto session
+ ///
+ /// \anchor xbmcdrm_CryptoSession
+ /// \python_class{ xbmcdrm.CryptoSession(UUID, cipherAlgorithm, macAlgorithm) }
+ ///
+ /// @param UUID string - 16 byte UUID of the %DRM system to use
+ /// @param cipherAlgorithm string - Algorithm used for encryption / decryption ciphers
+ /// @param macAlgorithm string - Algorithm used for sign / verify
+ ///
+ /// @throws RuntimeException If the session can not be established
+ ///
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New class added.
+ ///
+ /// **Example:**
+ /// ~~~~~~~~~~~~~{.py}
+ /// ..
+ /// uuid_widevine = 'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed'
+ /// crypto_session = xbmcdrm.CryptoSession(uuid_widevine, 'AES/CBC/NoPadding', 'HmacSHA256')
+ /// ..
+ /// ~~~~~~~~~~~~~
+ ///
+ class CryptoSession : public AddonClass
+ {
+ DRM::CCryptoSession* m_cryptoSession;
+ public:
+ CryptoSession(const String& UUID, const String& cipherAlgorithm, const String& macAlgorithm);
+ ~CryptoSession() override;
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ GetKeyRequest(init, mimeType, offlineKey, optionalParameters) }
+ /// Generate a key request
+ ///
+ /// Generate a key request, used for request/response exchange between the app
+ /// and a license server to obtain or release keys used to decrypt encrypted content.
+ /// After the app has received the key request response from the license server,
+ /// it should deliver to the response to the %DRM instance using
+ /// the method \ref xbmcdrm_ProvideKeyResponse "ProvideKeyResponse", to activate the keys.
+ // \anchor xbmcdrm_GetKeyRequest
+ ///
+ /// @param init byte - Initialization bytes container-specific data,
+ /// its meaning is interpreted based on the mime type provided
+ /// in the mimeType parameter. It could contain, for example,
+ /// the content ID, key ID or other data required in generating
+ /// the key request.
+ /// @param mimeType string - Type of media which is exchanged
+ /// (e.g. "application/xml", "video/mp4")
+ /// @param offlineKey bool - Specifies the type of the request.
+ /// The request may be to acquire keys for Streaming or Offline content
+ /// @param optionalParameters [opt] map - Will be included in the key request message
+ /// to allow a client application to provide additional
+ /// message parameters to the server
+ ///
+ /// @return byte - The opaque key request data (challenge) which is send to key server
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ /// @python_v19 With python 3 the init param must be a bytearray instead of byte.
+ ///
+ GetKeyRequest(...);
+#else
+ XbmcCommons::Buffer GetKeyRequest(const XbmcCommons::Buffer &init, const String &mimeType, bool offlineKey, const std::map<String, String> &optionalParameters);
+#endif
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ GetPropertyString(name) }
+ /// Request a system specific property value of the %DRM system.
+ ///
+ ///\anchor xbmcdrm_GetPropertyString
+ /// @param Name string - Name of the property to query
+ ///
+ /// @return Value of the requested property
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ ///
+ GetPropertyString(...);
+#else
+ String GetPropertyString(const String &name);
+#endif
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ ProvideKeyResponse(response) }
+ /// Provide a key response
+ ///
+ /// \anchor xbmcdrm_ProvideKeyResponse
+ /// When a key response is received from the license server,
+ /// must be sent to the %DRM instance by using provideKeyResponse.
+ /// See also \ref xbmcdrm_GetKeyRequest "GetKeyRequest".
+ ///
+ /// @param response byte - Key data returned from the license server
+ ///
+ /// @return A keySetId if the response is for an offline key requests which
+ /// can be used later with restoreKeys,
+ /// else return empty for streaming key requests.
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ /// @python_v19 With python 3 the response argument must be a bytearray instead of byte.
+ ///
+ ProvideKeyResponse(...);
+#else
+ String ProvideKeyResponse(const XbmcCommons::Buffer &response);
+#endif
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ RemoveKeys() }
+ /// Removes all keys currently loaded in a session.
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ ///
+ RemoveKeys(...);
+#else
+ void RemoveKeys();
+#endif
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ RestoreKeys(keySetId) }
+ /// Restores session keys stored during previous
+ /// \ref xbmcdrm_ProvideKeyResponse "ProvideKeyResponse" call.
+ /// \anchor xbmcdrm_RestoreKeys
+ ///
+ /// @param keySetId string - Identifies the saved key set to restore.
+ /// This value must never be null.
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ ///
+ RestoreKeys(...);
+#else
+ void RestoreKeys(const String& keySetId);
+#endif
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ SetPropertyString(name, value) }
+ /// Set a system specific property value in the %DRM system.
+ ///
+ /// \anchor xbmcdrm_SetPropertyString
+ ///
+ /// @param name string - Name of the property. This value must never be null.
+ /// @param value string - Value of the property to set. This value must never be null.
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ ///
+ SetPropertyString(...);
+#else
+ void SetPropertyString(const String &name, const String &value);
+#endif
+
+/*******************Crypto section *****************/
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ Decrypt(cipherKeyId, input, iv) }
+ /// Decrypt an encrypted data by using session keys.
+ ///
+ /// \anchor xbmcdrm_Decrypt
+ ///
+ /// @param cipherKeyId byte - Encryption key id (provided from a service handshake)
+ /// @param input byte - Cipher text to decrypt
+ /// @param iv byte - Initialization vector of cipher text
+ ///
+ /// @return Decrypted input data
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ /// @python_v19 With python 3 all arguments need to be of type bytearray instead of byte.
+ ///
+ Decrypt(...);
+#else
+ XbmcCommons::Buffer Decrypt(const XbmcCommons::Buffer &cipherKeyId, const XbmcCommons::Buffer &input, const XbmcCommons::Buffer &iv);
+#endif
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ Encrypt(cipherKeyId, input, iv) }
+ /// Encrypt data by using session keys.
+ ///
+ /// \anchor xbmcdrm_Encrypt
+ ///
+ /// @param cipherKeyId byte - Encryption key id (provided from a service handshake)
+ /// @param input byte - Encrypted text
+ /// @param iv byte - Initialization vector of encrypted text
+ ///
+ /// @return byte - Encrypted input data
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ /// @python_v19 With python 3 all arguments need to be of type bytearray instead of byte.
+ ///
+ Encrypt(...);
+#else
+ XbmcCommons::Buffer Encrypt(const XbmcCommons::Buffer &cipherKeyId, const XbmcCommons::Buffer &input, const XbmcCommons::Buffer &iv);
+#endif
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ Sign(macKeyId, message) }
+ /// Generate a %DRM encrypted signature for a text message.
+ ///
+ /// \anchor xbmcdrm_Sign
+ ///
+ /// @param macKeyId byte - HMAC key id (provided from a service handshake)
+ /// @param message byte - Message text on which to base the signature
+ ///
+ /// @return byte - Signature
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ /// @python_v19 With python 3 all arguments need to be of type bytearray instead of byte.
+ ///
+ Sign(...);
+#else
+ XbmcCommons::Buffer Sign(const XbmcCommons::Buffer &macKeyId, const XbmcCommons::Buffer &message);
+#endif
+
+#ifdef DOXYGEN_SHOULD_USE_THIS
+ ///
+ /// \ingroup python_xbmcdrm
+ /// @brief \python_func{ Verify(macKeyId, message, signature) }
+ /// Verify the validity of a %DRM signature of a text message.
+ ///
+ /// \anchor xbmcdrm_Verify
+ ///
+ /// @param macKeyId byte - HMAC key id (provided from a service handshake)
+ /// @param message byte - Message text on which the signature is based
+ /// @param signature byte - The signature to verify
+ ///
+ /// @return true when the signature is valid
+ ///
+ ///
+ ///------------------------------------------------------------------------
+ /// @python_v18 New function added.
+ /// @python_v19 With python 3 for all arguments is needed to pass bytearray instead of byte.
+ ///
+ Verify(...);
+#else
+ bool Verify(const XbmcCommons::Buffer &macKeyId, const XbmcCommons::Buffer &message, const XbmcCommons::Buffer &signature);
+#endif
+
+ };
+ ///@}
+ }
+}