def __init__(self, msl_data=None): # pylint: disable=broad-except try: self.crypto_session = xbmcdrm.CryptoSession( 'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', 'AES/CBC/NoPadding', 'HmacSHA256') common.debug('Widevine CryptoSession successful constructed') except Exception: import traceback common.error(traceback.format_exc()) raise MSLError('Failed to construct Widevine CryptoSession') try: super(AndroidMSLCrypto, self).__init__(msl_data) self.keyset_id = base64.standard_b64decode(msl_data['key_set_id']) self.key_id = base64.standard_b64decode(msl_data['key_id']) self.hmac_key_id = base64.standard_b64decode( msl_data['hmac_key_id']) self.crypto_session.RestoreKeys(self.keyset_id) except MastertokenExpired as me: raise me except Exception: self.keyset_id = None self.key_id = None self.hmac_key_id = None common.debug('Widevine CryptoSession systemId: {}'.format( self.crypto_session.GetPropertyString('systemId'))) common.debug('Widevine CryptoSession algorithms: {}'.format( self.crypto_session.GetPropertyString('algorithms')))
def __init__(self): super(AndroidMSLCrypto, self).__init__() self.crypto_session = None self.keyset_id = None self.key_id = None self.hmac_key_id = None try: self.crypto_session = xbmcdrm.CryptoSession( 'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', 'AES/CBC/NoPadding', 'HmacSHA256') common.debug('Widevine CryptoSession successful constructed') except Exception: # pylint: disable=broad-except import traceback common.error(g.py2_decode(traceback.format_exc(), 'latin-1')) raise MSLError('Failed to construct Widevine CryptoSession') drm_info = { 'version': self.crypto_session.GetPropertyString('version'), 'system_id': self.crypto_session.GetPropertyString('systemId'), # 'device_unique_id': self.crypto_session.GetPropertyByteArray('deviceUniqueId') 'hdcp_level': self.crypto_session.GetPropertyString('hdcpLevel'), 'hdcp_level_max': self.crypto_session.GetPropertyString('maxHdcpLevel'), 'security_level': self.crypto_session.GetPropertyString('securityLevel') } if not drm_info['version']: # Possible cases where no data is obtained: # - Device with custom ROM or without Widevine support # - Using Kodi debug build with a InputStream Adaptive release build (yes users do it) raise MSLError( 'It was not possible to get the data from Widevine CryptoSession.\r\n' 'Your system is not Widevine certified or you have a wrong Kodi version installed.' ) g.LOCAL_DB.set_value('drm_system_id', drm_info['system_id'], TABLE_SESSION) g.LOCAL_DB.set_value('drm_security_level', drm_info['security_level'], TABLE_SESSION) g.LOCAL_DB.set_value('drm_hdcp_level', drm_info['hdcp_level'], TABLE_SESSION) common.debug('Widevine version: {}', drm_info['version']) if drm_info['system_id']: common.debug('Widevine CryptoSession system id: {}', drm_info['system_id']) else: common.warn('Widevine CryptoSession system id not obtained!') common.debug('Widevine CryptoSession security level: {}', drm_info['security_level']) common.debug('Widevine CryptoSession current hdcp level: {}', drm_info['hdcp_level']) common.debug('Widevine CryptoSession max hdcp level supported: {}', drm_info['hdcp_level_max']) common.debug('Widevine CryptoSession algorithms: {}', self.crypto_session.GetPropertyString('algorithms'))
def __init__(self): super(AndroidMSLCrypto, self).__init__() self.crypto_session = None self.keyset_id = None self.key_id = None self.hmac_key_id = None try: self.crypto_session = xbmcdrm.CryptoSession( 'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', 'AES/CBC/NoPadding', 'HmacSHA256') common.debug('Widevine CryptoSession successful constructed') except Exception: # pylint: disable=broad-except import traceback common.error(traceback.format_exc()) raise MSLError('Failed to construct Widevine CryptoSession') drm_info = { 'version': self.crypto_session.GetPropertyString('version'), 'system_id': self.crypto_session.GetPropertyString('systemId'), # 'device_unique_id': self.crypto_session.GetPropertyByteArray('deviceUniqueId') 'hdcp_level': self.crypto_session.GetPropertyString('hdcpLevel'), 'hdcp_level_max': self.crypto_session.GetPropertyString('maxHdcpLevel'), 'security_level': self.crypto_session.GetPropertyString('securityLevel') } if not drm_info['version']: # Possible cases where no data is obtained: # I don't know if this is really the cause, but seem that using Kodi debug build with a # InputStream Adaptive release build (yes users do it) cause problems raise MSLError( 'It was not possible to get the data from Widevine CryptoSession, ' 'try to reinstall Kodi with latest version') g.LOCAL_DB.set_value('drm_system_id', drm_info['system_id'], TABLE_SESSION) g.LOCAL_DB.set_value('drm_security_level', drm_info['security_level'], TABLE_SESSION) g.LOCAL_DB.set_value('drm_hdcp_level', drm_info['hdcp_level'], TABLE_SESSION) common.debug('Widevine version: {}', drm_info['version']) if drm_info['system_id']: common.debug('Widevine CryptoSession system id: {}', drm_info['system_id']) else: common.warn('Widevine CryptoSession system id not obtained!') common.debug('Widevine CryptoSession security level: {}', drm_info['security_level']) common.debug('Widevine CryptoSession current hdcp level: {}', drm_info['hdcp_level']) common.debug('Widevine CryptoSession max hdcp level supported: {}', drm_info['hdcp_level_max']) common.debug('Widevine CryptoSession algorithms: {}', self.crypto_session.GetPropertyString('algorithms'))
def set_drm_level(): wv_level = settings.common_settings.getEnum('wv_level', WV_LEVELS, default=AUTO) hdcp_level = settings.common_settings.getEnum('hdcp_level', HDCP_LEVELS, default=AUTO) wv_mode = 'manual' hdcp_mode = 'manual' if wv_level == AUTO: wv_mode = 'auto' wv_level = None if hdcp_level == AUTO: hdcp_mode = 'auto' hdcp_level = None if not wv_level or not hdcp_level: if KODI_VERSION > 17: try: import xbmcdrm crypto = xbmcdrm.CryptoSession(WV_UUID, 'AES/CBC/NoPadding', 'HmacSHA256') if not wv_level: wv_level = crypto.GetPropertyString('securityLevel') if wv_level: wv_level = int(wv_level.lower().lstrip('l')) if not hdcp_level: hdcp_level = crypto.GetPropertyString('hdcpLevel') if hdcp_level: hdcp_level = re.findall('\\d+\\.\\d+', hdcp_level) hdcp_level = int(float(hdcp_level[0]) * 10) if hdcp_level else None except Exception as e: log.debug('Failed to obtain crypto config') log.exception(e) if not wv_level: wv_mode = 'fallback' wv_level = WV_L3 if not hdcp_level: hdcp_mode = 'fallback' hdcp_level = HDCP_NONE set_kodi_string('wv_level', wv_level) set_kodi_string('hdcp_level', hdcp_level) log.debug('Widevine Level ({}): {}'.format(wv_mode, wv_level)) log.debug('HDCP Level ({}): {}'.format(hdcp_mode, hdcp_level / 10.0))
def __init__(self, msl_data=None): # pylint: disable=super-on-old-class # pylint: disable=broad-except try: self.crypto_session = xbmcdrm.CryptoSession( 'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', 'AES/CBC/NoPadding', 'HmacSHA256') common.debug('Widevine CryptoSession successful constructed') except Exception: import traceback common.error(traceback.format_exc()) raise MSLError('Failed to construct Widevine CryptoSession') try: super(AndroidMSLCrypto, self).__init__(msl_data) self.keyset_id = base64.standard_b64decode(msl_data['key_set_id']) self.key_id = base64.standard_b64decode(msl_data['key_id']) self.hmac_key_id = base64.standard_b64decode( msl_data['hmac_key_id']) self.crypto_session.RestoreKeys(self.keyset_id) except Exception: self.keyset_id = None self.key_id = None self.hmac_key_id = None drm_info = { 'version': self.crypto_session.GetPropertyString('version'), 'system_id': self.crypto_session.GetPropertyString('systemId'), # 'device_unique_id': self.crypto_session.GetPropertyByteArray('deviceUniqueId') 'hdcp_level': self.crypto_session.GetPropertyString('hdcpLevel'), 'hdcp_level_max': self.crypto_session.GetPropertyString('maxHdcpLevel'), 'security_level': self.crypto_session.GetPropertyString('securityLevel') } g.LOCAL_DB.set_value('drm_system_id', drm_info['system_id'], TABLE_SESSION) common.debug('Widevine version: {}', drm_info['version']) if drm_info['system_id']: common.debug('Widevine CryptoSession system id: {}', drm_info['system_id']) else: common.warn('Widevine CryptoSession system id not obtained!') common.debug('Widevine CryptoSession security level: {}', drm_info['security_level']) common.debug('Widevine CryptoSession hdcp level from {} to {}', drm_info['hdcp_level'], drm_info['hdcp_level_max']) common.debug('Widevine CryptoSession algorithms: {}', self.crypto_session.GetPropertyString('algorithms'))
def __init__(self, kodi_helper): self.kodi_helper = kodi_helper self.keySetId = None self.keyId = None self.hmacKeyId = None try: self.cryptoSession = xbmcdrm.CryptoSession( 'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', 'AES/CBC/NoPadding', 'HmacSHA256') self.kodi_helper.log( msg='Widevine CryptoSession successful constructed') except: self.cryptoSession = None return self.systemId = self.cryptoSession.GetPropertyString('systemId') self.kodi_helper.log(msg='Widevine CryptoSession systemId:' + self.systemId) algorithms = self.cryptoSession.GetPropertyString('algorithms') self.kodi_helper.log(msg='Widevine CryptoSession algorithms:' + algorithms)