2016-11-28 4 views
3

カードと端末の間に安全なチャネルを生成したい。これは私のコードです:私は、コマンド80 50 20 00 08 01 15 6A 2A F5 64 87 CF私はエラー6a88を取得し、私はコマンド00 50 20 00 08 01 15 6A 2A F5 64 87 CFを送信するとき、私はエラーを取得し6e00を送信カードと端末の間に安全なチャネルを生成する

final static byte INIT_UPDATE  = (byte) 0x50; 
    final static byte EXT_AUTHENTICATE = (byte) 0x82; 
    SecureChannel sc; 

    public void process(APDU apdu) throws ISOException { 
     if (selectingApplet()) { 
     return; 
     } 
     byte[] buffer = apdu.getBuffer(); 
     short inlength = 0; 

     try 
     { 
     switch (buffer[ISO7816.OFFSET_INS]) { 

     case INIT_UPDATE: 
      case EXT_AUTHENTICATE: 
        makeSecureChannel(apdu); 
       break; 
    } 
    catch (CryptoException e) 
    { 
      short r = e.getReason(); 
      ISOException.throwIt(r); 
     } 

}

private void makeSecureChannel(APDU apdu) 
{ 

    byte[] buf = apdu.getBuffer(); 
    byte cla = buf[ISO7816.OFFSET_CLA]; 
    byte ins = buf[ISO7816.OFFSET_INS]; 

    try 
    { 
    apdu.setIncomingAndReceive(); 
    if(ins == INIT_UPDATE) 
    { 
     sc = GPSystem.getSecureChannel();  
    } 

    short len = sc.processSecurity(apdu); 

    apdu.setOutgoing(); 
    apdu.setOutgoingLength(len); 
    apdu.sendBytes(ISO7816.OFFSET_CDATA, (short) len); 
    } 
    catch(APDUException ex1) 
    { 
     ISOException.throwIt(ex1.getReason()); 
    }  
} 

。 全身で私を助けることができますか?

+0

エラーを特定のコード行にローカライズできますか?デバッグできますか?カードがこのグローバルプラットフォームAPI呼び出しをサポートしていますか? –

+0

APDUコマンドを送信する前にアプレットを選択しましたか?キーバージョン== 0x20のカードにキーセットがありますか?いいえの場合は、0x20を0x00に置き換えます。 – Abraham

答えて

2

ステータスワード6E00はあまり面白くありません。これは、間違ったCLA(クラス)バイトを送信していることを意味します。 INITIALIZE UPDATEはISO 7816で定義されていないため、プロプライエタリなコマンドです。プロプライエタリなコマンドは独自のビットを設定する必要があります。そのため、クラスバイト80は唯一正しいものです。

それでは、INIT UPDATE:6A88の反応に注目しましょう。 6A88は「参照データが見つかりません」という意味です。これは、P1とP2で参照されるキーが一致しないことを意味します。 P1とP2の両方を00に設定して、キーが自動的に選択されていることを確認します(P1のキーバージョンを明示的に選択する場合は、応答データの「キー情報」を確認してください)。

関連する問題