DRM

Android DRM HAL 아이콘

이 문서에서는 Android 디지털 저작권 관리(DRM) 프레임워크를 간략하게 설명하며 DRM 플러그인이 구현해야 하는 인터페이스를 소개합니다. DRM 스키마에서 정의할 수 있는 견고성 규칙 또는 규정 준수 규칙을 설명하지는 않습니다.

프레임워크

Android 플랫폼은 앱이 콘텐츠와 관련된 라이선스 제한에 따라 저작권으로 보호되는 콘텐츠를 관리할 수 있는 확장 가능한 DRM 프레임워크를 제공합니다. DRM 프레임워크는 많은 DRM 스키마를 지원하며 기기가 지원하는 DRM 스키마는 기기 제조업체에 달려 있습니다. DRM 프레임워크는 애플리케이션 개발자를 위한 통합 인터페이스를 제공하며 DRM 작업의 복잡성을 숨깁니다. DRM 프레임워크는 보호되는 콘텐츠와 보호되지 않는 콘텐츠에 일관된 작동 모드를 제공합니다. DRM 스키마는 라이선스 메타데이터별로 복잡한 사용 모델을 정의할 수 있습니다. DRM 프레임워크는 DRM 콘텐츠와 라이선스를 연결하고 저작권 관리를 처리합니다. 이렇게 하면 DRM으로 보호되는 콘텐츠나 보호되지 않는 콘텐츠에서 미디어 플레이어를 추출할 수 있습니다. 보호되는 미디어 스트림을 복호화하기 위해 클래스에서 키를 얻으려면 MediaDrm을 참조하세요.

Android DRM HAL
그림 1. DRM 하드웨어 추상화 계층

리치 디지털 콘텐츠의 사용 가능 여부는 휴대기기 사용자에게 중요합니다. 콘텐츠가 광범위하게 제공되려면 Android 개발자와 디지털 콘텐츠 게시자에게는 Android 생태계 전반에서 지원되는 일관된 DRM 구현이 필요합니다. Android 기기에서 디지털 콘텐츠를 사용하고 모든 기기에서 하나 이상의 일관된 DRM을 사용할 수 있도록, Google은 호환 가능한 Android 기기에 라이선스 비용을 부과하지 않고 DRM을 제공합니다. DRM 플러그인은 Android DRM 프레임워크와 통합되어 하드웨어 지원 보호를 사용하여 프리미엄 콘텐츠와 사용자 인증 정보를 보호할 수 있습니다.

DRM 플러그인에서 제공하는 콘텐츠 보호는 기본 하드웨어 플랫폼의 보안 및 콘텐츠 보호 기능에 따라 다릅니다. 기기의 하드웨어 기능에는 보안의 신뢰 체인과 암호화 키의 보호를 설정하는 하드웨어 안전한 부팅이 포함되어야 합니다. 기기의 콘텐츠 보호 기능에는 기기의 복호화된 프레임 보호 및 신뢰할 수 있는 출력 보호 메커니즘을 통한 콘텐츠 보호가 포함되어야 합니다. 모든 하드웨어 플랫폼이 위의 보안 및 콘텐츠 보호 기능을 모두 지원하는 것은 아닙니다. 보안은 스택의 단일 위치에서 구현되는 것이 아니라 하드웨어, 소프트웨어 및 서비스에서 모두 통합되어 구현되어야 합니다. 하드웨어 보안 기능, 신뢰할 수 있는 부팅 메커니즘 및 보안 기능을 처리하기 위한 격리된 보안 OS는 모두 안전한 기기를 제공하는 데 큰 영향을 줍니다.

건축

DRM 프레임워크는 구현과 무관하게 설계되었으며 스키마별 DRM 플러그인의 특정 DRM 스키마 구현 세부정보를 추상화합니다. DRM 프레임워크에는 복잡한 DRM 작업을 처리하고 라이선스를 취득하며 기기를 프로비저닝하고 DRM 콘텐츠와 라이선스를 연결하고 마지막으로 DRM 콘텐츠를 복호화하는 간단한 API가 포함됩니다.

Android DRM 프레임워크는 두 가지 아키텍처 레이어로 구현됩니다.

  • DRM 프레임워크 API: Android 애플리케이션 프레임워크를 통해 앱에 노출됩니다.
  • 네이티브 코드 DRM 프레임워크: DRM 플러그인(에이전트)의 인터페이스를 노출하여 다양한 DRM 스키마의 저작권 관리 및 복호화를 처리합니다.
Android DRM 프레임워크
그림 2. DRM 프레임워크

자세한 내용은 Android 미디어 DRMAndroid 미디어 Crypto를 참조하세요.

DRM 플러그인

시스템 시작 시 DRM 프레임워크가 HAL 인스턴스/서비스(.rc 파일에 설명되어 있음)를 스캔하고 플러그인이 HIDL 레지스트리를 통해 검색됩니다. 미디어 DRM 서버(mediadrmserver)는 CryptoHalDrmHal 개체를 만듭니다. 그런 다음 CryptoHalDrmHal은 공급업체별 구현을 사용하여 플러그인을 호출합니다.

플러그인은 바인더화 HAL을 구현해야 합니다. 바인더화 HAL은 HAL을 다시 빌드하지 않아도 프레임워크를 대체할 수 있는 HAL 인터페이스 정의 언어(HIDL)를 사용합니다.

플러그인은 공급업체나 SoC 제조업체에서 만들고 기기의 /vendor 파티션에 배치됩니다. Android 8.0 이상을 실행하는 모든 기기는 HIDL 언어로 작성된 바인더화 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 플러그인 공급업체는 DrmFactory, CryptoFactory 및 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에서 찾을 수 있습니다.