Files
revkit/docs/spec/02_android.md
T
tkgstratorandClaude Opus 4.6 d91af8380b docs: Netflix仕様書の再構成とiOS解析ドキュメント追加
- 旧ドキュメント (docs/netflix/, docs/instructions/ 等) を削除
- docs/spec/: appboot ピンニング解析、iOS再生フロー、
  MSL CBOR鍵交換解析、キャプチャ復号状況、暗号化フロー図を追加
- docs/netflix_client_spec.md, platform_flow_comparison.md を追加
- iOS認証・マニフェスト・ライセンス取得フロー詳細を追加

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 02:06:14 +00:00

139 lines
3.6 KiB
Markdown

# Netflix MSL クライアント仕様: Android
共通仕様: [00_common.md](00_common.md)
---
## 1. フロー
```mermaid
%%{init: {'theme': 'dark'}}%%
sequenceDiagram
participant App as Android App (Cronet)
participant MSL as MSL Gateway<br/>(android14.prod)
participant CDM as Widevine CDM
rect rgba(80, 80, 80, 0.3)
Note over App,MSL: 認証・鍵交換
App->>MSL: /getProxyEsn (ESN=APPBOOT)
MSL-->>App: 実 ESN (NFANDROID1-PRV-P-L3-*)
App->>MSL: /aleProvision
Note right of App: RSA-OAEP-256 + A128GCM<br/>platform=androidNative
MSL-->>App: ALE 鍵 (HMAC + AES)
end
rect rgba(60, 100, 60, 0.3)
Note over App,CDM: マニフェスト → ライセンス → 復号
App->>MSL: /manifest (MSL暗号化)
MSL-->>App: マニフェスト (video_tracks, KID)
App->>CDM: generateRequest (PSSH initData)
CDM-->>App: license-request (protobuf)
App->>MSL: /pbo_licenses/router (license challenge)
MSL-->>App: license-response (content keys)
App->>CDM: update (license-response)
CDM-->>App: keystatuseschange (usable)
Note over App: DASH セグメント復号・再生
end
rect rgba(80, 80, 80, 0.3)
Note over App,MSL: テレメトリ
loop 再生中
App->>MSL: /events (position, trackId)
end
end
```
---
## 2. 認証
| 項目 | 値 |
|------|---|
| ESN プレフィックス | `NFANDROID1-PRV-` |
| 初期 ESN | `APPBOOT` (起動時) |
| ESN 取得方法 | `/getProxyEsn` で動的取得 |
| 認証スキーム | `NETFLIXID` (Cookie) |
| 鍵交換方式 | RSA-OAEP-256 + A128GCM |
| MSL トランスポート | Cronet (HTTP/2) |
| MSL 圧縮 | gzip |
### ESN 二段階取得
1. 起動時は `APPBOOT` ESN で MSL ハンドシェイク
2. `/getProxyEsn` で実 ESN を取得: `NFANDROID1-PRV-P-{L1|L3}-{hash}`
3. 以降は実 ESN で通信
### ALE プロビジョニング固有パラメータ
```json
{
"netflixClientPlatform": "androidNative",
"appVer": 63928,
"appVersion": "9.57.0",
"api": 34,
"mnf": "Google",
"ffbc": "phone",
"mId": "GOOGLPIXEL=4A==5G=S",
"devmod": "Google_Pixel 4a (5G)",
"provisionRequest": {
"keyx": { "scheme": "RSA-OAEP-256" },
"scheme": "A128GCM",
"type": "SOCKETROUTER"
}
}
```
---
## 3. マニフェスト取得
MSL ゲートウェイ: `android14.prod.ftl.netflix.com` / `android14.prod.cloud.netflix.com`
### 提供されるコーデック (実測, Widevine L3)
| 解像度 | ビットレート | プロファイル |
|--------|------------|------------|
| 480x270 | — | `playready-h264hpl22-dash` |
| 960x540 | — | `playready-h264hpl30-dash` |
**Widevine L3 では最大 960x540 (SD) に制限される。** L1 デバイスであれば 1080p まで取得可能。
---
## 4. ライセンスチャレンジ
**エンドポイント:** MSL 経由 `/pbo_licenses/router`
ホスト: `android14.prod.cloud.netflix.com`
### Widevine CDM 情報 (実測)
| 項目 | 値 |
|------|---|
| OEMCrypto セキュリティレベル | L3 |
| セキュリティパッチ | May 20 2022 |
| デバイス証明書ハッシュ | `KAvwDZh6ZPI16jT59NO7L5XUj7ME5e6KKx0eXz0Zz9A=` |
---
## 5. デバイス構成
`/config` エンドポイントで取得:
```json
{
"path": ["deviceConfig", "hendrixConfig", "networkScoreConfig", "accountConfig", "streamingConfig2"]
}
```
レスポンスに `retrystrategy`, `truststore`, `jtruststore`, `msltruststore`, TLS cipher suites を含む。
---
## 6. データ API
| API | 方式 | ホスト |
|-----|------|-------|
| GraphQL | MSL 経由 | `android14.prod.cloud.netflix.com/graphql` |
| persisted query | version=102 | |