DRM

Android DRM HAL simgesi

Bu sayfada, Android dijital hak yönetimi (DRM) çerçevesine genel bir bakış sunulmakta ve DRM eklentisinin uygulaması gereken arayüzler tanıtılmaktadır. Bu sayfada, bir DRM şeması tarafından tanımlanabilecek sağlamlık kuralları veya uygunluk kuralları açıklanmamaktadır.

Framework

Android platformu, uygulamaların haklarla korunan içeriği içerikle ilişkili lisans kısıtlamalarına göre yönetmesine olanak tanıyan genişletilebilir bir DRM çerçevesi sağlar. DRM çerçevesi birçok DRM şemasını destekler. Cihaz üreticisi, cihazın hangi DRM şemalarını destekleyeceğini belirler. DRM çerçevesi, uygulama geliştiriciler 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çerikler için tutarlı bir çalışma modu sağlar. DRM şemaları, lisans meta verileriyle 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 gerçekleştirir. Bu, medya oynatıcının DRM korumalı veya korumasız içerikten soyutlanmasını sağlar. Korunan medya akışlarının şifresini çözmek için anahtar elde etme sınıfı hakkında bilgi edinmek üzere MediaDrm sayfasına bakın.

Şekil 1'de Android 11'den önceki DRM donanım çıkarma katmanı, Şekil 2'de ise Android 11 ve sonraki sürümlerdeki katman gösterilmektedir:

Android DRM HAL

1. şekil. Android 11'den önceki DRM donanım soyutlama katmanı.

Android 11'den itibaren Android DRM HAL

Şekil 2. 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ştiricilerin ve dijital içerik yayıncılarının içeriklerini geniş kitlelere sunabilmeleri için Android ekosisteminde desteklenen tutarlı bir DRM uygulamasına ihtiyaçları vardır. Bu dijital içeriğin Android cihazlarda kullanılabilmesi ve tüm cihazlarda tutarlı en az bir DRM'nin bulunması için Google, uyumlu Android cihazlarda lisans ücreti olmadan DRM sağlar. DRM eklentisi, Android DRM çerçevesiyle entegre edilmiştir ve premium içerikleri ve kullanıcı kimlik bilgilerini güvenceye almak 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, güvenlik ve şifreleme anahtarlarının korunması için güven zinciri oluşturmak üzere donanım güvenli başlatma özelliğini 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. Tüm donanım platformları, yukarıdaki güvenlik ve içerik koruma özelliklerinin tamamını desteklemez. Güvenlik, yığında hiçbir zaman tek bir yerde 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 işlemek için yalıtılmış güvenli bir işletim sisteminin birleşimi, güvenli bir cihaz sağlamak için 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önetmek, lisans almak, cihazı sağlamak, 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çevesi API'si
  • Çeşitli DRM şemaları için hak yönetimi ve şifre çözme işlemlerini gerçekleştirmek üzere DRM eklentileri (aracıları) için bir arayüz sunan yerel kod DRM çerçevesi

Şekil 3'te Android 11'den önceki DRM çerçevesi, Şekil 4'te ise Android 11 ve sonraki sürümlerdeki çerçeve gösterilmektedir:

Android DRM çerçevesi

3.Şekil Android 11'den önceki DRM çerçevesi.

Android 11'den itibaren Android DRM çerçevesi

Şekil 4. Android 11'de DRM çerçevesi başlatılıyor.

Daha fazla bilgi için MediaDrm ve MediaCrypto konularına bakın.

DRM eklentileri

DRM çerçevesi, sistem başlatılırken HAL örneklerini ve hizmetlerini (.rc dosyalarında açıklanmıştır) tarar ve eklentileri keşfeder. Medya DRM sunucusu (mediadrmserver), hem CryptoHal hem de DrmHal nesnelerini oluşturur. CryptoHal ve DrmHal, ardından tedarikçiye özel uygulamalarla eklentileri çağırır.

Eklentiler, binderized HAL'leri uygulamalıdır. Binder'a dönüştürülmüş HAL'ler, Android Arayüz Tanımlama Dili (AIDL)'yi kullanır. Bu dil, HAL'leri yeniden oluşturmaya gerek kalmadan çerçevenin değiştirilmesine olanak tanır.

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

Uygulama

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

  1. Eklenti hizmetini cihazın derleme dosyalarına ekleyin.
  2. Cihaz manifest dosyasını güncelleyin.
  3. SELinux izinlerini ekleyin.
  4. /vendor altında .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/

Eklenti hizmetini cihaz derleme dosyalarına ekleme

Örneğin, AIDL arayüzü desteği eklemek için VENDOR DEVICE/device.mk dosyasında android.hardware.drm-service.* paketleri bulunmalıdır:

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

Cihaz manifest dosyasını 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>

Kararlı AIDL sürümü, 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 izinleri ekleme

  1. VENDOR DEVICE/sepolicy/vendor/file.te için izin ekleyin:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. VENDOR DEVICE/sepolicy/vendor/file_contexts için izin ekleyin:
        /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 için izin ekleyin:
        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 Init Language başlıklı makaleye bakın.

Eklentiyi uygulama

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

DRM eklentisi ayrıntıları

DRM eklentisi sağlayıcıları DrmFactory, CryptoFactory ve DRM eklentisini uygular.

DrmFactory sınıfı

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

IDrmFactory, createPlugin yöntemiyle bir satıcının DRM HAL'siyle etkileşim kurmak için kullanılan ana giriş noktasıdır. IDrmPlugin örnekleri oluşturmak için bu yöntemi kullanın.

::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. Bu sıra, eklenti fabrikasının UUID ile belirtilen belirli bir kripto şemasını destekleyen DRM eklentileri oluşturup oluşturamayacağını belirler:

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

Bu sıra, 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 isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

Bu sıra, UUID ile belirtilen kripto şeması için bir DRM eklentisi oluşturur:

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

CryptoFactory sınıfı

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

Bu sıra, kripto fabrikasının UUID ile belirtilen belirli bir kripto şemasını destekleyen kripto eklentileri oluşturup oluşturamayacağını belirler:

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

Bu sıra, eklenti fabrikasının bir 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);

DRM eklentisi API'leri

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