0
|
1 【名称】
|
|
2
|
|
3 ARIB STD-B25 仕様確認テストプログラムソースコード
|
|
4
|
|
5 【バージョン】
|
|
6
|
|
7 0.2.0
|
|
8
|
|
9 【作者】
|
|
10
|
|
11 茂木 和洋 (MOGI, Kazuhiro)
|
|
12 kazhiro@marumo.ne.jp
|
|
13
|
|
14 【一次配布元】
|
|
15
|
|
16 http://www.marumo.ne.jp/db2008_4.htm#09
|
|
17
|
|
18 あるいは
|
|
19
|
|
20 http://www.marumo.ne.jp/junk/arib_std_b25-0.2.1.lzh
|
|
21
|
|
22 【目的】
|
|
23
|
|
24 ARIB STD-B25 の仕様を理解する為の、参考用の実装として公開
|
|
25
|
|
26 【背景】
|
|
27
|
|
28 2011 年 7 月の地上アナログ放送停波を控え、廉価な地上デジタル放送
|
|
29 受信機の販売が待たれている
|
|
30
|
|
31 しかし、ARIB の標準文書はわざと判りにくく書いて開発費をかさませ
|
|
32 ようとしているとしか思えないほどに意味不明瞭な記述になっており
|
|
33 このままでは低価格受信機の開発など不可能に思える
|
|
34
|
|
35 そこで、自分なりに ARIB 標準文書を読み、理解した範囲をソース
|
|
36 コードの形にまとめて公開することにした
|
|
37
|
|
38 このコードが安価な受信機の開発の一助となることを期待する
|
|
39
|
|
40 なお、あくまでも仕様理解を目的としたものであるため、ビルド済み
|
|
41 バイナリファイルは配布しない
|
|
42
|
|
43 【実装した範囲】
|
|
44
|
|
45 CA システム (B-CAS カード関連) を中心に ECM の処理とストリーム
|
|
46 暗号の復号処理、EMM 処理までを実装した
|
|
47
|
|
48 EMM メッセージ関連は未実装となっている
|
|
49
|
|
50 【プログラムの動作環境】
|
|
51
|
|
52 ISO 7816 対応の IC カードリーダがインストールされた Windows PC を
|
|
53 想定動作環境とする
|
|
54
|
|
55 ISO 7816 対応スマートカードリーダーは一般に
|
|
56 「住基カード対応 IC カードリーダ」「e-Tax 対応 IC カードリーダ」
|
|
57 などとして 4000 円程度で販売されているものが利用可能である
|
|
58
|
|
59 日立マクセル製の HX-520UJJ で正常に動作することを確認している
|
|
60
|
|
61 【ソースコードのライセンスについて】
|
|
62
|
|
63 ・ソースコードを利用したことによって、特許上のトラブルが発生しても
|
|
64 茂木 和洋は責任を負わない
|
|
65 ・ソースコードを利用したことによって、プログラムに問題が発生しても
|
|
66 茂木 和洋は責任を負わない
|
|
67
|
|
68 上記 2 条件に同意して作成された二次的著作物に対して、茂木 和洋は
|
|
69 原著作者に与えられる諸権利を行使しない
|
|
70
|
|
71 【プログラムの構成】
|
|
72
|
|
73 ・arib_std_b25.h/c
|
|
74
|
|
75 ARIB STD-B25 記載の処理を行うためのモジュール
|
|
76 MPEG-2 TS の分離、CA システム (B-CAS カード) 機能の呼び出し、
|
|
77 MULTI2 復号機能の呼び出し等を担当する
|
|
78
|
|
79 ・ts_section_parser.h/c
|
|
80
|
|
81 MPEG-2 TS のセクション形式データの分割処理を担当する
|
|
82
|
|
83 ・b_cas_card.h/c
|
|
84
|
|
85 CA システム (B-CAS カード) のリソース管理および直接の制御を
|
|
86 担当する
|
|
87
|
|
88 ・multi2.h/c
|
|
89
|
|
90 MULTI2 暗号の符号化と復号を担当する
|
|
91
|
|
92 ・td.c
|
|
93
|
|
94 テストドライバ
|
|
95 PAT/PMT/ECM を含む MPEG-2 TS ファイルを読み込み、復号後の
|
|
96 MPEG-2 TS ファイルを出力する
|
|
97
|
|
98 コマンドラインオプションで MULTI2 暗号のラウンド数を指定可能
|
|
99 ラウンド数を指定しない場合の初期値は 4
|
|
100
|
|
101 このラウンド数 4 は MULTI2 用語では 32 に相当する
|
|
102
|
|
103 ARIB STD-B25 では MULTI2 のラウンド数は非公開パラメータだが
|
|
104 総当たりで実際のラウンド数は推定可能である
|
|
105
|
|
106 【処理の流れ】
|
|
107
|
|
108 ・起動時
|
|
109
|
|
110 1 アプリケーションは B_CAS_CARD モジュールのインスタンスを
|
|
111 作成し、B_CAS_CARD モジュールに、初期化を依頼する
|
|
112
|
|
113 1.a B_CAS_CARD モジュールは WIN32 API のスマートカード関連
|
|
114 API を呼び出し、CA システムに接続する
|
|
115 1.b B_CAS_CARD モジュールは ARIB STD-B25 記載の「初期条件
|
|
116 設定コマンドを CA システムに発行し、システム鍵 (64 byte)
|
|
117 初期 CBC 状態 (8 byte) を受け取る
|
|
118
|
|
119 2 アプリケーションは ARIB_STD_B25 モジュールのインスタンスを
|
|
120 作成し、B_CAS_CARD モジュールを ARIB_STD_B25 モジュールに
|
|
121 登録する
|
|
122
|
|
123 ・データ処理時
|
|
124
|
|
125 1 アプリケーションは ARIB_STD_B25 モジュールに順次データを
|
|
126 提供し、ARIB_STD_B25 モジュールから処理完了データを受け
|
|
127 取ってファイルに出力していく
|
|
128
|
|
129 ・ARIB_STD_B25 モジュール内
|
|
130
|
|
131 1 TS パケットのユニットサイズ (188/192/204 などが一般的) が
|
|
132 特定されていない場合 8K まで入力データをバッファしてから、
|
|
133 ユニットサイズを特定する
|
|
134 ユニットサイズが特定できなかった場合は、エラー終了する
|
|
135
|
|
136 2 PAT が発見されていない場合、PAT が発見できるまで入力
|
|
137 データをバッファし続ける
|
|
138 PAT が発見できずにバッファサイズが 16M を超過した場合
|
|
139 エラー終了する
|
|
140 PAT が発見できた場合、プログラム配列を作成し PID マップ
|
|
141 配列に登録する
|
|
142
|
|
143 3 PAT に登録されていた PMT すべてが発見されるか、どれか
|
|
144 ひとつの PMT で 2 個目のセクションが到着するまで入力
|
|
145 データをバッファし続ける
|
|
146 上記条件を満たさずにバッファサイズが 32M を超過した場合
|
|
147 エラー終了する
|
|
148 PMT が到着する毎に ECM の有無を確認し、ECM が存在する
|
|
149 場合はデクリプタを作成してプログラムに所属するストリーム
|
|
150 と PID マップ上で関連付ける
|
|
151
|
|
152 4 PMT に登録されていた ECM すべてが発見されるか、どれか
|
|
153 ひとつの ECM で 2 個目のセクションが到着するまで入力
|
|
154 データをバッファし続ける
|
|
155 上記条件を満たさずにバッファサイズが 32M を超過した場合
|
|
156 エラー終了する
|
|
157 各 ECM に対して、最初のセクションデータが到着した時点で
|
|
158 MULTI2 モジュールのインスタンスをデクリプタ上に作成する
|
|
159 ECM セクションデータは B_CAS_CARD モジュールに提供して
|
|
160 スクランブル鍵を受け取り、MULTI2 モジュールにシステム鍵、
|
|
161 初期 CBC 状態、スクランブル鍵を渡し、MULTI2 復号の準備を
|
|
162 行う
|
|
163
|
|
164 5.a 暗号化されている TS パケットであれば、PID から対応
|
|
165 ECM ストリームを特定し、デクリプタの MULTI2 モジュー
|
|
166 ルに復号させて出力バッファに積む
|
|
167
|
|
168 5.b 暗号化されていない TS パケットであれば、そのまま出力
|
|
169 バッファに積む
|
|
170
|
|
171 5.c CAT を検出した場合、EMM の PID を取得して EMM の処理
|
|
172 準備を行う
|
|
173
|
|
174 5.d EMM を受け取った場合、B-CAS カード ID と比較し、自分
|
|
175 宛ての EMM であれば B-CAS カードに引き渡して処理させる
|
|
176 # EMM 処理オプションが指定されている場合
|
|
177
|
|
178 6 ECM が更新された場合、B_CAS_CARD モジュールに処理を
|
|
179 依頼し、出力されたスクランブル鍵を MULTI2 モジュールに
|
|
180 登録する
|
|
181
|
|
182 7 PMT が更新された場合、ECM PID が変化していれば新たに
|
|
183 デクリプタを作成して 4 に戻る
|
|
184
|
|
185 8 PAT が更新された場合、プログラム配列を破棄して
|
|
186 3 に戻る
|
|
187
|
|
188 ・終了時
|
|
189
|
|
190 1 各モジュールが確保したリソースを解放する
|
|
191
|
|
192 【更新履歴】
|
|
193
|
|
194 ・2008, 4/9 - ver. 0.2.1
|
|
195
|
|
196 PAT 更新時に復号漏れが発生していたバグを修正
|
|
197 (ver. 0.2.0 でのエンバグ)
|
|
198
|
|
199 野良 PID (PMT に記載されていないストリーム) が存在した場合
|
|
200 TS 内の ECM がひとつだけならば、その ECM で復号する形に変更
|
|
201
|
|
202 EMM の B-CAS カードへの送信をオプションで選択可能に変更 (-m)
|
|
203 進捗状況の表示をオプションで選択可能に変更 (-v)
|
|
204 通電制御情報 (EMM受信用) を表示するオプションを追加 (-p)
|
|
205
|
|
206 http://www.marumo.ne.jp/db2008_4.htm#9 又は
|
|
207 http://www.marumo.ne.jp/junk/arib_std_b25-0.2.1.lzh
|
|
208
|
|
209 ・2008, 4/6 - ver. 0.2.0
|
|
210
|
|
211 EMM 対応
|
|
212 利用中の B-CAS カード ID 向けの EMM を検出した場合、EMM を
|
|
213 B-CAS カードに渡す処理を追加
|
|
214
|
|
215 ECM 処理の際に未契約応答が返された場合、処理負荷軽減の為、
|
|
216 以降、その PID の ECM を B-CAS カードで処理しないように変
|
|
217 更 (EMM を処理した場合は再び ECM を処理するように戻す)
|
|
218
|
|
219 進捗を nn.nn% の書式で標準エラー出力に表示するように変更
|
|
220
|
|
221 http://www.marumo.ne.jp/db2008_4.htm#6 又は
|
|
222 http://www.marumo.ne.jp/junk/arib_std_b25-0.2.0.lzh
|
|
223
|
|
224 ・2008, 3/31 - ver. 0.1.9
|
|
225
|
|
226 MULTI2 モジュールのインスタンスが未作製の状況で、MULTI2 の
|
|
227 機能を呼び出して例外を発生させることがあったバグを修正
|
|
228
|
|
229 # パッチを提供してくれた方に感謝
|
|
230
|
|
231 http://www.marumo.ne.jp/db2008_3.htm#31 又は
|
|
232 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.9.lzh
|
|
233
|
|
234 ・2008, 3/24 - ver. 0.1.8
|
|
235
|
|
236 -s オプション (NULL パケットの削除) を追加
|
|
237 -s 1 で NULL パケットを出力ファイルには保存しなくなる
|
|
238 デフォルトは -s 0 の NULL パケット保持
|
|
239
|
|
240 http://www.marumo.ne.jp/db2008_3.htm#24 又は
|
|
241 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.8.lzh
|
|
242
|
|
243 ・2008, 3/17 - ver. 0.1.7
|
|
244
|
|
245 arib_std_b25.h に「extern "C" {」を閉じるコードがなかった問題
|
|
246 (C++ コードから利用する場合にコンパイルエラーを発生させる) を
|
|
247 修正
|
|
248
|
|
249 TS パケットの中途でストリームが切り替わるケースで問題が発生し
|
|
250 にくくなるように、arib_std_b25.c 内のコードを修正
|
|
251
|
|
252 http://www.marumo.ne.jp/db2008_3.htm#17 又は
|
|
253 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.7.lzh
|
|
254
|
|
255 ・2008, 3/16 - ver. 0.1.6
|
|
256
|
|
257 PMT 更新の際、ECM 関連の状況が変更 (スクランブル - ノンスク
|
|
258 ランブルの切り替えや、ECM PID の変更等) が行われても、それが
|
|
259 反映されていなかった問題を修正
|
|
260
|
|
261 http://www.marumo.ne.jp/db2008_3.htm#16 又は
|
|
262 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.6.lzh
|
|
263
|
|
264 ・2008, 2/14
|
|
265
|
|
266 readme.txt (このファイル) を修正
|
|
267 ソースコードのライセンスについての記述を追加
|
|
268
|
|
269 ・2008, 2/12 - ver. 0.1.5
|
|
270
|
|
271 PMT の更新に伴い、どのプログラムにも所属しなくなった PID (スト
|
|
272 リーム) でパケットが送信され続けた場合、そのパケットの復号が
|
|
273 できなくなっていた問題を修正
|
|
274
|
|
275 http://www.marumo.ne.jp/db2008_2.htm#12 又は
|
|
276 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.5.lzh
|
|
277
|
|
278 ・2008, 2/2 - ver. 0.1.4
|
|
279
|
|
280 ver. 0.1.3 での PMT 処理方法変更に問題があり、PMT が更新された
|
|
281 場合、それ以降で正常な処理が行えなくなっていたバグを修正
|
|
282
|
|
283 B-CAS カードとの通信でエラーが発生した場合のリトライ処理が機能
|
|
284 していなかったバグを修正
|
|
285
|
|
286 http://www.marumo.ne.jp/db2008_2.htm#2 又は
|
|
287 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.4.lzh
|
|
288
|
|
289 ・2008, 2/1 - ver. 0.1.3
|
|
290
|
|
291 有料放送等で未契約状態の B-CAS カードを使った際に、鍵が取得で
|
|
292 きていないにもかかわらず、間違った鍵で復号をしていた問題に対処
|
|
293
|
|
294 鍵が取得できなかった ECM に関連付けられたストリームでは復号を
|
|
295 行わず、スクランブルフラグを残したまま入力を素通しする形に変更
|
|
296 鍵が取得できない ECM が存在する場合、終了時にチャネル番号と
|
|
297 B-CAS カードから取得できたエラー番号を警告メッセージとして表示
|
|
298 する形に変更
|
|
299
|
|
300 暗号化されていないプログラムで例外を発生させていたバグを修正
|
|
301
|
|
302 http://www.marumo.ne.jp/db2008_2.htm#1 又は
|
|
303 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.3.lzh
|
|
304
|
|
305 ・2008, 1/11 - ver. 0.1.2
|
|
306
|
|
307 デジタル BS 放送等で、PAT に登録されているのに、ストリーム内で
|
|
308 PMT が一切出現しないことがある場合に対応
|
|
309
|
|
310 PMT 内の記述子領域 2 に CA_descriptor が存在する場合に対応する
|
|
311 ため arib_std_b25.c 内部での処理構造を変更
|
|
312
|
|
313 別プログラムと同時実行するためにスマートカードの排他制御指定を
|
|
314 変更
|
|
315
|
|
316 http://www.marumo.ne.jp/db2008_1.htm#11 又は
|
|
317 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.2.lzh
|
|
318
|
|
319 ・2008, 1/7 - ver. 0.1.1
|
|
320
|
|
321 セクション (PAT/PMT/ECM 等) が複数の TS パケットに分割されている
|
|
322 場合に、正常に処理できなかったり、例外を発生をさせることがある
|
|
323 バグを修正
|
|
324
|
|
325 http://www.marumo.ne.jp/db2008_1.htm#7 又は
|
|
326 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.1.lzh
|
|
327
|
|
328 ・2007, 11/25 - ver. 0.1.0
|
|
329
|
|
330 公開
|
|
331
|
|
332 http://www.marumo.ne.jp/db2007_b.htm#25 又は
|
|
333 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.0.lzh
|
|
334
|