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剩余空间相关推荐

  1. VC++获取磁盘剩余空间(附源码)

      VC++开发常用功能一系列文章 (欢迎订阅,持续更新...) 第23章:VC++获取磁盘剩余空间(附源码) 源代码demo已上传到百度网盘:永久生效  ,代码实现了获取任一磁盘的剩余空间,返回MB ...

  2. python获取磁盘剩余空间的方法

    #!/usr/bin/python # -*- coding: UTF-8 -*- """ @author: YangPC @time:2021/06/17 @QQ:32 ...

  3. RTX5 | 消息队列05 - 获取剩余空间,清空消息队列,删除消息队列

    文章目录 一.前言 二.实验目的 三.API 3.1.osMessageQueueGetSpace 3.2.osMessageQueueReset 3.3.osMessageQueueDelete 四 ...

  4. Qt linux获取cpu使用率、内存、网络收发速度、磁盘读写速度、磁盘剩余空间等

    Qt linux获取cpu使用率.内存.网络收发速度.磁盘读写速度.磁盘剩余空间等,实际上大部分都和qt无关的,用其他语言也可以获取. code: .h #ifndef RESOURCE_MINITO ...

  5. 通过zabbix数据库批量查询服务器最新磁盘剩余空间

    主要涉及两个sql sql1: select t1.hostid,t1.name from hosts t1 join hosts_groups t2 on t1.hostid=t2.hostid w ...

  6. 分区未分配linux,在Linux下对未分配剩余空间分区

    1.分区 #sudo fdisk -l Disk /dev/sda: 320.1 GB, 320072933376 bytes 255 heads, 63 sectors/track, 38913 c ...

  7. linux查询当前目录剩余空间,如何在linux下查看目录的剩余空间大小

    df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl 显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Siz ...

  8. ftp 文件完整性校验_FTP空间是什么?如何获取免费FTP空间吗?

    FTP是File Transfer Protocol的简称,又被称为文件传输协议,是一种将数据上传和下载到Internet的方式.FTP是一套公认的且简单的协议,是传输单个文件以及多个文件的一个最有效 ...

  9. 在不重装XP系统,增加系统盘剩余空间

    前一阵子,装了很多软件,什么VS2008,msdn等等. 虽然我每每在安装软件时,都将目标目录设为非系统盘,但随着软件数目的增多,我的系统盘很快还是被蚕食掉了(现在只剩下1G左右的空间). 还有很多软 ...

最新文章

  1. location.href使用方法总结
  2. burpsuite https 社区版_微软推出Visual Studio 2019 RC版 正式版预计四月到来
  3. phpMyAdmin安全配置
  4. Linux timer调用流程图,Linux应用层的定时器Timer使用详解【转】
  5. 逗号操作符以及(0,function)()
  6. Qt Creator配置项目
  7. JSON数据格式:以及XML文件格式,YML文件格式,properties文件格式
  8. sql server2008给数据表,字段,添加修改注释
  9. NumPy学习_00 ndarray的创建
  10. .netcore 开发的 iNeuOS 物联网平台部署在 Ubuntu 操作系统,无缝跨平台
  11. phpcms attachment.class.php路径,解决phpcms上传不了图片的方法
  12. 使用pyinstaller打包python程序时问题记录
  13. @property的相关属性
  14. Windows下 Nginx日志文件按计划时间自动分割、手动备份
  15. css 超出N行文本如何处理
  16. 医院预约挂号系统 ssm
  17. (最详细)红米手机5 Plus的USB调试模式在哪里开启的方法
  18. Postgresql动态执行EXECUTING语法解析过程
  19. 铁憨憨的Python 爬虫学习 Python_Learn
  20. 免费英文在线翻译-英文自动翻译

热门文章

  1. 京东购物在微信等场景下的算法应用实践
  2. P1616 疯狂的采药(洛谷,动态规划递推,完全背包)
  3. const指针和指向常量的指针
  4. js异步解决方案 --- 回调函数 vs promise vs generater/yield vs async/await
  5. AngualrJS之服务器端通信
  6. QT的常用对话框的应用
  7. C#json数据的序列化和反序列化(将数据转换为对象或对象集合)
  8. [渗透测试]扫目录,Sqlmap利用均超时,利用dirb扫描
  9. 通过VB向SQL Server数据库中录入数据
  10. 演示:两台交换机成环后的STP计算原则