Slide 1

Slide 1 text

DRM × Android wasabeef Shibuya.apk #16

Slide 2

Slide 2 text

About me 降矢 大地 (Daichi Furiya) Google Developer Expert AbemaTV, Inc. (SF branch) @wasabeef_jp wasabeef

Slide 3

Slide 3 text

DRM ?

Slide 4

Slide 4 text

Wikiによると… デジタル著作権管理 (Digital Rights Management) とは、電子機器上のコンテンツ (映画や音楽、小 説など) の無制限な利用を防ぐための技術の総 称である。 DRM ?

Slide 5

Slide 5 text

DRM Technology

Slide 6

Slide 6 text

Microsoft PlayReady Google Widevine (Modular / Classic) Apple FairPlay Streaming DRM Technology

Slide 7

Slide 7 text

DRM Technology PlayReady Widevine (M) Widevine (C) FairPlay Android (4.3+) ✕ ◯ ◯ ✕ Android (3+) ✕ ✕ ◯ ✕ iOS (6+) ✕ ✕ ✕ ◯ Windows Phone ◯ ✕ ✕ ✕ Chromecast ◯ ◯ ✕ ✕ Android TV ◯ ◯ ✕ ✕ Apple TV ✕ ✕ ✕ ◯ Fire TV ◯ ◯ ✕ ✕

Slide 8

Slide 8 text

PlayReady

Slide 9

Slide 9 text

Android TV only HLS, MPEG-DASH Security Level (SL2000 / SL3000)
 Software Protection (TextureView, SurfaceView) PlayReady

Slide 10

Slide 10 text

Widevine

Slide 11

Slide 11 text

Android 4.3+ (Modular) MPEG-DASH (CENC は Android 4.4+) Security Level (L1 / L2 / L3)
 Hardware Protection (SurfaceView) Widevine

Slide 12

Slide 12 text

Widevine E com.google.android.exoplayer2.ExoPlaybackException E at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.throwDecoderInitError(MediaCodecRenderer.java:380) E at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:367) E at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:796) E at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:365) E at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:494) E at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:479) E at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:308) E at android.os.Handler.dispatchMessage(Handler.java:98) E at android.os.Looper.loop(Looper.java:154) E at android.os.HandlerThread.run(HandlerThread.java:61) E Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer: Decoder init failed: OMX.qcom.video.decoder.avc.secure, Format(1, null, video/avc, 772315, null, [320, 142, 24.0], [-1, -1]) E ... 9 more E Caused by: android.media.MediaCodec$CodecException: start failed E at android.media.MediaCodec.native_start(Native Method) E at android.media.MediaCodec.start(MediaCodec.java:1991) E at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:359) E ... 8 more

Slide 13

Slide 13 text

Widevine L1 を利用しようとしている のに SurfaceView が使われておらず、 TextureView で Software Decode し ようとしている。 MediaCodec$CodecException

Slide 14

Slide 14 text

Security Level

Slide 15

Slide 15 text

TrustZone & TEE

Slide 16

Slide 16 text

ARM社のセキュリテイ技術 Normal World と Secure World の実行環境が分 かれている Normal World から Secure World へのアクセス をするために TEE と呼ばれる API 郡が利用される TrustZone & TEE

Slide 17

Slide 17 text

TrustZone & TEE ࢀর: ARM

Slide 18

Slide 18 text

ここでは Android などの Rich OS が動作する。アプリ のインストールやデータの読 み書き、インターネット接続 などの通常動作が行われる。 Normal World ࢀর: ARM

Slide 19

Slide 19 text

Secure World Secure OS が動作している。通常 の環境とは仮想的に分離されてい る。Normal World からのアクセ スは制限され、悪意のあるアプリ が Secure World 内のデータを利 用することは出来ない。 また Secure World での実行環境 と API 郡を標準化したのが TEE 仕様となる。 ࢀর: ARM

Slide 20

Slide 20 text

SL2000
 TEE がなく全て Normal World で行われる SL3000
 PlayReady 3.0 で実装されており、Android では 利用できないが TEE が利用される PlayReady - Security Level

Slide 21

Slide 21 text

PlayReady - Security Level ࢀর: Microsoft

Slide 22

Slide 22 text

L1
 全ての制御、暗号化は 
 TEE を使い Secure World で行われる L3
 TEE がなく全て Normal World で行われる Widevine - Security Level

Slide 23

Slide 23 text

ClearKey

Slide 24

Slide 24 text

Android 5.0+ JSON Web Key (JWK) 簡易的な DRM
 Google や Microsoft のシステムが必要なく自前の鍵システム MPEG-DASH でよく使われる ClearKey

Slide 25

Slide 25 text

ClearKey (JWK) { "keys": [{ "kty": "oct", "k": "tQ0bJVWb6b0KPL6KtZIy_A", "kid": "LwVHf8JLtPrv2GUXFW2v_A" }], "type": "temporary" }

Slide 26

Slide 26 text

Base64 URL 形式を採用
 
 ‘=‘ のパディングは無し
 ‘-’ を ‘+’ に、‘/’ を ‘_’ に変換する ClearKey (JWK)

Slide 27

Slide 27 text

Web の EME (W3C) では JWK の規定に基づ いて、Base64 URL 形式でブラウザに実装さ れている Android の ClearKey Plugin ではそのまま Base64 形式になっており、’-‘ や ‘/‘ はその ままの状態でやりとりが行われる。 ClearKey (JWK)

Slide 28

Slide 28 text

HLS

Slide 29

Slide 29 text

H.264 (AVC) / H.265 (HEVC) MPEG2-TS Fragmented mp4 ID3 (Timed Metadata) Sample-AES (AES-128) HLS Common Encryption (CENC) Offline HLS Offline FairPlay

Slide 30

Slide 30 text

MPEG-DASH

Slide 31

Slide 31 text

H.264 (AVC) / H.265 (HEVC) MPEG2-TS Fragmented mp4 EventMessage (EMSG) Common Encryption (CENC) MPEG-DASH Profile
 Full Profile
 On Demand Profile
 Live Profile
 Main Profile Can separate Audio and Video.

Slide 32

Slide 32 text

Cost

Slide 33

Slide 33 text

Cost MPEG LA (MPEG-2, MPEG-4) DRM License (PlayReady, Widevine) Man-hour

Slide 34

Slide 34 text

MPEG LA AVC / H.264 License HEVC / H.265 License DASH License

Slide 35

Slide 35 text

MPEG LA - AVC/H.264 License 10万 Unit 以上ある場合に費用が発生 1Unit あたり $0.20 1Unit あたり $0.10 (5.0 million以上) 上限は $9.75M (2017-2020) エンコード側 及び デコード側の両方が対象 有償ユーザのみ

Slide 36

Slide 36 text

MPEG LA - DASH License 10万 Unit 以上ある場合に費用が発生 1Unit あたり $0.05 上限は $30M デコード側が対象 無償、有償ユーザいずれも

Slide 37

Slide 37 text

DRM License Microsoft PlayReady Google Widevine Apple FairPlay Streaming

Slide 38

Slide 38 text

DRM License Google や Microsoft との DRM パー トナー認定を受けている企業に仲介し てもらう必要がある。 Certified Widevine Implementation Partner Program (CWIP)

Slide 39

Slide 39 text

Cost Man-hour Money HLS MPEG-DASH

Slide 40

Slide 40 text

Cost Man-hour Money PlayReady Widevine FairPlay

Slide 41

Slide 41 text

With ExoPlayer

Slide 42

Slide 42 text

Android 4.1+ (DRM 利用の場合は 4.3+) HLS (no DRM, AES-128) DASH (no DRM, Widevine, CENC scheme) Google VR ExoPlayer

Slide 43

Slide 43 text

DrmSessionManager

Slide 44

Slide 44 text

ExoPlayer における DRM 処理の中心 現状では、Multiple DRM はサポー トしていない (issue #2885) DrmSessionManager

Slide 45

Slide 45 text

FrameworkMediaDrm (MediaDrm)

Slide 46

Slide 46 text

Android 4.3+ (API18) DRM Scheme (uuid) を指定して生成 Widevine, CENC などのフォーマット に対応している FrameworkMediaDrm (MediaDrm)

Slide 47

Slide 47 text

MediaDrmCallback

Slide 48

Slide 48 text

Key のリクエストとコールバックに 処理を追加できる。
 
 例えば、ClearKey などに独自の暗号 化を加えている場合など。 MediaDrmCallback

Slide 49

Slide 49 text

MediaDrmCallback public interface MediaDrmCallback { /** * Executes a provisioning request. */ byte[] executeProvisionRequest(UUID uuid, ProvisionRequest request) throws Exception; /** * Executes a key request. */ byte[] executeKeyRequest(UUID uuid, KeyRequest request) throws Exception; }

Slide 50

Slide 50 text

Issues

Slide 51

Slide 51 text

Pixel & Pixel XL で 7.x (Nougat) を 利用している場合において 
 Clear -> DRM -> Clear -> DRM を繰 り返した場合、端末が Reboot される Issue No.1

Slide 52

Slide 52 text

Android O で Fix される予定
 
 #2587
 github.com/google/ExoPlayer/issues/2587 Issue No.1

Slide 53

Slide 53 text

Conclusion

Slide 54

Slide 54 text

Thank you. twitter.com/wasabeef_jp wasabeef.jp github.com/wasabeef