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