DRM

Android DRM HAL simgesi

Bu belgede, Android dijital hak yönetimi (DRM) çerçevesine genel bir bakış sunulmakta ve DRM eklentisinin uygulamak zorunda olduğu arayüzler tanıtılmaktadır. Bu dokümanda, bir DRM şemasıyla tanımlanabilecek dayanıklılık kuralları veya uygunluk kuralları açıklanmamaktadır.

Çerçeve

Android platformu, uygulamaların telif hakkıyla korunan içeriği içerikle ilişkili lisans kısıtlamalarına göre yönetmesini sağlayan, genişletilebilir bir DRM çerçevesi sunar. DRM çerçevesi birçok DRM şemasını destekler. Bir cihazın hangi DRM şemalarını destekleyeceği cihaz üreticisine bağlıdır. DRM çerçevesi, uygulama geliştiricileri için birleştirilmiş bir arayüz sağlar ve DRM işlemlerinin karmaşıklığını gizler. DRM çerçevesi, korumalı ve korumasız içerikler için tutarlı bir çalışma modu sağlar. DRM şemaları, lisans meta verilerine göre karmaşık kullanım modelleri tanımlayabilir. DRM çerçevesi, DRM içeriği ile lisans arasındaki ilişkiyi sağlar ve hak yönetimini yönetir. Bu sayede medya oynatıcının DRM korumalı veya korumasız içeriklerden soyutlanması sağlanır. Korunan medya akışlarının şifresini çözmek için anahtar elde etmek üzere MediaDrm sınıfına bakın.

Android DRM HAL
Şekil 1a. DRM donanım soyutlama Android 11'den önceki 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. Android geliştiricilerinin ve dijital içerik yayıncılarının, içeriklerini geniş bir kitleye sunmak için Android ekosisteminde desteklenen tutarlı bir DRM uygulamasına ihtiyacı vardır. Google, bu dijital içeriği Android cihazlarda kullanıma sunmak ve tüm cihazlarda en az bir tutarlı DRM'nin bulunduğundan emin olmak için uyumlu Android cihazlarda lisans ücreti olmadan DRM sağlar. DRM eklentisi Android DRM çerçevesine entegre edilmiştir ve birinci sınıf içeriği ve kullanıcı kimlik bilgilerini korumak için donanım destekli korumayı kullanabilir.

DRM eklentisi tarafından sağlanan içerik koruması, temel donanım platformunun güvenlik ve içerik koruma özelliklerine bağlıdır. Cihazın donanım özellikleri, şifreleme anahtarlarının güvenliği ve korunması için bir güven zinciri oluşturmak üzere donanımla güvenli başlatmayı içermelidir. Cihazın içerik koruma özellikleri, cihazdaki şifresi çözülmüş çerçevelerin korunmasını ve güvenilir bir çıkış koruma mekanizması aracılığıyla içerik korumasını içermelidir. Yukarıdaki güvenlik ve içerik koruma özelliklerinin tümünü bazı donanım platformları desteklemez. Güvenlik hiçbir zaman yığının tek bir yerine uygulanmaz. Bunun yerine donanım, yazılım ve hizmetlerin entegrasyonuna dayanır. Donanım güvenlik işlevleri, güvenilir bir başlatma mekanizması ve güvenlik işlevlerini yürütmek için izole edilmiş güvenli bir işletim sisteminin bir arada kullanılması, güvenli bir cihaz sunmak için çok önemlidir.

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 özel bir DRM eklentisinde soyutlar. DRM çerçevesi, karmaşık DRM işlemlerini gerçekleştirmek, lisans edinmek, cihazı temel hazırlığı yapmak, 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 uygulanmıştır:

  • Android uygulama çerçevesi aracılığıyla uygulamalara sunulan bir DRM çerçevesi API'si.
  • Çeşitli DRM şemalarında hak yönetimini ve şifre çözmeyi yönetmek için DRM eklentileri (araçlar) için bir arayüz sunan doğal kod DRM çerçevesi.
Android DRM Çerçevesi
Şekil 2a. Android 11'den önceki DRM çerçevesi
Android DRM Çerçevesi
Şekil 2b. Android 11'den itibaren DRM çerçevesi

Daha fazla ayrıntı için Android Media DRM ve Android Media Crypto sayfalarına göz atın.

DRM eklentileri

DRM çerçevesi, sistem başlatılırken HAL örneklerini/hizmetlerini (.rc dosyalarında açıklanır) tarar ve eklentiler bulunur. Medya DRM Sunucusu (mediadrmserver) hem CryptoHal hem de DrmHal nesnelerini oluşturur. Ardından CryptoHal ve DrmHal, tedarikçiye özel uygulamalarla eklentileri çağırır.

Eklentiler, bağlayıcı HAL'leri uygulamalıdır. Bağlayıcılı HAL'ler, Android Arayüz Tanımlama Dili'ni (AIDL) kullanır. Bu sayede, HAL'leri yeniden oluşturmak zorunda kalmadan çerçevenin değiştirilmesi sağlanır.

Eklentiler, satıcılar veya SOC üreticileri tarafından oluşturulur ve cihazdaki bir /vendor bölümüne yerleştirilir. Android 13 veya sonraki sürümlerle kullanıma sunulan tüm cihazlar, AIDL dilinde yazılmış birleştirilmiş HAL'leri desteklemelidir.

Uygulama

Android 13 için GMS ve AOSP cihaz sürümü, AIDL arayüzünü kullanmalıdır.

Yeni DRM çerçevesi API'lerini bir eklenti aracılığıyla uygulamak için:

  1. Cihazın derleme dosyalarına eklenti hizmeti ekleyin.
  2. Cihaz manifest dosyasını güncelleyin.
  3. SELinux izinleri 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'ın her sürümünde tanımlanır.

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Cihaz derleme dosyalarına eklenti hizmeti ekleme

Ö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 manifest dosyasını güncelleme

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>

STABLE AIDL VERSION, her AIDL API sürümünün sürüm numarasıdır (ör. 1, 2). Alternatif olarak vintf_fragments kullanmanızı öneririz.

SELinux izinleri ekleme

  1. Şuraya ekle: VENDOR DEVICE/sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. VENDOR DEVICE/sepolicy/vendor/file_contexts
    'e 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
    'e 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 yapılacak işlemleri belirtir.

Ayrıntılar için Android İlk Dil başlıklı makaleye bakın.

Eklentiyi uygulama

  1. Eklenti hizmetinin service.cpp bölümünde main() giriş noktasını uygulayın.
  2. ICryptoPlugin, IDrmPlugin, ICryptoFactory ve IDrmFactory özelliklerini uygulayın.
  3. Yeni API'leri eklentiye uygulayın.

DRM eklentisi ayrıntıları

DRM eklentisi tedarikçileri 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 şemasını destekleyen karşılık gelen eklentileri oluşturur.

IDrmFactory, createPlugin API aracılığıyla bir tedarikçinin drm HAL'iyle etkileşime geçmenin 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 şemalarının 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, UUID ile belirtilen belirli bir kripto şemasını 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 ile belirtilen şifreleme şeması için bir DRM eklentisi oluşturur.

CryptoFactory

CryptoHal sınıfı, kayıtlı DRM eklenti hizmetlerini arar ve CryptoFactory sınıfı aracılığıyla belirli bir kripto şemasını destekleyen karşılık gelen eklentileri oluşturur.

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

Kripto fabrikasının, UUID ile belirtilen belirli bir kripto şemasını 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, UUID ile belirtilen belirli bir şifreleme şemasını 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 adresinde tanımlanmıştır. İlgili IDrmPlugin.h dosyası, derlemeden sonra out/Soong klasöründe bulunabilir.