分享
 
 
 

Java Card开发常用的包(整理)

王朝学院·作者佚名  2009-11-10
窄屏简体版  字體: |||超大  

整理了一下常用到的Java卡开发包里的方法,以后就能加快开发速度了。

//Java Card开发方法查询

import java.lang.*;

import javacard.framework.*;

import javacard.security.*;

import javacardx.crypto.*; //该包为扩展包

//install方法

public static void install(byte[] bArray, short offset, byte length)

{

new wallet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);

}

/************************************************************************************/

//建立类JCSystem中的临时数组的方法

/*每个方法调用中的第一个参数 length 指出所请求的临时数组的长度。

第二个参数 event 指出哪种事件清除该对象。因此,方法调用指出临

时数组的类型,CLEAR_ON_RESET 或CLEAR_ON_DESELECT。

*/

//建立一个临时布尔数组

Public static boolean[] MakeTransientBooleanArray(short length,byte event);

//建立一个临时字节数组

Public static byte[] MakeTransientByteArray(short length,byte event);

//建立一个临时short数组

Public static short[] MakeTransientShortArray(short length,byte event)

//建立一个临时对象数组

Public static object[] MakeTransientObjectArray(short length,byte event)

/*

方法 isTransient 返回一个临时类型常数(CLEAR_ON_RESET 或 CLEAR_ON_DESELECT),

或者返回常数 JCSystem.NOT_A_TRANSIENT_OBJECT 指出该对象是 null 或者是一个永久对象

*/

public static byte isTransient(Object theObject);

/************************************************************************************/

//原子性

/*

Util.arrayCopy方法保证要么所有的字节被正确地拷贝,要么目标数组被恢复为其原来的字节值。

如果该目标数组是临时的,就不具有原子特性。

*/

public static short arrayCopy(byte[] src,short srcOff,byte[] dest,short desOff,short length);

//方法arrayCopyNonAtomic在拷贝操作过程中不使用事务设施,即使一个事务正在执行之中。

public static short arrayCopyNonAtomic(byte[] src,short srcOff,byte[] dest,short desOff,short length);

//用指定的值填入一个字节数组的诸元素:

public static short arrayFillNonAtomic(byte[] bArray,short bOff,short bLen,byte bValue);

//事务的提交

//开始一个交易

JCSysten.beginTransaction();

//在该交易提交之前,一组永久数据的修改中的全部修改都是暂时的

//提交一个事物

JCSysten.commitTransaction();

//返回一个commit buffer中的字节总数

JCSystem.getMaxCommitCapacity();

//返回在该commit buffer中剩下未用的字节数

JCSystem.getUnusedCommitCapacity()

/************************************************************************************/

javacard.framework.Applet 中的方法

//JCRE调用这个静态方法建立Applet子类的一个实例

Public static void Install(byte[] bArray,short bOffset,byte bLength)

//示例

public class WalletApp extends Applet{

private log transaction_log;

private byte[] wallet_id;

private byte wallet_balance;

public static void install(byte[] bArray, short bOffset,byte bLength){

new WalletApp();

}

private WalletApp(){

//建立一个具有指定事物记录数的事物日志

transaction_log = new Log(TRAN_RECORD_NUM);

//建立一个字节数组用以存储钱包wallet的ID

wallet_id = new byte[ID_LENGTH];

//初始化钱包wallet的余额

wallet_balance = INITIAL_BALANCE;

//向JCRE注册该applet实例

register();

}

}

//安装参数处理示例

private walletApp(byte[] bArray,short bOffset,byte bLength){

//建立一个事物日志并指出最大的日志记录数 max_record_num = bArray[bOffset]

transaction_log = new Log(bArray[bOffset++]);

//设置钱包ID

wallet_ID = new byte[ID_LENGTH];

Util.arrayCopy(bArray,bOffset,wallet_id,(byte)0,ID_LENGTH);

//bOffset前进ID_LENGTH个字节

bOffset += ID_LENGTH;

//初始化钱包余额

wallet_balabce = bArray[bOffset++];

//检查AID

byte AID_len = bArray[bOffset++];

if (AID_len = =0){

//利用缺省AID向LCRE注册applet实例

this.register();

}else{

//利用安装参数中指出的AID向JCRE注册applet实例

//bArray中的AID字节从索引bOffset开始,由AID_len个字节组成

this.register(bArray,bOffset,AID_len);

}

}

//该方法由applet用来向JCRE注册本applet实例并指定CAP文件中的缺省AID给本applet实例

Protected final void Register()

//该方法由applet用来向JCRE注册本applet实例并将数组bArray中指出的AID赋予该applet实例。

Protected final void Register(byte[] bArray,short bOffset,byte bLength)

/************************************************************************************/

//JCRE调用这个方法通知该applet它已经被选择。

Public boolean Select()

//JCRE调用这个方法指示该applet处理一个输入的APDU命令。

Public abstract void Process(APDU apdu)

//JCRE调用这个方法通知当前选择的applet另一个(或同一个)applet将被选择。

Public void deselect()

//索取APDU buffer

public void process(APDU apdu){

byte[] apdu_buffer = apdu.getBuffer();

}

//设置JCRE为数据接受模式,返回它所读入的字节数,如果无数据,则返回0

public short setIncomingAndReceive()throws APDUExcetion;

//数据读示例

public void process(APDU apdu){

byte[] apdu_buffer = =apdu.getbuffer();

short total_bytes = (short)(apdu_buffer[ISO7816.OFFSET_LC] & 0xFF);

//读数据至APDU buffer

short read_count = apdu.setIncomingAndReceive();

//获得剩余字节数

short bytes_left = (short)(total_bytes – read_count);

while(true){

//处理APDU Buffer中的数据或者将数据拷贝到内部buffer

……

//检查是否还有剩余数据,如果无,跳出循环。

If (bytes_left <=0) break;

//如果有剩余数据,在读数据。

Read_count = apdu.receiveBytes((short)0);

Bytes_left -= read_count;

}

//执行其它任务和向host送回响应

……

}

//重新设置数据传送方向为输出,置JCRE为数据发送模式.剩余的输入数据将被丢弃,并且applet就不能再继续接收命令数据

Public short setOutgoing() throws APDUException;

//调用了setOutgoing方法之后,applet必须调用setOutgoingLength方法,以向host指出它将实际发送总共多少响应数据字节(不包括SW)

public void setOutgoingLength(short length) throws APDUException;

//sendBytes方法从APDU Buffer中指定位移bOff处发送len个数据字节.因此,applet在调用这个方法之前,必须在APDU Buffer中生成响应数据或从别处拷贝过来。

public void sendBytes(short bOff,short len) throws APDUException;

//示例

public void process(APDU apdu){

//接收和处理命令APDU

……

//现在准备好发送响应数据

//首先设置JCRE为数据发送模式并获得期望的行应数据长度(Le)

short le = apdu.setOutgoing();

//接着通知host:applet将实际发送10个字节

apdu.setOugoingLength((short)10);

//在APDU Buffer中准备数据,从位移0开始

……

//准备结束时,发送数据

apdu.sendBytes((short)0,(short)10);

}

//设置传输模式为发送,设置响应数据长度为len,从APDU Buffer 位移bOff起发送响应数据字节

public void setOutgoingAndSend(short bOff,short len) throws APDUException;

//sendBytesLong方法从字节数组outDATA中的位移bOff开始处发送len字节数据.仅当已经先调用了setOutgoing和setOutgoingLength方法之后,它才能被调用。

public void sendBytesLong(byte[] outDATA,short bOff,short len) throws APDUException;

//示例

//Get_Account_Info命令APDU要求applet发送账号拥有者的名字、账号,和截止日期。

//另外,要求applet发送由名字、账号,和截止日期计算的hash值,以确保数据正确传输。

//applet将账号持有者的名字、账号,和截止日期存储在独立的字节数组中。

Private byte[] name; //20字节

Private byte[] account_number; //9字节

Private byte[] expiration+date; //4字节

//在处理了命令APDU后,applet现在准备好发送响应数据。

//响应数据中的字节数为:

//total_bytes = 20(name)+9(account_number)+4(expiration_date)+8(hash值)=41字节

short total_bytes = (short)41;

//step1:

//设置数据传输方向为输出

short le = apdu.setOutgoing;

//step2:

//通知host响应中的实际字节数

apdu.setOutgongLength(nametotaal_bytes);

//step3:

//发送name

apdu.sendBytesLong(name,(short)0, (short)name.length);

//发送账号

apdu.sendBytesLong(account_number,(short)0, (short) account_number.length);

//发送机制日期

apdu.sendBytesLong(expiration_date,(short)0, (short) expiration_date.length);

//现在,在APDU Buffer中计算shah值,

//假定于位移0处生成hash值

//……

//发送shah值

apdu.sendBytes((short)0,HASH_VALUE_LENGTH);

//现在返回

return;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有