日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

如何获取JavaCard剩余空间

發布時間:2023/12/20 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何获取JavaCard剩余空间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0x01應用場景

獲取JavaCard卡內剩余空間,一方面是在評估一張卡的時候需要用到,另一方面是在應用個人化或者運行時需要用到。

例如:應用提供商為了保證自己的應用在卡內運行期間能夠不受空間影響,一般會在個人化(安裝應用)的時候先分配好需要用到的空間,以免空間被后來應用占用,導致運行失敗。

0x02空間類型

卡內剩余空間包括獲取卡內的剩余永久存儲器(E2P or Flash),還有獲取易失性存儲器空間(RAM),這里的RAM分為兩部分,一部分是在卡片復位時清零的內存CLEAR_ON_RESET,縮寫為COR或者RTR(Clear_on_Reset Transient RAM);另一部分為應用在取消選擇的時候清零的內存CLEAR_ON_DESELECT,縮寫為COD或者DTR(Clear_on_Deselect Transient RAM)。本文將通過實例獲取卡內的這三種存儲器剩余空間。

0x03獲取接口

對于獲取JavaCard內可用空間,API提供了相應的接口JCSystem.getAvaliableMemory(byte memoryType) ,位于javacard.framework包下,如下所示,引用自JCAPI v2.2.2。?

?

getAvailableMemory

public static short getAvailableMemory(byte?memoryType)throws SystemException
Obtains the amount of memory of the specified type that is available to the applet. Note that implementation-dependent memory overhead structures may also use the same memory pool.

Notes:

  • The number of bytes returned is only an upper bound on the amount of memory available due to overhead requirements.
  • Allocation of CLEAR_ON_RESET transient objects may affect the amount of CLEAR_ON_DESELECT transient memory available.
  • Allocation of CLEAR_ON_DESELECT transient objects may affect the amount of CLEAR_ON_RESET transient memory available.
  • If the number of available bytes is greater than 32767, then this method returns 32767.
  • The returned count is not an indicator of the size of object which may be created since memory fragmentation is possible.

?

Parameters:
memoryType?- the type of memory being queried. One of the?MEMORY_TYPE_*?constants defined above. See?MEMORY_TYPE_PERSISTENT.
Returns:
the upper bound on available bytes of memory for the specified type
Throws:
SystemException?- with the following reason codes:
  • SystemException.ILLEGAL_VALUE?if?memoryType?is not a valid memory type.

??根據接口描述,如果可用字節數超過32767(0x3FFF),則只返回32767。那如何返回超過32767的空間,可參考本文后面的代碼實例。

0x04代碼實例

1.獲取DTR剩余空間

1 /** 2 * 獲取剩余MEMORY_TYPE_TRANSIENT_DESELECT空間 3 * @return 4 */ 5 public int getFreeDTR(){ 6 //首先取得剩余空間大小 7 short memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_DESELECT); 8 int allmemsize = memsize; 9 //如果返回值為0x3FFF,則剩余空間大于此值,可繼續取得剩余空間 10 while(memsize == (short)32767){ 11 JCSystem.makeTransientByteArray(memsize,JCSystem.MEMORY_TYPE_TRANSIENT_DESELECT);//不存儲返回的數組對象 12 memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_DESELECT); 13 allmemsize += memsize; 14 } 15 return allmemsize; 16 }

?2.獲取RTR剩余空間

1 /** 2 * 獲取剩余的MEMORY_TYPE_TRANSIENT_RESET空間 3 * @return 4 */ 5 public int getFreeRTR(){ 6 //首先取得剩余空間大小 7 short memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_RESET); 8 int allmemsize = memsize; 9 //如果返回值為0x3FFF,則剩余空間大于此值,可繼續取得剩余空間 10 while(memsize == (short)32767){ 11 JCSystem.makeTransientByteArray(memsize,JCSystem.MEMORY_TYPE_TRANSIENT_RESET);//不存儲返回的數組對象 12 memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_RESET); 13 allmemsize += memsize; 14 } 15 return allmemsize; 16 }

?3.獲取E2P/Flash的剩余空間

1 /** 2 * 獲取剩余的E2P/Flash空間,如果剩余空間大于0x3FFF,則此接口將創建數組,然后再獲取新的剩余空間, 3 * 數組對象頭將占用幾個字節(根據對象存儲結構不一樣,可能占用字節數不同,一般數組頭為7字節),因此存在誤差。 4 * @return 5 */ 6 public int getFreePersistent(){ 7 //首先取得剩余空間大小 8 short memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_PERSISTENT); 9 int allmemsize = memsize; 10 //如果返回值為0x3FFF,則剩余空間大于此值,可繼續取得剩余空間 11 while(memsize == (short)32767){ 12 byte[] tmp=new byte[memsize]; //不存儲返回的數組對象 13 memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_PERSISTENT); 14 allmemsize += memsize; 15 } 16 return allmemsize; 17 }

?注意

1.獲取剩余空間的應用自身的代碼需要占用部分空間,本例中的應用代碼主468字節,存儲在卡內空間為 278 字節.

2.DTR與RTR可能使用同一塊區域。

3.以上代碼在使用converter轉成cap文件時需要加上支持int類型的選項,如果卡片本身不支持int,則代碼中相應的地方需要做調整,譬如說如果卡內相應存儲器空間大于0x3FFF時,可以將每次取得的值存儲在apdubuffer中,一起返回到卡外,然后再計算。?

完整代碼

1 package GetFreeSpacePkg; 2 3 import javacard.framework.APDU; 4 import javacard.framework.ISO7816; 5 import javacard.framework.Applet; 6 import javacard.framework.ISOException; 7 import javacard.framework.JCSystem; 8 9 /** 10 * 獲取卡內剩余空間,包括E2P/Flash與RAM. 11 * 對于E2P/Flash來說,如果卡內剩余空間超過0x3FFF,則此應用返回的數據會有較小的誤差。 12 * 測試命令: 13 * 14 * 8000000000 //get DTR 15 * 8001000000 //get RTR 16 * 8002000000 //get E2P/Flash 17 * 18 * @author SCPlatform@outlook.com 19 */ 20 public class GetFreeSpaceApplet extends Applet { 21 public static void install(byte[] bArray, short bOffset, byte bLength) { 22 new GetFreeSpaceApplet().register(bArray, (short) (bOffset + 1),bArray[bOffset]); 23 } 24 25 public void process(APDU apdu) { 26 if (selectingApplet()) { 27 return; 28 } 29 30 byte[] buf = apdu.getBuffer(); 31 int iFreeSpace=0; 32 switch (buf[ISO7816.OFFSET_INS]) { 33 case (byte) 0x00://DTR 34 iFreeSpace = getFreeDTR(); 35 break; 36 case (byte) 0x01://RTR 37 iFreeSpace = getFreeRTR(); 38 break; 39 case (byte) 0x02://persistent 40 iFreeSpace = getFreePersistent(); 41 break; 42 default: 43 ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 44 } 45 JCSystem.requestObjectDeletion(); 46 buf[3]=(byte)(iFreeSpace); 47 buf[2]=(byte)(iFreeSpace>>8); 48 buf[1]=(byte)(iFreeSpace>>16); 49 buf[0]=(byte)(iFreeSpace>>24); 50 apdu.setOutgoingAndSend((short)0, (short)4); 51 } 52 /** 53 * 獲取剩余MEMORY_TYPE_TRANSIENT_DESELECT空間 54 * @return 55 */ 56 public int getFreeDTR(){ 57 //首先取得剩余空間大小 58 short memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_DESELECT); 59 int allmemsize = memsize; 60 //如果返回值為0x3FFF,則剩余空間大于此值,可繼續取得剩余空間 61 while(memsize == (short)32767){ 62 JCSystem.makeTransientByteArray(memsize,JCSystem.MEMORY_TYPE_TRANSIENT_DESELECT);//不存儲返回的數組對象 63 memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_DESELECT); 64 allmemsize += memsize; 65 } 66 return allmemsize; 67 } 68 69 /** 70 * 獲取剩余的MEMORY_TYPE_TRANSIENT_RESET空間 71 * @return 72 */ 73 public int getFreeRTR(){ 74 //首先取得剩余空間大小 75 short memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_RESET); 76 int allmemsize = memsize; 77 //如果返回值為0x3FFF,則剩余空間大于此值,可繼續取得剩余空間 78 while(memsize == (short)32767){ 79 JCSystem.makeTransientByteArray(memsize,JCSystem.MEMORY_TYPE_TRANSIENT_RESET);//不存儲返回的數組對象 80 memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_RESET); 81 allmemsize += memsize; 82 } 83 return allmemsize; 84 } 85 86 /** 87 * 獲取剩余的E2P/Flash空間,如果剩余空間大于0x3FFF,則此接口將創建數組,然后再獲取新的剩余空間, 88 * 數組對象頭將占用幾個字節(根據對象存儲結構不一樣,可能占用字節數不同,一般數組頭為7字節),因此存在誤差。 89 * @return 90 */ 91 public int getFreePersistent(){ 92 //首先取得剩余空間大小 93 short memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_PERSISTENT); 94 int allmemsize = memsize; 95 //如果返回值為0x3FFF,則剩余空間大于此值,可繼續取得剩余空間 96 while(memsize == (short)32767){ 97 byte[] tmp=new byte[memsize]; //不存儲返回的數組對象 98 memsize = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_PERSISTENT); 99 allmemsize += memsize; 100 } 101 return allmemsize; 102 } 103 }

?0x05資料參考

1.Application Programming Interface Java Card? Platform, Version 2.2.2

轉載于:https://www.cnblogs.com/SCPlatform/archive/2012/01/12/5125200.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的如何获取JavaCard剩余空间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。