Files
revkit/docs/licensedManifest/L1_vs_L3_comparison.md
T

7.9 KiB

licensedManifest: Widevine L1 vs L3 比較

Device: Pixel 4a (5G) / bramble / Android 14 App: Netflix 9.57.0 Endpoint: https://android14.prod.ftl.netflix.com/nq/androidui/samurai/~9.0.0/api URL: /licensedManifest

概要

同一デバイス (Pixel 4a) で、Widevine L1 (TEE) と L3 (ソフトウェア) の licensedManifest リクエストを比較。 リクエスト構造は同一だが、profiles と challenge の内容が異なる。

リクエスト共通部分

以下のフィールドは L1/L3 で完全に同一:

フィールド 値
version 2
url /licensedManifest
languages ["en-JP"]
method licensedManifest
flavor PRE_FETCH
drmType widevine
manifestVersion v2
osName android
osVersion 34
application samurai
clientVersion 9.57.0
uiVersion 9.57.0
uiPlatform android
player streaming
hardware lito
licenseType limited
cellularCap auto
netType wifi
supportsWatermark true
supportsPreReleasePin true
supportsAdBreakHydration true
liveAdsCapability dynamic
supportsUnequalizedDownloadables true
requestEligibleABTests true
useBetterTextUrls true
useHttpsStreams true
contentPlaygraph ["v2"]
supportsAuxiliaryManifestDeduplication true
liveMetadataFormat INDEXED_SEGMENT_TEMPLATE
maxSupportedLanguages -1
supportsPartialHydration true
prefersVerticalVideo false
supportsVideoTrackSwitching false
supportsNetflixMediaEvents true

差分1: Profiles

L1 (36 profiles)

HEVC HDR + 高解像度H.264 + VP9を含む全プロファイル:

none-h264mpl30-dash
playready-h264mpl30-dash
none-h264mpl31-dash              ← L3にはない
playready-h264mpl31-dash         ← L3にはない
none-h264mpl40-dash              ← L3にはない
playready-h264mpl40-dash         ← L3にはない
hevc-hdr-main10-L30-dash-cenc-prk     ← L3にはない (HEVC HDR)
hevc-hdr-main10-L30-dash-cenc-prk-do  ← L3にはない
hevc-hdr-main10-L31-dash-cenc-prk     ← L3にはない
hevc-hdr-main10-L31-dash-cenc-prk-do  ← L3にはない
hevc-hdr-main10-L40-dash-cenc-prk     ← L3にはない
hevc-hdr-main10-L40-dash-cenc-prk-do  ← L3にはない
hevc-hdr-main10-L41-dash-cenc-prk     ← L3にはない
hevc-hdr-main10-L41-dash-cenc-prk-do  ← L3にはない
hevc-hdr-main10-L30-dash-cenc-live    ← L3にはない
hevc-hdr-main10-L31-dash-cenc-live    ← L3にはない
hevc-hdr-main10-L40-dash-cenc-live    ← L3にはない
hevc-hdr-main10-L41-dash-cenc-live    ← L3にはない
iso_23001_18-dash-live
playready-h264hpl22-dash
h264hpl22-dash-playready-live
playready-h264hpl30-dash
h264hpl30-dash-playready-live
playready-h264hpl31-dash         ← L3にはない
h264hpl31-dash-playready-live    ← L3にはない
playready-h264hpl40-dash         ← L3にはない
h264hpl40-dash-playready-live    ← L3にはない
vp9-profile0-L21-dash-cenc
vp9-profile0-L30-dash-cenc
vp9-profile0-L31-dash-cenc       ← L3にはない
vp9-profile0-L40-dash-cenc       ← L3にはない
heaac-2-dash
xheaac-dash
imsc1.1
nflx-cmisc
BIF320

L3 (14 profiles)

基本的なコーデックのみ。HEVC HDR なし、高解像度 H.264/VP9 なし:

none-h264mpl30-dash
playready-h264mpl30-dash
iso_23001_18-dash-live
playready-h264hpl22-dash
h264hpl22-dash-playready-live
playready-h264hpl30-dash
h264hpl30-dash-playready-live
vp9-profile0-L21-dash-cenc
vp9-profile0-L30-dash-cenc
heaac-2-dash
xheaac-dash
imsc1.1
nflx-cmisc
BIF320

Profile 差分まとめ

カテゴリ L1 L3
H.264 Main Profile L30, L31, L40 L30のみ
H.264 High Profile L22, L30, L31, L40 L22, L30のみ
HEVC HDR Main10 L30, L31, L40, L41 (prk, prk-do, live) なし
VP9 Profile0 L21, L30, L31, L40 L21, L30のみ
Audio/Subtitle/Other heaac-2, xheaac, imsc1.1, nflx-cmisc, BIF320 同一
合計 36 14

L3 では高解像度ビデオ (L31以上) と HEVC HDR が全て除外される。 H.264基準では最大L30 (720p) だが、VP9 L30 (最大1080p) は含まれる。 実際に返却されるストリーム品質はサーバー側の manifest レスポンスによる。

差分2: Challenge (Widevine License Request)

Challenge はデバイスの Widevine CDM が生成する protobuf バイナリ (Base64エンコード)。 デバイス証明書と OEMCrypto 情報を含む。

L1 Challenge 内の Client Identification

application_name: com.netflix.mediaclient
origin: (empty)
package_certificate_hash_bytes: KAvwDZh6ZPI16jT59NO7L5XUj7ME5e6KKx0eXz0Zz9A=
company_name: Google
model_name: Pixel 4a (5G)
architecture_name: arm64-v8a
device_name: bramble
product_name: bramble
build_info: google/bramble/bramble:14/UP1A.231005.007/10754064:user/release-keys
widevine_cdm_version: 17.0.0
oem_crypto_security_patch_level: 0
oem_crypto_build_information: Build Information: API_Version: 16.3 LibOEMCrypto_Version: 1.56 TA_Version: 1.1382

L3 Challenge 内の Client Identification

application_name: com.netflix.mediaclient
origin: (empty)
package_certificate_hash_bytes: KAvwDZh6ZPI16jT59NO7L5XUj7ME5e6KKx0eXz0Zz9A=
company_name: Google
model_name: Pixel 4a (5G)
architecture_name: arm64-v8a
device_name: bramble
product_name: bramble
build_info: google/bramble/bramble:14/UP1A.231005.007/10754064:user/release-keys
widevine_cdm_version: 17.0.0
oem_crypto_security_patch_level: 0
oem_crypto_build_information: OEMCrypto Level3 Code May 20 2022 21:36:54

Challenge 差分まとめ

フィールド L1 L3
oem_crypto_build_information Build Information: API_Version: 16.3 LibOEMCrypto_Version: 1.56 TA_Version: 1.1382 OEMCrypto Level3 Code May 20 2022 21:36:54
RSA公開鍵 異なる (TEE内の鍵) 異なる (ソフトウェア鍵)
DRM Session Provider Certificate 異なる 異なる
challengeBase64 長さ ~3456文字 ~3192文字

L1 の challenge は TEE (Trusted Execution Environment) 内で生成され、TA (Trusted Application) バージョン情報を含む。 L3 の challenge はソフトウェアで生成され、OEMCrypto Level3 のビルド日時を含む。

差分3: viewableId

両方とも params 配列に3つの viewableId を含むが、viewableId 自体は同一:

params[n] viewableId
params[0] 81639724
params[1] 81756595
params[2] 80243261

Cookies

MSL リクエストは gsid cookie で認証される。以下の cookie が使用される:

Cookie 説明
nfvdid Netflix Virtual Device ID
flwssn Flow Session ID
NetflixId メイン認証 cookie
SecureNetflixId セキュア認証 cookie (HMAC付き)
gsid Global Session ID (MSLリクエスト用)

実際のcookie値は cookies.txt を参照。

Headers

MSL リクエストは Cronet HTTP クライアント経由で送信される。 主要ヘッダー:

Header 値
Content-Type application/json
User-Agent Dalvik/2.1.0 (Linux; U; Android 14; Pixel 4a (5G) Build/UP1A.231005.007)

まとめ

項目 L1 (TEE) L3 (Software)
最大画質 4K HDR 720p (H.264) / 1080p (VP9) ※要レスポンス確認
Profiles数 36 14
HEVC HDR あり (L30-L41) なし
H.264 最大Level L40 (1080p+) L30 (720p)
VP9 最大Level L40 (4K) L30 (1080p)
OEMCrypto TEE (TA_Version: 1.1382) Software (Level3 Code)
セキュリティ ハードウェア保護 ソフトウェアのみ
リクエスト構造 同一 同一
Cookie 同一 同一

L1/L3 の違いは challenge と profiles のみ。リクエスト構造、cookie、ヘッダーは完全に同一。 Netflix サーバーは challenge 内の OEMCrypto 情報からセキュリティレベルを判定し、 返却するマニフェスト (利用可能なストリーム品質) を決定する。