Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

DRM

Android DRM HAL アイコン

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

フレームワーク

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

Android DRM HAL
図 1a. Android 11 より前の DRM Hardware Abstraction Layer
Android DRM HAL ポスト R
図 1b. Android 11 以降の DRM Hardware Abstraction Layer

モバイル デバイスのユーザーにとって、リッチ デジタル コンテンツを利用できることは大切です。コンテンツを多機種で利用できるようにするには、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 フレームワーク
図 2a. Android 11 より前の DRM フレームワーク
Android DRM フレームワーク
図 2b. Android 11 以降の DRM フレームワーク

詳しくは、Android メディア DRMAndroid メディア暗号化をご覧ください。

DRM プラグイン

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

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

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

実装

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

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

API は、IDrmPlugin.halICryptoPlugin.halIDrmFactory.halICryptoFactory.hal の各バージョンで定義されています。

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

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

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

R / Android 11 では、バージョン 1.0 から 1.2 のサポートは終了しています。R にアップグレードするデバイスは、引き続きバージョン 1.0 から 1.2 を使用できます。ただし、R でリリースする新しいデバイスでは、バージョン 1.3 のみを使用する必要があります。


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

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

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


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

あるいは、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@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    または、次のようにバージョン番号を更新します。

    /vendor/bin/hw/android\.hardware\.drm@1\.3-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. ICryptoPluginIDrmPluginICryptoFactoryIDrmFactory を実装します。
  3. 新しい API をプラグインに実装します。

DRM プラグインの詳細

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

DrmFactory

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

IDrmFactory は、createPlugin API を介してベンダーの drm HAL とやり取りするためのメインのエントリ ポイントです。createPlugin API は、IDrmPlugin インスタンスの作成に使用されます。1.3 IDrmFactory は常に 1.2 IDrmPlugin インターフェースを作成する必要があり、これは 1.0 createPlugin メソッドを介して返されます。

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

1.3 IDrmFactory で新たに追加された getSupportedCryptoSchemes は、HIDL drm HAL インスタンスでサポートされている暗号化方式のリストを返します。

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 にあります。