記事一覧

PSPのワンセグチューナのパケットからTSを得る

PSPのワンセグチューナから得られるパケットは生TSではなく、暗号化されたTSです。このパケットからTSを得るには、暗号解除処理が必要となります。その中で鍵となるのが、sceUsb1SegConstructの引数2に渡すEncKeyです。

●EncKey: これはAESで暗号化された128bitの乱数です。そして、生成に必要なものはプレーンテキスト(乱数)、AES暗号化用の鍵です。
 1. AES鍵(全5種)を選択するため、そのインデックスidxを決定する。この計算は、idx = (乱数 & 0x03) + 1;
 2. 選択された鍵owKey[idx]をExpandする。
 3. 32ibt乱数x4を用いて128bitプレーンテキストを生成。
 4. プレーンテキストをAES鍵によってEncryptし、EncKeyを得る。
 5. ENCKEY構造体へ代入: unk0 = idx, cipher = EncKey
 6. sceUsb1SegConstructを呼ぶ
この後、EncKeyは用済みとなりまが、Expandされた鍵とプレーンテキストはパケットの処理で使用されます。

●チューナから出てくるパケット
受信パケットはsceUsb1SegGetPacketBufferから得られますが、それは暗号化されており、そのままではTSとはなりません。この暗号化を解除するには、EncKeyを生成する段階で得た鍵(Expanded)とプレーンテキストを使います。
 ※パケットは188バイトではなく、192バイトとなっています。パケットは16バイトずつ処理されるので、以下は12回繰り返します。
 1. パケットの16バイトを鍵(Expanded)でDecryptする。
 2. 1での出力にプレーンテキストをxorする。
 3. プレーンテキストをパケットの16バイトで置換える。

以上の処理内容は、次の図のようになります。PACKET_BUF::bufが暗号化されたTSで、それを複合化して返します。

※ENCKEY::idxはENCKEY::unk0, ENCKEY::owKeyはENCKEY::cipher[0~3]と同等です。
 接頭語"ow"はOWORD(128bit値)を表します。
 sceUsb1SegConstructの引数chは物理チャネル番号、uidはパケット取得コールバックのUIDです。
flow_1SegPacketDec.png

Comments

Post a comment

Private comment