2015-04-28 21 views
1

我寫了下面的程序,使用兩種不同的算法(ALG_SECURE_RANDOMALG_PSEUDO_RANDOM)生成不同長度的隨機數。隨機數據生成器小程序返回`0x6F00`

P1P2在APDU命令中按順序指定算法和隨機長度。

  • P1 = 0X01:ALG_SECURE_RANDOM
  • P1 = 0X02:ALG_PSEUDO_RANDOM
  • P2 =隨機數長度

    公共類RandGen延伸的Applet {

    byte[] generatedArray; 
    byte[] generatedRandom; 
    
    RandomData randomDataSecure = RandomData 
         .getInstance(RandomData.ALG_SECURE_RANDOM); 
    RandomData randomDataPseudo = RandomData 
         .getInstance(RandomData.ALG_PSEUDO_RANDOM); 
    
    private RandGen() { 
    } 
    
    public static void install(byte bArray[], short bOffset, byte bLength) 
         throws ISOException { 
        new RandGen().register(); 
    } 
    
    public void process(APDU apdu) throws ISOException { 
    
        if (selectingApplet()) { 
         return; 
        } 
    
        byte[] buffer = apdu.getBuffer(); 
    
        generatedArray = JCSystem.makeTransientByteArray(
          (short) buffer[ISO7816.OFFSET_P2], JCSystem.CLEAR_ON_DESELECT); 
    
        switch (buffer[ISO7816.OFFSET_P1]) { 
        case (0x01): 
         generatedRandom = secureRandomGenerator(apdu); 
         break; 
    
        case (0x02): 
         generatedRandom = pseudoRandomGenerator(apdu); 
         break; 
    
        default: 
         return; 
        } 
    
        Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0, 
          (short) ISO7816.OFFSET_P2); 
        apdu.setOutgoingAndSend((short) 0, (short) ISO7816.OFFSET_P2); 
    } 
    
    public byte[] secureRandomGenerator(APDU apdu) { 
        byte[] buffer = apdu.getBuffer(); 
        randomDataSecure.generateData(generatedArray, (short) 0, 
          (short) buffer[ISO7816.OFFSET_P2]); 
        return generatedArray; 
    } 
    
    public byte[] pseudoRandomGenerator(APDU apdu) { 
        byte[] buffer = apdu.getBuffer(); 
        randomDataPseudo.generateData(generatedArray, (short) 0, 
          (short) buffer[ISO7816.OFFSET_P2]); 
        return generatedArray; 
    } 
    

    }

冠文件生成並上傳成功上牌,但是當我發送APDU命令到卡上,我收到了0X6F00狀態字:

OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000202 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 02 02 
Received (SW1=0x90, SW2=0x00) 

OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000102 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 01 02 
Received (SW1=0x6F, SW2=0x00) 

有什麼錯在我的小程序?


更新:

基於親愛的@ Vojta開發的回答,我在process()方法替代

Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0, 
     (short) ISO7816.OFFSET_P2); 
apdu.setOutgoingAndSend((short) 0, (short) ISO7816.OFFSET_P2); 

隨着下面幾行:

Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0, 
      (short) buffer[ISO7816.OFFSET_P2]); 
    apdu.setOutgoingAndSend((short) 0, (short) buffer[ISO7816.OFFSET_P2]); 

現在我有一個奇怪的輸出在OpenSC-工具輸出:

安全隨機數生成器:

OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000110 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 01 10 
Received (SW1=0x90, SW2=0x00): 
B8 1F 80 25 A2 8E 25 30 F8 22 F8 40 0F AE B0 6C ...%..%0."[email protected] 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00         ..... 

OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000110 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 01 10 
Received (SW1=0x6F, SW2=0x00) 

OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000110 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 01 10 
Received (SW1=0x90, SW2=0x00): 
F6 45 A9 0C 0C 3B 3A 5A 5F DC A8 36 .E...;:Z_..6 

僞隨機數生成器:

OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000210 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 02 10 
Received (SW1=0x90, SW2=0x00): 
37 FD FC 67 EB 9E 21 00 6B E9 44 A7 21 3F 31 9A 7..g..!.k.D.!?1. 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
00 00 00 00 00 00 00       ....... 

OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000210 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 02 10 
Received (SW1=0x6F, SW2=0x00) 

OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000210 
Using reader with a card: ACS CCID USB Reader 0 
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00 
Received (SW1=0x90, SW2=0x00) 
Sending: 00 00 02 10 
Received (SW1=0x90, SW2=0x00): 
72 FE 48 1B 9A A0 BD 2D DF F9 E7 F8 58 CF B7 C0 r.H....-....X... 
00 00 00 00 00 00 00 00 00 00 00    ........... 

爲什麼我有一個簡單的命令不同的輸出?

+0

請注意,「ALG_PSEUDO_RANDOM」和「ALG_SECURE_RANDOM」的含義是有爭議的話題。更好地諮詢您的用戶手冊實際返回的內容。哦,並且不要在進程方法中實例化對象,甚至不是瞬態字節數組(除非它是個性化的一部分)。 –

+0

_not甚至瞬時字節數組,在過程method_ **爲什麼?** +++ _...除非它是個性化的一部分_ **爲了個性化,我們在處理方法中實例化對象?爲什麼?** – Abraham

+0

因爲您的卡將耗盡資源(EEPROM或RAM)。垃圾收集器並不像真正的Java那樣可靠。如果你確實需要在process方法中實例化對象,請使用額外的標誌,以便僅創建一次。 – David

回答

3

你的代碼中有一個小錯誤。你想

Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0, 
      (short) buffer[ISO7816.OFFSET_P2]); 

,而不是

Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0, 
      (short) ISO7816.OFFSET_P2); 

一般規則:始終環繞你process方法用try-catch塊,並根據類型和異常的原因設置狀態字的內容。否則,你只能得到6F00,你不知道發生了什麼。如果你遵循這個規則,你會知道ArrayIndexOutOfBoundsException被拋出。

答案更新:

古怪的輸出是由事實造成的,即

Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0, 
      (short) buffer[ISO7816.OFFSET_P2]); 
apdu.setOutgoingAndSend((short) 0, (short) buffer[ISO7816.OFFSET_P2]); 

一些隨機值覆蓋buffer[ISO7816.OFFSET_P2],然後該值在下一行使用。你應該在RAM存儲buffer[ISO7816.OFFSET_P2]process方法的開頭:

final byte p2 = buffer[ISO7816.OFFSET_P2]; 

回答以下評論:

你有麻煩了P2> = 0x80的,因爲鑄造byteshort的。不幸的是,JavaCard將字節作爲有符號處理,這就是爲什麼您的P2> = 0x80的長度爲負數的原因。你可以很容易地避免這種情形:

final short outputLen = (short) (buffer[ISO7816.OFFSET_P2] & 0xFF); 
+0

也許這是一個但是,但可能不是唯一的: 'generatedRandom'永遠不會被實例化。 –

+1

@MaartenBodewes generatedRandom只是一個指向generatedArray的指針...不要問我爲什麼。 – vojta

+0

@vojta我認爲Bodewes先生的評論是正確的。我可以問你爲什麼'generatedRandom'是一個指向'generatedArray'的指針嗎?謝謝。 – Abraham

0

命令不支持 你打錯指令連接在一起。