DRM、DRM

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。
Android DRM HAL アイコン

このドキュメントでは、Android デジタル著作権管理 (DRM) フレームワークの概要を説明し、DRM プラグインが実装する必要があるインターフェイスを紹介します。このドキュメントでは、DRM スキームによって定義される可能性がある堅牢性ルールまたはコンプライアンス ルールについては説明しません。

フレームワーク

Android プラットフォームは、コンテンツに関連付けられたライセンスの制約に従って、アプリが権利保護されたコンテンツを管理できるようにする拡張可能な DRM フレームワークを提供します。 DRM フレームワークは、多くの DRM スキームをサポートしています。デバイスがサポートする DRM スキームは、デバイスの製造元によって異なります。 DRM フレームワークは、アプリケーション開発者に統一されたインターフェイスを提供し、DRM 操作の複雑さを隠します。 DRM フレームワークは、保護されたコンテンツと保護されていないコンテンツに対して一貫した操作モードを提供します。 DRM スキームは、ライセンス メタデータによって複雑な使用モデルを定義できます。 DRM フレームワークは、DRM コンテンツとライセンス間の関連付けを提供し、権利管理を処理します。これにより、DRM で保護されたコンテンツまたは保護されていないコンテンツからメディア プレーヤーを抽象化できます。保護されたメディア ストリームを復号化するためのキーを取得するクラスについては、 MediaDrmを参照してください。

Android DRM HAL
図 1a。 DRM ハードウェア抽象化 Android 11 より前のレイヤー
Android DRM HAL ポスト R
図 1b。 Android 11 以降の DRM ハードウェア抽象化レイヤー

豊富なデジタル コンテンツを利用できることは、モバイル デバイスのユーザーにとって重要です。コンテンツを広く利用できるようにするために、Android デベロッパーとデジタル コンテンツ パブリッシャーは、Android エコシステム全体でサポートされる一貫した DRM 実装を必要としています。そのデジタル コンテンツを Android デバイスで利用できるようにし、すべてのデバイスで少なくとも 1 つの一貫した DRM を利用できるようにするために、Google は互換性のある Android デバイスでライセンス料なしで DRM を提供しています。 DRM プラグインは Android DRM フレームワークと統合されており、ハードウェアに支えられた保護を使用して、プレミアム コンテンツとユーザー資格情報を保護できます。

DRM プラグインによって提供されるコンテンツ保護は、基盤となるハードウェア プラットフォームのセキュリティおよびコンテンツ保護機能に依存します。デバイスのハードウェア機能には、セキュリティの信頼チェーンと暗号化キーの保護を確立するためのハードウェア セキュア ブートが含まれている必要があります。デバイスのコンテンツ保護機能には、デバイス内の復号化されたフレームの保護と、信頼できる出力保護メカニズムによるコンテンツ保護が含まれている必要があります。すべてのハードウェア プラットフォームが上記のセキュリティおよびコンテンツ保護機能をすべてサポートしているわけではありません。セキュリティはスタック内の単一の場所に実装されることはなく、ハードウェア、ソフトウェア、およびサービスの統合に依存しています。ハードウェア セキュリティ機能、トラステッド ブート メカニズム、およびセキュリティ機能を処理するための分離された安全な OS の組み合わせは、安全なデバイスを提供するために重要です。

建築

DRM フレームワークは、実装に依存しないように設計されており、スキーム固有の DRM プラグインで特定の DRM スキーム実装の詳細を抽象化します。 DRM フレームワークには、複雑な DRM 操作を処理し、ライセンスを取得し、デバイスをプロビジョニングし、DRM コンテンツとそのライセンスを関連付け、最終的に DRM コンテンツを復号化するためのシンプルな API が含まれています。

Android DRM フレームワークは、次の 2 つのアーキテクチャ レイヤーで実装されます。

  • Android アプリケーション フレームワークを介してアプリに公開される DRM フレームワーク API。
  • ネイティブ コードの DRM フレームワーク。DRM プラグイン (エージェント) のインターフェイスを公開して、さまざまな DRM スキームの権利管理と復号化を処理します。
Android DRM フレームワーク
図 2a。 Android 11 より前の DRM フレームワーク
Android DRM フレームワーク
図 2b。 Android 11 以降の DRM フレームワーク

詳細については、 Android Media DRMAndroid Media Cryptoを参照してください。

DRM プラグイン

システムの起動時に、DRM フレームワークは HAL インスタンス/サービス ( .rcファイルに記述) をスキャンし、プラグインが検出されます。メディア DRM サーバー ( mediadrmserver ) は、 CryptoHalオブジェクトとDrmHalオブジェクトの両方を作成します。その後、 CryptoHalDrmHalは、ベンダー固有の実装でプラグインを呼び出します。

プラグインは、バインドされた HAL を実装する必要があります。バインダ化された HAL はAndroid Interface Definition Language (AIDL)を使用します。これにより、HAL を再構築することなくフレームワークを置き換えることができます。

プラグインはベンダーまたは SOC メーカーによって構築され、デバイスの/vendorパーティションに配置されます。 Android 13 以降で起動するすべてのデバイスは、AIDL 言語で記述されたバインダ化された HAL をサポートする必要があります。

実装

Android 13 用の GMS および AOSP デバイス リリースでは、AIDL インターフェースを使用する必要があります。

プラグインで新しい DRM フレームワーク API を実装するには:

  1. プラグイン サービスをデバイスのビルド ファイルに追加します。
  2. デバイス マニフェストを更新します。
  3. SELinux パーミッションを追加します。
  4. /vendorの下に.rcファイルを作成します。
  5. プラグインを実装します。

API はIDrmPlugin.aidlICryptoPlugin.aidlIDrmFactory.aidl 、およびICryptoFactory.aidlの各バージョンで定義されています。

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

プラグイン サービスをデバイス ビルド ファイルに追加する

たとえば、AIDL インターフェイス サポートを追加するには、 VENDOR DEVICE /device.mkファイルにandroid.hardware.drm-service.*パッケージを含める必要があります。


  PRODUCT_PACKAGES += \
    android.hardware.drm-service.clearkey \
    android.hardware.drm-service.widevine

デバイス マニフェストの更新

デバイスのvendor manifest.xmlファイルには、次のエントリが含まれている必要があります。

  <hal format="aidl">
    <name>android.hardware.drm</name>
    <version>STABLE AIDL VERSION</version>
      <fqname>ICryptoFactory/clearkey</fqname>
      <fqname>IDrmFactory/clearkey</fqname>
      <fqname>ICryptoFactory/widevine</fqname>
      <fqname>IDrmFactory/widevine</fqname>
  </hal>

STABLE AIDL VERSION は、各 AIDL API リリースのバージョン番号です (例: 1、2)。または、 vintf_fragments を使用することをお勧めします。

SELinux パーミッションの追加

  1. VENDOR DEVICE /sepolicy/vendor/file.teに追加
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. ベンダー デバイスに追加VENDOR DEVICE /sepolicy/vendor/file_contexts
        /vendor/bin/hw/android\.hardware\.drm-service\.clearkey  u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0
  3. device/sepolicy/vendor/hal_drm_clearkey.teに追加
        vndbinder_use(hal_drm_clearkey)
        allow hal_drm_clearkey servicemanager:binder { call transfer };
        allow hal_drm_clearkey hal_drm_service:service_manager add;
        allow hal_drm_clearkey { appdomain -isolated_app }:fd use;
        get_prop(ramdump, public_vendor_default_prop)
        

/vendor の下に .rc ファイルを作成する

.rcファイルは、サービスの起動時に実行するアクションを指定します。

詳細については、 Android Init 言語を参照してください。

プラグインの実装

  1. プラグイン サービスのservice.cppmain()エントリ ポイントを実装します。
  2. ICryptoPluginIDrmPluginICryptoFactory 、およびIDrmFactoryを実装します。
  3. プラグインに新しい API を実装します。

DRM プラグインの詳細

DRM プラグイン ベンダーは、 DrmFactoryCryptoFactory 、および DRM プラグインを実装しています。

DrmFactory

DrmHalクラスは、登録された DRM プラグイン サービスを検索し、 DrmFactoryクラスを介して特定の暗号方式をサポートする対応するプラグインを構築します。

IDrmFactory は、createPlugin API を介してベンダーの drm HAL と対話するためのメイン エントリ ポイントです。 createPlugin API は、IDrmPlugin インスタンスを作成するために使用されます。

::ndk::ScopedAStatus getSupportedCryptoSchemes(
    std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);

getSupportedCryptoSchemes は、AIDL drm HAL インスタンスでサポートされている暗号スキームのリストを返します。

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::string& in_mimeType,
    ::aidl::android::hardware::drm::SecurityLevel in_securityLevel,
    bool* _aidl_return);

プラグイン ファクトリが、UUID で指定された特定の暗号スキームをサポートする DRM プラグインを構築できるかどうかを決定します。

::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

プラグイン ファクトリが、 mimeTypeで指定された特定のメディア コンテナー形式をサポートする DRM プラグインを構築できるかどうかを決定します。

::ndk::ScopedAStatus createPlugin(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::string& in_appPackageName,
    std::shared_ptr<::aidl::android::hardware::drm::IDrmPlugin>* _aidl_return);

UUID で指定された暗号方式の DRM プラグインを構築します。

クリプトファクトリー

CryptoHalクラスは、登録された DRM プラグイン サービスを検索し、 CryptoFactoryクラスを通じて特定の暗号スキームをサポートする対応するプラグインを構築します。

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

暗号ファクトリが、UUID で指定された特定の暗号スキームをサポートする暗号プラグインを構築できるかどうかを決定します。

::ndk::ScopedAStatus createPlugin(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    const std::vector<uint8_t>& in_initData,
    std::shared_ptr<::aidl::android::hardware::drm::ICryptoPlugin>* _aidl_return);

プラグイン ファクトリが、UUID で指定された特定の暗号スキームをサポートする暗号プラグインを構築できるかどうかを決定します。

DRM プラグイン API

API はhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidlで定義されています。対応するIDrmPlugin.hファイルは、ビルド後に out/Soong にあります。