DRM

Android DRM HAL simgesi

Bu belge, Android dijital haklar yönetimi (DRM) çerçevesine genel bir bakış sağlar ve bir DRM eklentisinin uygulaması gereken arayüzleri tanıtır. Bu belge, bir DRM şeması tarafından tanımlanabilecek sağlamlık kurallarını veya uyumluluk kurallarını açıklamaz.

Çerçeve

Android platformu, uygulamaların içerikle ilişkili lisans kısıtlamalarına göre haklarla korunan içeriği yönetmesine olanak tanıyan genişletilebilir bir DRM çerçevesi sağlar. DRM çerçevesi birçok DRM şemasını destekler; Bir aygıtın hangi DRM şemalarını desteklediği aygıt üreticisine bağlıdır. DRM çerçevesi, uygulama geliştiricileri için birleşik bir arayüz sağlar ve DRM işlemlerinin karmaşıklığını gizler. DRM çerçevesi, korumalı ve korumasız içerik için tutarlı bir çalışma modu sağlar. DRM şemaları, karmaşık kullanım modellerini lisans meta verilerine göre tanımlayabilir. DRM çerçevesi, DRM içeriği ile lisans arasındaki ilişkiyi sağlar ve hak yönetimini yönetir. Bu, medya oynatıcının DRM korumalı veya korumasız içerikten çıkarılmasını sağlar. Korumalı medya akışlarının şifresini çözmeye yönelik anahtarları edinmek üzere sınıf için MediaDrm'e bakın.

Android DRM HAL
Şekil 1a. Android 11 öncesi DRM donanım soyutlama katmanı
Android DRM HAL sonrası R
Şekil 1b. Android 11'den itibaren DRM donanım soyutlama katmanı

Zengin dijital içeriğin kullanılabilirliği, mobil cihaz kullanıcıları için önemlidir. İçeriklerini geniş çapta kullanılabilir hale getirmek için Android geliştiricileri ve dijital içerik yayıncılarının, Android ekosistemi genelinde desteklenen tutarlı bir DRM uygulamasına ihtiyacı var. Bu dijital içeriğin Android cihazlarda kullanılabilmesini sağlamak ve tüm cihazlarda en az bir tutarlı DRM'nin mevcut olmasını sağlamak için Google, uyumlu Android cihazlarda lisans ücreti olmadan DRM sağlar. DRM eklentisi, Android DRM çerçevesiyle entegredir ve premium içeriğin ve kullanıcı kimlik bilgilerinin güvenliğini sağlamak için donanım destekli korumayı kullanabilir.

DRM eklentisinin sağladığı içerik koruması, temel donanım platformunun güvenlik ve içerik koruma özelliklerine bağlıdır. Cihazın donanım özellikleri, kriptografik anahtarların güvenliği ve korunması konusunda bir güven zinciri oluşturmak için donanım güvenli önyüklemeyi içermelidir. Cihazın içerik koruma yetenekleri, cihazdaki şifresi çözülmüş çerçevelerin korunmasını ve güvenilir bir çıkış koruma mekanizması yoluyla içerik korumasını içermelidir. Donanım platformlarının tümü yukarıdaki güvenlik ve içerik koruma özelliklerinin tamamını desteklemez. Güvenlik hiçbir zaman yığında tek bir yerde uygulanmaz; bunun yerine donanım, yazılım ve hizmetlerin entegrasyonuna dayanır. Donanım güvenliği işlevlerinin, güvenilir bir önyükleme mekanizmasının ve güvenlik işlevlerini yönetmek için izole edilmiş güvenli bir işletim sisteminin birleşimi, güvenli bir cihaz sağlamak açısından kritik öneme sahiptir.

Mimari

DRM çerçevesi, uygulamadan bağımsız olacak şekilde tasarlanmıştır ve belirli DRM şeması uygulamasının ayrıntılarını şemaya özgü bir DRM eklentisinde özetler. DRM çerçevesi, karmaşık DRM işlemlerini yürütmek, lisansları almak, cihazı hazırlamak, DRM içeriğini ve lisansını ilişkilendirmek ve son olarak DRM içeriğinin şifresini çözmek için basit API'ler içerir.

Android DRM çerçevesi iki mimari katmanda uygulanır:

  • Android uygulama çerçevesi aracılığıyla uygulamalara sunulan bir DRM çerçeve API'si.
  • Çeşitli DRM şemaları için hak yönetimini ve şifre çözmeyi yönetmek üzere DRM eklentilerine (aracılar) yönelik bir arayüz ortaya çıkaran yerel kodlu bir DRM çerçevesi.
Android DRM Çerçevesi
Şekil 2a. Android 11'den önceki DRM çerçevesi
Android DRM Çerçevesi
Şekil 2b. Android 11'de başlayan DRM çerçevesi

Daha fazla ayrıntı için Android Media DRM ve Android Media Crypto'ya bakın.

DRM eklentileri

Sistem başlangıcında, DRM çerçevesi HAL örneklerini/hizmetlerini ( .rc dosyalarında açıklanmıştır) tarar ve eklentiler keşfedilir. Medya DRM Sunucusu ( mediadrmserver ) hem CryptoHal hem de DrmHal nesneleri oluşturur. CryptoHal ve DrmHal daha sonra eklentileri satıcıya özel uygulamalarla çağırır.

Eklentiler bağlayıcı hale getirilmiş HAL'leri uygulamalıdır. Bağlayıcı hale getirilmiş HAL'ler, çerçevenin HAL'leri yeniden oluşturmaya gerek kalmadan değiştirilmesine olanak tanıyan Android Arayüz Tanımlama Dili'ni (AIDL) kullanır.

Eklentiler satıcılar veya SOC oluşturucular tarafından oluşturulur ve cihazda bir /vendor bölümüne yerleştirilir. Android 13 veya üzeri sürümlerle başlatılan tüm cihazların, AIDL dilinde yazılmış ciltlenmiş HAL'leri desteklemesi gerekir.

Uygulama

Android 13 için yayınlanan GMS ve AOSP cihazlarının AIDL arayüzünü kullanması gerekir.

Yeni DRM çerçeveleri API'lerini bir eklentiyle uygulamak için:

  1. Cihazın derleme dosyalarına eklenti hizmeti ekleyin.
  2. Cihaz bildirimini güncelleyin.
  3. SELinux izinlerini ekleyin.
  4. /vendor altında bir .rc dosyası oluşturun.
  5. Eklentiyi uygulayın.

API'ler IDrmPlugin.aidl , ICryptoPlugin.aidl , IDrmFactory.aidl ve ICryptoFactory.aidl sürümlerinin her birinde tanımlanmıştır.

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Cihaz derleme dosyalarına eklenti hizmeti ekleyin

Örneğin, AIDL arayüz desteği eklemek için VENDOR DEVICE /device.mk dosyasının android.hardware.drm-service.* paketlerini içermesi gerekir:


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

Cihaz bildirimini güncelleyin

Cihazın vendor manifest.xml dosyası aşağıdaki girişleri içermelidir:

  <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>

KARARLI AIDL VERSİYONU, her AIDL API sürümünün sürüm numarasıdır (örneğin 1, 2). Alternatif olarak vintf_fragments kullanmanızı öneririz.

SELinux izinlerini ekleyin

  1. VENDOR DEVICE /sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. VENDOR DEVICE /sepolicy/vendor/file_contexts ekle
        /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 ekle
        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 altında bir RC dosyası oluşturun

.rc dosyası, bir hizmet başlatıldığında gerçekleştirilecek eylemleri belirtir.

Ayrıntılar için Android Başlangıç ​​Dili konusuna bakın.

Eklentiyi uygulayın

  1. Eklenti hizmetinin service.cpp dosyasındaki main() giriş noktasını uygulayın.
  2. ICryptoPlugin , IDrmPlugin , ICryptoFactory ve IDrmFactory uygulayın.
  3. Yeni API'leri eklentiye uygulayın.

DRM eklentisi ayrıntıları

DRM eklentisi satıcıları DrmFactory , CryptoFactory ve DRM eklentisini uygular.

DrmFactory

DrmHal sınıfı, kayıtlı DRM eklenti hizmetlerini arar ve DrmFactory sınıfı aracılığıyla belirli bir kripto düzenini destekleyen ilgili eklentileri oluşturur.

IDrmFactory, createPlugin API aracılığıyla satıcının drm HAL'iyle etkileşim kurmak için ana giriş noktasıdır. createPlugin API'si, IDrmPlugin örnekleri oluşturmak için kullanılır.

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

getSupportedCryptoSchemes, AIDL drm HAL örneği için desteklenen kripto düzenlerinin bir listesini döndürür.

::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);

Eklenti fabrikasının, bir UUID tarafından belirtilen belirli bir kripto düzenini destekleyen DRM eklentileri oluşturup oluşturamayacağını belirler.

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

Eklenti fabrikasının, mimeType tarafından belirtilen belirli bir medya kapsayıcı biçimini destekleyen DRM eklentileri oluşturup oluşturamayacağını belirler.

::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 tarafından belirtilen kripto şeması için bir DRM eklentisi oluşturur.

Kripto Fabrikası

CryptoHal sınıfı, kayıtlı DRM eklenti hizmetlerini arar ve CryptoFactory sınıfı aracılığıyla belirli bir kripto düzenini destekleyen ilgili eklentileri oluşturur.

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

Kripto fabrikasının, bir UUID tarafından belirtilen belirli bir kripto düzenini destekleyen kripto eklentileri oluşturup oluşturamayacağını belirler.

::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);

Eklenti fabrikasının, bir UUID tarafından belirtilen belirli bir kripto düzenini destekleyen kripto eklentileri oluşturup oluşturamayacağını belirler.

DRM eklentisi API'leri

API'ler hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl konumunda tanımlanır. İlgili IDrmPlugin.h dosyası derlemeden sonra out/Soong'da bulunabilir.