DRM

Android DRM HAL アイコン

このドキュメントでは、Android Digital Rights Management(DRM)フレームワークの概要と、DRM プラグインが実装する必要があるインターフェースについて説明します。DRM スキームによって定義される堅牢性ルールやコンプライアンス ルールについては説明しません。

フレームワーク

Android プラットフォームは、コンテンツに関連付けられたライセンス制約に従って、アプリが著作権で保護されたコンテンツを管理できる、拡張可能な DRM フレームワークを提供します。DRM フレームワークは多くの DRM スキームをサポートしています。デバイスがサポートする DRM スキームはデバイス メーカーによります。DRM フレームワークは、アプリケーション デベロッパーに統一インターフェースを提供し、DRM オペレーションの複雑さを軽減します。また、保護されたコンテンツと保護されていないコンテンツに対して一貫性のある操作モードを提供します。DRM スキームでは、ライセンス メタデータによって複雑な使用モデルを定義できます。DRM フレームワークは、DRM コンテンツとライセンス間の関連付けを提供し、著作権管理を扱います。これにより、DRM で保護されたコンテンツまたは保護されていないコンテンツからメディア プレーヤーを抽象化できます。保護されたメディア ストリームを復号化するための鍵を取得するクラスについては、MediaDrm をご覧ください。

Android DRM HAL
図 1. DRM ハードウェア抽象化レイヤ

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

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

アーキテクチャ

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

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

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

詳しくは、Android Media DRMAndroid Media 暗号化をご覧ください。

DRM プラグイン

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

プラグインでは、Binder 化された HAL を実装する必要があります。Binder 化された HAL は HAL インターフェース定義言語(HIDL)を使用します。これにより、HAL を再構築せずに Android フレームワークの置き換えができます。

プラグインはベンダーや SOC メーカーによってビルドされ、デバイスの /vendor パーティションに配置されます。Android 8.0 以降を搭載するすべてのデバイスでは、HIDL 言語で書かれた Binder 化された HAL をサポートする必要があります。

実装

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

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

新しい API は、iDrmPlugin.haliCryptoPlugin.hal で定義されています。

    PLATFORM_ROOT/hardware/interfaces/drm/VERSION/
    

デバイスのビルドファイルへのプラグイン サービスの追加

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

    
      PRODUCT_PACKAGES += \
        android.hardware.drm@1.0-impl \
        android.hardware.drm@1.0-service \
        android.hardware.drm@1.2-service.clearkey \
        android.hardware.drm@1.2-service.widevine
    
    

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

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

    
      <hal format="hidl">
        <name>android.hardware.drm</name>
          <transport>hwbinder</transport>
          <version>1.0</version>
          <interface>
            <name>ICryptoFactory</name>
            <instance>default</instance>
          </interface>
          <interface>
            <name>IDrmFactory</name>
            <instance>default</instance>
          </interface>
          <fqname>@1.2::ICryptoFactory/clearkey</fqname>
          <fqname>@1.2::IDrmFactory/clearkey</fqname>
          <fqname>@1.2::ICryptoFactory/widevine</fqname>
          <fqname>@1.2::IDrmFactory/widevine</fqname>
      </hal>
    
    

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@1\.2-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 に以下を追加します。
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
            allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
            

/vendor 下の .rc ファイルの作成

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

詳細については、Android Init 言語をご覧ください。

プラグインの実装

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

DRM プラグインの詳細

DRM プラグイン ベンダーは、DrmFactoryCryptoFactory、DRM プラグインを実装します。

DrmFactory

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

    Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
    

プラグイン ファクトリにより、特定の暗号化方式(UUID で指定)をサポートする DRM プラグインを構築できるかどうかが決定されます。

    Return<bool> isContentTypeSupported(const hidl_string &mimeType);
    

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

    Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
            const hidl_string& appPackageName, createPlugin_cb _hidl_cb);
    

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

CryptoFactory

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

    Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
    

暗号化ファクトリにより、特定の暗号化方式(UUID で指定)をサポートする暗号化プラグインを構築できるかどうかが決定されます。

    Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
            const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)
    

プラグイン ファクトリにより、特定の暗号化方式(UUID で指定)をサポートする暗号化プラグインを構築できるかどうかが決定されます。

DRM プラグイン

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