mirror of
https://github.com/qtmleap/revkit.git
synced 2026-10-04 08:51:51 +02:00
237 lines
7.9 KiB
Markdown
237 lines
7.9 KiB
Markdown
# 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](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 情報からセキュリティレベルを判定し、
|
|
返却するマニフェスト (利用可能なストリーム品質) を決定する。
|