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')))
Exemple #2
0
    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'))
Exemple #4
0
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))
Exemple #5
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)