14


SATSA の使用法

Security and Trust Services APIs (SATSA) は、小型デバイス上で動作するアプリケーションにスマートカードへのアクセスと暗号化の機能を提供します。JSR 177 (SATSA 仕様) では、オプションパッケージとして 4 つの API が定義されています。

Sun JavaTM Wireless Toolkit for CLDC エミュレータでは、SATSA を完全にサポートします。この章では、Sun JavaTM Wireless Toolkit for CLDC を使用して、アプリケーションで SATSA を操作する方法を説明します。

SATSA と小型デバイスでスマートデバイスを使用する方法の概要については、『SATSA Developer's Guide』(http://java.sun.com/j2me/docs/satsa-dg/) を参照してください。

Sun JavaTM Wireless Toolkit for CLDC には、Java Card Platform Simulator が含まれています。これを使用して、Sun JavaTM Wireless Toolkit for CLDC エミュレータのスロットでスマートカードをシミュレートできます。Java Card Platform Simulator は、次の場所にあります。


Windows:

toolkit¥bin¥cref.exe

Linux:

toolkit/bin/cref


 

以降では、単に cref と呼びます。

独自の Java Card アプリケーションを開発する必要がある場合は、http://java.sun.com/products/javacard/ で Java Card Development Kit をダウンロードしてください。


14.1 エミュレータのカードスロット

多くの場合、実際の SATSA デバイスには、スマートカードを収納する 1 つまたは複数のスロットが装備されます。SATSA を使用してスマートカードと通信するアプリケーションは、スロットとカードアプリケーションを指定する必要があります。

Sun JavaTM Wireless Toolkit for CLDC エミュレータは実際のデバイスではないため、スマートカード用の物理的なスロットはありません。代わりに、ソケットプロトコルを使用してスマートカードアプリケーションと通信します。ソケットの通信先はスマートカードシミュレータか、実際のスマートカードハードウェアと通信するプロキシになります。

Sun JavaTM Wireless Toolkit for CLDC エミュレータには、シミュレートされたスマートカードスロットが 2 つあります。各スロットには、スマートカードアプリケーションと通信するために使用されるプロトコルの端点を表すソケットが関連付けられています。各スロットにソケットのポート番号を設定できます。「編集」->「環境設定」を選択し、「SATSA」タブをクリックします。スロット 0 のデフォルトポートは 9025、スロット 1 は 9026 です。

図 14-1 スマートカードスロットのポート番号の設定


Preferences window with SATSA category shown sets Port # for slot 0 and slot 1, card emulator host name and simulator type.


14.2 Java Card Platform Simulator の使用

Sun JavaTM Wireless Toolkit for CLDC を使用して SATSA アプリケーションをテストする基本的な手順は、次のとおりです。

1. Java Card プラットフォームアプリケーションで cref を起動します。

2. Sun JavaTM Wireless Toolkit for CLDC エミュレータを起動します。

SATSA アプリケーションがスマートカードと通信を試みるときには、ソケット接続を使用して cref と通信します。

したがって、必ず Sun JavaTM Wireless Toolkit for CLDC の環境設定で指定したスロットのポート番号と同じポート番号を使って cref を起動することが重要です。

たとえば、構築済みのメモリーイメージを使ってポート 9025 で cref を実行する場合は、コマンド行で次のように入力します。

cref -p 9025 -i memory_image.eeprom

Sun JavaTM Wireless Toolkit for CLDC に含まれているデモアプリケーション Mohair では、SATSA の使用方法が説明されています。Mohair の実行手順の詳細については、付録 A を参照してください。


14.3 SATSA でのネットワークモニターの使用

Sun JavaTM Wireless Toolkit for CLDC では、シミュレートされたスマートカードアプリケーションと交換したデータをネットワークモニターに表示できます。ネットワークモニターには、エミュレータとスマートカードシミュレータ間で交換された APDU (Application Protocol Data Unit) が表示されます。また、Java Card Remote Method Invocation (Java Card RMI) プロトコルを使用して交換されたデータも表示できます。ネットワークモニターの「APDU」および「JCRMI」タブに、スマートカードと交換したデータが表示されます。

ネットワークモニターは各 APDU を解析し、要求と応答のフィールドを表示します。

図 14-2 ネットワークモニターでの APDU の表示


Network Monitor with APDU tab selected


14.4 アクセス制御の調整

アクセス制御のアクセス権と PIN プロパティーは、テキストファイルで指定できます。最初の APDU または Java Card RMI 接続が確立されると、実装は workdir¥appdb ディレクトリの acl_slot-number から ACL と PIN データを読み取ります。たとえば、スロット 0 のアクセス制御ファイルは、workdir¥appdb¥acl_0 です。ファイルがない場合またはファイルにエラーがある場合、このスロットのアクセス制御の検証は無効になります。

ファイルには、PIN プロパティーとアプリケーションのアクセス権に関する情報も指定できます。

14.4.1 PIN プロパティーの指定

PIN プロパティーは、アクセス制御ファイルの pin_data レコードで表されます。


pin_data {
    label string
    id number
    type       bcd | ascii | utf | half-nibble | iso
    min        minLength - 
    stored     storedLength
    max        maxLength
    reference  byte
    pad        byte - optional
    flag       case-sensitive | change-disabled |
               unblock-disabled | needs-padding |
               disable-allowed | unblockingPIN
   }

 

14.4.2 アプリケーションのアクセス権の指定

アプリケーションのアクセス権は、アクセス制御ファイル (acf) のレコードで定義されます。


acf AID fnumbers separated by blanks {
    ace {
         root CA name
         ...
         apdu {
                eight numbers separated by blanks
                ...
         }
         ...
         jcrmi {
                 classes {
                   classname
                   ...
                   }
                    hashModifier string
                    methods {
                   method name and signatiure
                   ...
                 }
         }
         ...
         pin_apdu {
                 id number
            verify | change | disable | enable | unblock
            four hexadecimal numbers
                 ...
         }
         ...
         pin_jcrmi {
                id number
            verify | change | disable | enable | unblock
            method name and signature
                ...
           }
        ...
        }
    ...
}

 

acf レコードはアクセス制御ファイルを表します。acf の後ろの AID は、アプリケーションを識別します。AID が指定されていない場合、エントリはすべてのアプリケーションに適用されます。acf レコードには、ace レコードを含めることができます。ace レコードがない場合、アプリケーションへのアクセスはこの acf によって制限されます。

ace レコードはアクセス制御エントリを表します。このレコードには、rootapdujcrmipin_apdu、および pin_jcrmi レコードを含めることができます。

root レコードには、1 つの CA 名を記述します。MIDlet スイートがこの CA によって発行された証明書を使用して承認されている場合、この ace はこの MIDlet へのアクセスを許可します。root フィールドが指定されていない場合は、識別された対象のすべてに ace が適用されることを示します。1 行に 1 つの主体を記述します。この行には、root と主体名だけを記述する必要があります。たとえば、次のように指定します。

root CN=thehost;OU=JCT;O=dummy CA;L=Santa Clara;ST=CA;C=US

apdu または jcrmi レコードは、APDU または Java Card RMI アクセス権を指定します。アクセス権レコードが指定されていない場合は、すべての操作が許可されます。

APDU アクセス権には、空白文字で区切られた 8 つの 16 進数の列が 1 つまたは複数含まれます。最初の 4 バイトは APDU コマンドを表し、残りの 4 バイトはマスクを表します。たとえば、次のように指定します。

apdu {
    0 20  0 82  0 20  0 82
    80 20  0  0 ff ff  0  0
}

Java Card RMI アクセス権には、ハッシュ修飾子 (オプション)、クラスリスト、およびメソッドリスト (オプション) に関する情報が含まれます。メソッドのリストが空の場合、アプリケーションはクラスのリストにあるすべてのリモートメソッドのインタフェースを呼び出すことができます。たとえば、次のように指定します。


jcrmi {
    classes {
             com.sun.javacard.samples.RMIDemo.Purse
    }
    hashModifier zzz
    methods {
        debit(S)V
        setAccountNumber([B)V
        getAccountNumber()[B
    }
}

 

すべての数値は 16 進数です。タブ、空白文字、復帰、および改行記号が、区切り文字として使用されます。{ および } の記号の前後では、区切り文字を省略できます。

pin_apdu および pin_jcrmi レコードには、PIN エントリメソッドに必要な情報が含まれます。これらの情報は、PIN 識別子、APDU コマンドヘッダー、またはリモートメソッド名です。

14.4.3 アクセス制御ファイルの例


pin_data {
  label   Unblock pin
  id        44
  type      utf
  min       4
  stored    8
  max       8
  reference 33
  pad       ff
  flag      needs-padding
  yflag     unblockingPIN
}
pin_data {
  label     Main pin
  id        55
  type      half-nibble
  min       4
  stored    8
  max       8
  reference 12
  pad       ff
  flag      disable-allowed
  flag      needs-padding
}
 
acf a0 0 0 0 62 ff 1 {
  ace {
        root CN=thehost;OU=JCT;O=dummy CA;L=Santa Clara;ST=CA;C=US
  
        pin_jcrmi {
            id 55
            verify enterPIN([B)S
            change changePIN([B[B)S
            disable disablePIN([B)S
            enable enablePIN([B)S
            unblock unblockPIN([B[B)S
           }
  }
}
 
acf a0 0 0 0 62 ee 1 {
  ace {
    root CN=thehost;OU=JCT;O=dummy CA;L=Santa Clara;ST=CA;C=US
 
    pin_apdu {
            id 55
            verify 1 2 3 1
            change 4 3 2 2
            disable 1 1 1 3 
            enable 5 5 5 4
            unblock 7 7 7 5
        }
  }
}
 
acf a0 0 0 0 62 3 1 c 8 1 {
  ace {
        root CN=thehost;OU=JCT;O=dummy CA;L=Santa Clara;ST=CA;C=US
 
        jcrmi {
                 classes {
                     com.sun.javacard.samples.RMIDemo.Purse
              }
                 hashModifier xxx
                 methods {
                   setAccountNumber([B)V
                   getBalance()S
                   credit(S)V
                 }
  }
}
  ace {
        jcrmi {
                classes {
                     com.sun.javacard.samples.RMIDemo.Purse
                  }
 
                  debit(S)V
                  getAccountNumber()[B
              }
            }
       }
  }
  
acf a0 00 00 00 62 03 01 0c 02 01 {
  ace {
        root CN=thehost;OU=JCT;O=dummy CA;L=Santa Clara;ST=CA;C=US
        apdu {
               0 20  0 82  0 20  0 82
               80 20  0  0 ff ff  0  0
             }
        apdu {
               80 22  0  0 ff ff  0  0
             }
        }
  }
acf a0 00 00 00 62 03 01 0c 02 01 {
 
  ace {
    apdu {
        0 20 0 82 ff ff ff ff
    }
  }
}
 
acf a0 00 00 00 62 03 01 0c 06 01 {
 
  ace {
    apdu {
        0 20 0 82 ff ff ff ff
    }
  }
}