UICCの詳細なUSIMシリーズ-UICCプロトコルレイヤー構造
記事のディレクトリ
基本的な紹介
コンピュータネットワークのプロトコル層の概念と同様に、UICCにも独自のプロトコル層の概念がありますが、比較的単純です。このプロトコル層は、次の図に示すように、ターミナルとUICC間のデータ交換に使用されます。
このプロトコル層で定義されている2つのプロトコルの場合、プロトコルT = 0とプロトコルT = 1です。2つの違いは、プロトコルT = 0が文字ベースのプロトコルである、つまり、ターミナルとUICC間の相互作用がバイト単位であるということです。プロトコルT = 1はブロックベースのプロトコルです。私たちの説明はプロトコルT = 0に基づいており、プロトコルT = 1は紹介されていませんが、興味のある学生はプロトコルTS102221を参照できます。
1.アプリケーション層とCAT層(アプリケーション層)
この層はターミナル内のアプリケーションを対象としており、TS102221では複数のコマンドと応答のペアが定義されています(つまり、アプリケーションプログラマーに公開される一部のコマンドと、コマンドに対応する応答)。アプリケーション層では、これらのコマンドを直接使用して、必要なすべての機能を完了することができます。
例:アプリケーション層で、USIMのIMSIファイルはこのコマンド0x00A40004 04 6F07を介して選択できますが、このコマンドの背後で、このタスクを完了するためにターミナルとUICC間の複数の通信が必要になる場合があります。
2.トランスポート層(トランスポート層プロトコルT = 0)
APDU(アプリケーションプロトコルデータユニット)がトランスポート層に入ると、最初にTPDU(転送プロトコルデータユニット)にマッピングされます。APDU
の構造を見てみましょう(詳細については、このブログ投稿を参照してください)。
CLA | INS | P1 | P2 | Lc(オプション) | データ(オプション) | ル(オプション) |
---|
TPDU(コマンドヘッダー)構造:
CLA | INS | P1 | P2 | P3 |
---|
チャートを通して、変換の主な作業はTPDUのP3フィールドとAPDUのLc、データ、およびLeの間のマッピングを完了することであることを誰もが理解できるはずです。
4つのコマンド形式
ケース1:APDUにLc、Data、Leが含まれていません。
この場合、ターミナルはTPDUのP3を0x00に設定し、UICCに送信します。UICCはコマンドを処理し、ステータスワード(R-TPDU)を返します。トランスポート層は離れます。 R-TPDUはそのままです。アプリケーション層に自動的に送信します。
例:
ケース2:APDUにはLc、Dataが含まれていませんが
、Le Le Fieldの意味は主に、ターミナルがUICCに取得するデータの長さを通知することです。たとえば、ターミナルはファイルを読み取る必要があります。Leがない場合、UICCはmax {file length、255}に従います。この長さはターミナルデータに返されます。Leが設定されている場合、UICCはmin {Le、filelength}に従ってターミナルに戻ります。
case2のP3フィールドがLeに設定されてUICCに送信され、UICCトランスポート層がLeバイトのデータとステータスワードをターミナルトランスポート層に返します(このプロセスでは、UICCはプロシージャバイト「61xx」または「6Cxx」を使用してデータの戻りを制御します、と言うことである。すなわち、端末輸送層は、第1 UICC輸送層にコマンドヘッダを送信し、その後、UICCは、データをフェッチするために、端末に通知するため、端末のトランスポート層に手順バイトを送信し)、そして端末輸送層がありませんR-TPDUを変更し、アプリケーション層に送信します。
「61xx」および「6Cxx」の詳細な使用法については、記事の最後を参照してください。
例:
ケース3:APDUにはLeが含まれていませんが、Lcが含まれています。データ
端末はコマンドヘッダーをUICCトランスポート層に送信します。UICCはプロシージャバイトを返し、端末に「データのLcバイト」を送信するよう通知します。UICCがコマンドの処理を終了すると、ステータスワードを返します。 、端末送信層は処理を行わず、アプリケーション層に戻ります。
例:
ケース4:
APDUのLc、Data、およびLeの場合のC-APDUからC-TPDUへのマッピングはルインターセプト落とす。
- 1)端末はコマンドヘッダーをUICCトランスポート層に送信します
- 2)コマンドヘッダーを受け取った後、UICCの場合:
- a)UICCはプロシージャバイトをターミナルトランスポート層に返し、ターミナルトランスポート層は「Lcバイトのデータ」をUICCトランスポート層に送信します。
- b)UICCはステータスワードを返し、端末のトランスポート層はコマンド処理を終了します
- 3)2b)の処理に中断がない場合、UICCが「Lcbytes ofDATA」を受信した後:
- a)コマンド処理に異常がない場合、UICCはプロシージャバイト「61xx」をターミナルのトランスポート層に返し、ターミナルにGETRESPONSEコマンドを開始してUICCからデータを読み取るように要求します。
- b)例外が発生した場合、UICCはステータスバイトをターミナルトランスポート層に送信します
- 4)ステップ3でプロシージャバイトまたはステータスバイトを受信した後、UICCの場合:
- UICCターミナル「61xxを」手順はステップ3aでバイト)に送信する場合A)、端末は、UICCへのGET RESPONSEコマンド・ヘッダを送信し、あるとP3の値を設定し、「未満又はto'XXに等しく、又は
- b)ステップ3b)で端末に送信された警告(「62xx」または「63xx」)またはアプリケーション関連(「9xxx」で「9000」ではない)、次に端末はGET RESPONSEコマンドを送信し、Leを0x00に設定します、または
- c)stpe 3b)で返されるものがステップ4b)のステータスワードでない場合、端末のトランスポート層はコマンド処理を終了します。
「61xx」および「6Cxx」の詳細な使用法については、記事の最後を参照してください。
例:
プロシージャバイト「61xx」および「6Cxx」の使用
「61xx」および「6Cxx」は、上記のCase2およびCase4にのみ適用されます。
Luicc:UICCは、Case2またはCase4コマンドに応答するときにこのパラメーターを保持します。これは、UICCが実際にターミナルに応答できるバイト数を示します。LeがLuiccより大きい場合、Luiccバイトのみを返すことができます。
「61xx」
「61xx」は、ターミナルトランスポート層にGET RESPONSEコマンドをUICCに送信し、GETRESPONSEのcommnadヘッダーのP3フィールドを「xx」に設定するように指示します。
「6Cxx」
「6Cxx」は、ターミナルトランスポート層に前のコマンドをすぐにUICCに再送信し、前のコマンドのcommnadヘッダーのP3フィールドを「xx」に設定するように指示します。
ケース2コマンド
- 1)UICCがケース2コマンドヘッダーを受信し、Le = '00'(Luicc <256バイト)またはLe> Luiccの場合、UICCは次を返します。
- a)プロシージャバイト「6CLuicc」がターミナルトランスポート層に送信され、ターミナルに前のコマンドをすぐに再送信してP3 = Luiccを設定するように通知します。
- b)ステータスワードをターミナルに送信し、警告またはエラーを報告します
- 2)UICCがケース2コマンドヘッダーを受信し、Le = '00'Luicc = 256バイト)またはLe = Luiccの場合、UICCは次を返します。
- a)UICCはターミナルにメッセージを送信します。このメッセージの先頭はINS、〜INS、または「60」プロシージャバイトで、その後に長さLeのデータが続き、最後に関連するステータスワードが続きます。
- b)UICCはプロシージャバイト「61xx」をターミナルトランスポート層に送信し、ターミナルはGET RESPONSEコマンドを送信してP3を「XX」に設定します。「XX」はLuiccよりも小さい必要があります(これはScardのバッファがLuiccよりも小さい場合に発生します)。
- c)ステータスワードをターミナルに送信し、警告またはエラーを報告します
- 3)UICCがケース2コマンドヘッダーを受信し、Le <Luiccの場合、UICCは以下を返します。
- a)UICCはターミナルにメッセージを送信します。このメッセージの最初はINS、〜INS、または「60」プロシージャバイトで、その後に長さLeのデータ、最後にプロシージャバイト「61xx」が続き、ターミナルはすぐにGETRESPONSEコマンドを送信します。そして、P3 = 'XX'、または
- b)ステータスワードをターミナルに送信し、警告またはエラーを報告します
例:
ケース4コマンド
UICCは、ケース4コマンドを受信した後に戻ります。
- a)プロシージャバイト'61 xx '、GET RESPONSEコマンドをすぐに送信するようにターミナルに通知し、P3 =' XX 'を設定します。
- b)ステータスワードをターミナルに送信し、警告またはエラーを報告します
例:
3.データリンク層(データリンク層プロトコルT = 0)
この部分はタイミングの問題に対処するように設計されているため、ここでは紹介しません。興味のある学生はTS102221を参照できます。
T = 0は、データリンク層が半二重文字ベースの非同期伝送プロトコルであることを意味します。T= 0を使用するすべての端末は、UICCに何をすべきかを指示するために最初に5バイトのコマンドヘッダーをUICCに送信する必要があります。ターミナルは常にマスターとして機能し、UICCはスレーブとして機能します。
コマンドヘッダー:常に5つの連続するビット、CLA、INS、P1、P2、およびP3で構成されます
この層はコマンドを処理し、プロシージャバイトまたはステータスバイトを返します。プロシージャバイトまたはステータスバイトを介して、UICCとターミナルはI / Oラインに安全にアクセスできます
ステータスワード与手順バイト
プロシージャバイトのコーディング
プロシージャバイトは、UICCとターミナル間の通信を実装するために使用され、アプリケーション層には送信されません。
バイト | 値 | アクション |
---|---|---|
ACK | ACKはINSに等しい | 端末は残りのすべてのデータ(データバイト)を送信しますs)UICCまたはターミナルは、UICCから残りのすべてのデータを受信します |
ACKはINS否定(〜INS)に等しい | ターミナルは次のデータバイトを送信するか、ターミナルはUICCから次のデータバイトを受信します | |
ヌル | '60' | データ送信を完了する必要はありません。端末はプロシージャバイトを待つ必要があります |
SW1 | '61' | ターミナルは2番目のプロシージャバイトを待機してから、GET RESPONSEコマンドヘッダーをUICCに送信し、P3を「XX」に設定します。この「XX」は2番目のプロシージャバイトのSW2です。 |
「6C」 | 端末は2番目のプロシージャバイトを待機してから最後のコマンドを再送信しますが、P3フィールドを「XX」に設定します。この「XX」は2番目のプロシージャバイトのSW2です。 |
ステータスバイト
ステータスバイトSW1およびSW2は、UICCでのコマンドの実行を説明するために使用されます。成功?失敗?
通常、SW1 SW2 = '90 00 'は、コマンドが正常に実行された後に返されます。
バイト | 値 | アクション |
---|---|---|
SW1 | 「6X」または「9X」(「60」、「61」、「6C」を除く) | ターミナルはSW2を待機し、受信したステータスバイトとデータ(存在する場合)をアプリケーション層に送信します |
4.物理層
プロトコルにはこのレイヤーの説明はありません。これは実際の物理デバイスに対応しているはずです。
この部分はより複雑であり、UICC開発の鍵でもあります。詳細な理解が必要な場合は、ブロガーのGitHubでUSIM_deomプロジェクトを参照できます。