0
|
1 【名称】
|
|
2
|
|
3 ARIB STD-B25 仕様確認テストプログラムソースコード
|
|
4
|
|
5 【バージョン】
|
|
6
|
3
|
7 0.2.3
|
0
|
8
|
|
9 【作者】
|
|
10
|
|
11 茂木 和洋 (MOGI, Kazuhiro)
|
|
12 kazhiro@marumo.ne.jp
|
|
13
|
|
14 【一次配布元】
|
|
15
|
3
|
16 http://www.marumo.ne.jp/db2008_c.htm#30
|
0
|
17
|
|
18 あるいは
|
|
19
|
3
|
20 http://www.marumo.ne.jp/junk/arib_std_b25-0.2.3.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
|
|
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
|
3
|
194 ・2008, 12/30 - ver. 0.2.3
|
|
195
|
|
196 CA_descriptor の解釈を行う際に CA_system_id が B-CAS カード
|
|
197 から取得したものと一致するか確認を行うように変更
|
|
198
|
|
199 http://www.marumo.ne.jp/db2008_c.htm#30 又は
|
|
200 http://www.marumo.ne.jp/junk/arib_std_b25-0.2.3.lzh
|
|
201
|
|
202 ・2008, 11/10 - ver. 0.2.2
|
|
203
|
|
204 修正ユリウス日から年月日への変換処理をより正確なものへ変更
|
|
205
|
|
206 TS パケットサイズの特定方法を変更
|
|
207
|
|
208 http://www.marumo.ne.jp/db2008_b.htm#10 又は
|
|
209 http://www.marumo.ne.jp/junk/arib_std_b25-0.2.2.lzh
|
|
210
|
0
|
211 ・2008, 4/9 - ver. 0.2.1
|
|
212
|
|
213 PAT 更新時に復号漏れが発生していたバグを修正
|
|
214 (ver. 0.2.0 でのエンバグ)
|
|
215
|
|
216 野良 PID (PMT に記載されていないストリーム) が存在した場合
|
|
217 TS 内の ECM がひとつだけならば、その ECM で復号する形に変更
|
|
218
|
|
219 EMM の B-CAS カードへの送信をオプションで選択可能に変更 (-m)
|
|
220 進捗状況の表示をオプションで選択可能に変更 (-v)
|
|
221 通電制御情報 (EMM受信用) を表示するオプションを追加 (-p)
|
|
222
|
|
223 http://www.marumo.ne.jp/db2008_4.htm#9 又は
|
|
224 http://www.marumo.ne.jp/junk/arib_std_b25-0.2.1.lzh
|
|
225
|
|
226 ・2008, 4/6 - ver. 0.2.0
|
|
227
|
|
228 EMM 対応
|
|
229 利用中の B-CAS カード ID 向けの EMM を検出した場合、EMM を
|
|
230 B-CAS カードに渡す処理を追加
|
|
231
|
|
232 ECM 処理の際に未契約応答が返された場合、処理負荷軽減の為、
|
|
233 以降、その PID の ECM を B-CAS カードで処理しないように変
|
|
234 更 (EMM を処理した場合は再び ECM を処理するように戻す)
|
|
235
|
|
236 進捗を nn.nn% の書式で標準エラー出力に表示するように変更
|
|
237
|
|
238 http://www.marumo.ne.jp/db2008_4.htm#6 又は
|
|
239 http://www.marumo.ne.jp/junk/arib_std_b25-0.2.0.lzh
|
|
240
|
|
241 ・2008, 3/31 - ver. 0.1.9
|
|
242
|
|
243 MULTI2 モジュールのインスタンスが未作製の状況で、MULTI2 の
|
|
244 機能を呼び出して例外を発生させることがあったバグを修正
|
|
245
|
|
246 # パッチを提供してくれた方に感謝
|
|
247
|
|
248 http://www.marumo.ne.jp/db2008_3.htm#31 又は
|
|
249 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.9.lzh
|
|
250
|
|
251 ・2008, 3/24 - ver. 0.1.8
|
|
252
|
|
253 -s オプション (NULL パケットの削除) を追加
|
|
254 -s 1 で NULL パケットを出力ファイルには保存しなくなる
|
|
255 デフォルトは -s 0 の NULL パケット保持
|
|
256
|
|
257 http://www.marumo.ne.jp/db2008_3.htm#24 又は
|
|
258 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.8.lzh
|
|
259
|
|
260 ・2008, 3/17 - ver. 0.1.7
|
|
261
|
|
262 arib_std_b25.h に「extern "C" {」を閉じるコードがなかった問題
|
|
263 (C++ コードから利用する場合にコンパイルエラーを発生させる) を
|
|
264 修正
|
|
265
|
|
266 TS パケットの中途でストリームが切り替わるケースで問題が発生し
|
|
267 にくくなるように、arib_std_b25.c 内のコードを修正
|
|
268
|
|
269 http://www.marumo.ne.jp/db2008_3.htm#17 又は
|
|
270 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.7.lzh
|
|
271
|
|
272 ・2008, 3/16 - ver. 0.1.6
|
|
273
|
|
274 PMT 更新の際、ECM 関連の状況が変更 (スクランブル - ノンスク
|
|
275 ランブルの切り替えや、ECM PID の変更等) が行われても、それが
|
|
276 反映されていなかった問題を修正
|
|
277
|
|
278 http://www.marumo.ne.jp/db2008_3.htm#16 又は
|
|
279 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.6.lzh
|
|
280
|
|
281 ・2008, 2/14
|
|
282
|
|
283 readme.txt (このファイル) を修正
|
|
284 ソースコードのライセンスについての記述を追加
|
|
285
|
|
286 ・2008, 2/12 - ver. 0.1.5
|
|
287
|
|
288 PMT の更新に伴い、どのプログラムにも所属しなくなった PID (スト
|
|
289 リーム) でパケットが送信され続けた場合、そのパケットの復号が
|
|
290 できなくなっていた問題を修正
|
|
291
|
|
292 http://www.marumo.ne.jp/db2008_2.htm#12 又は
|
|
293 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.5.lzh
|
|
294
|
|
295 ・2008, 2/2 - ver. 0.1.4
|
|
296
|
|
297 ver. 0.1.3 での PMT 処理方法変更に問題があり、PMT が更新された
|
|
298 場合、それ以降で正常な処理が行えなくなっていたバグを修正
|
|
299
|
|
300 B-CAS カードとの通信でエラーが発生した場合のリトライ処理が機能
|
|
301 していなかったバグを修正
|
|
302
|
|
303 http://www.marumo.ne.jp/db2008_2.htm#2 又は
|
|
304 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.4.lzh
|
|
305
|
|
306 ・2008, 2/1 - ver. 0.1.3
|
|
307
|
|
308 有料放送等で未契約状態の B-CAS カードを使った際に、鍵が取得で
|
|
309 きていないにもかかわらず、間違った鍵で復号をしていた問題に対処
|
|
310
|
|
311 鍵が取得できなかった ECM に関連付けられたストリームでは復号を
|
|
312 行わず、スクランブルフラグを残したまま入力を素通しする形に変更
|
|
313 鍵が取得できない ECM が存在する場合、終了時にチャネル番号と
|
|
314 B-CAS カードから取得できたエラー番号を警告メッセージとして表示
|
|
315 する形に変更
|
|
316
|
|
317 暗号化されていないプログラムで例外を発生させていたバグを修正
|
|
318
|
|
319 http://www.marumo.ne.jp/db2008_2.htm#1 又は
|
|
320 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.3.lzh
|
|
321
|
|
322 ・2008, 1/11 - ver. 0.1.2
|
|
323
|
|
324 デジタル BS 放送等で、PAT に登録されているのに、ストリーム内で
|
|
325 PMT が一切出現しないことがある場合に対応
|
|
326
|
|
327 PMT 内の記述子領域 2 に CA_descriptor が存在する場合に対応する
|
|
328 ため arib_std_b25.c 内部での処理構造を変更
|
|
329
|
|
330 別プログラムと同時実行するためにスマートカードの排他制御指定を
|
|
331 変更
|
|
332
|
|
333 http://www.marumo.ne.jp/db2008_1.htm#11 又は
|
|
334 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.2.lzh
|
|
335
|
|
336 ・2008, 1/7 - ver. 0.1.1
|
|
337
|
|
338 セクション (PAT/PMT/ECM 等) が複数の TS パケットに分割されている
|
|
339 場合に、正常に処理できなかったり、例外を発生をさせることがある
|
|
340 バグを修正
|
|
341
|
|
342 http://www.marumo.ne.jp/db2008_1.htm#7 又は
|
|
343 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.1.lzh
|
|
344
|
|
345 ・2007, 11/25 - ver. 0.1.0
|
|
346
|
|
347 公開
|
|
348
|
|
349 http://www.marumo.ne.jp/db2007_b.htm#25 又は
|
|
350 http://www.marumo.ne.jp/junk/arib_std_b25-0.1.0.lzh
|
|
351
|