国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Java Card開發(fā)常用的包(整理)

2019-11-17 04:05:26
字體:
供稿:網(wǎng)友
 整理了一下常用到的java卡開發(fā)包里的方法,以后就能加快開發(fā)速度了。

//Java Card開發(fā)方法查詢
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中的臨時數(shù)組的方法
/*每個方法調(diào)用中的第一個參數(shù) length 指出所請求的臨時數(shù)組的長度。
第二個參數(shù) event 指出哪種事件清除該對象。因此,方法調(diào)用指出臨
時數(shù)組的類型,CLEAR_ON_RESET 或CLEAR_ON_DESELECT。
*/
//建立一個臨時布爾數(shù)組
Public static boolean[] MakeTransientBooleanArray(short length,byte event);

//建立一個臨時字節(jié)數(shù)組
Public static byte[] MakeTransientByteArray(short length,byte event);

//建立一個臨時short數(shù)組
Public static short[] MakeTransientShortArray(short length,byte event)

//建立一個臨時對象數(shù)組
Public static object[] MakeTransientObjectArray(short length,byte event)

/*
方法 isTransient 返回一個臨時類型常數(shù)(CLEAR_ON_RESET 或 CLEAR_ON_DESELECT),
或者返回常數(shù) JCSystem.NOT_A_TRANSIENT_OBJECT 指出該對象是 null 或者是一個永久對象
*/
public static byte isTransient(Object theObject);


/************************************************************************************/
//原子性
/*
Util.arrayCopy方法保證要么所有的字節(jié)被正確地拷貝,要么目標數(shù)組被恢復為其原來的字節(jié)值。
如果該目標數(shù)組是臨時的,就不具有原子特性。
*/
public static short arrayCopy(byte[] src,short srcOff,byte[] dest,short desOff,short length);

//方法arrayCopyNonAtomic在拷貝操作過程中不使用事務設(shè)施,即使一個事務正在執(zhí)行之中。
public static short arrayCopyNonAtomic(byte[] src,short srcOff,byte[] dest,short desOff,short length);

//用指定的值填入一個字節(jié)數(shù)組的諸元素:
public static short arrayFillNonAtomic(byte[] bArray,short bOff,short bLen,byte bValue);


//事務的提交
//開始一個交易
JCSysten.beginTransaction();
//在該交易提交之前,一組永久數(shù)據(jù)的修改中的全部修改都是暫時的
//提交一個事物
JCSysten.commitTransaction();

//返回一個commit buffer中的字節(jié)總數(shù)
JCSystem.getMaxCommitCapacity();
//返回在該commit buffer中剩下未用的字節(jié)數(shù)
JCSystem.getUnusedCommitCapacity()


/************************************************************************************/
javacard.framework.Applet 中的方法
//JCRE調(diào)用這個靜態(tài)方法建立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(){
   //建立一個具有指定事物記錄數(shù)的事物日志
   transaction_log = new Log(TRAN_RECORD_NUM);
   //建立一個字節(jié)數(shù)組用以存儲錢包wallet的ID
   wallet_id = new byte[ID_LENGTH];
   //初始化錢包wallet的余額
   wallet_balance = INITIAL_BALANCE;
   //向JCRE注冊該applet實例
   register();
}
}

//安裝參數(shù)處理示例
private walletApp(byte[] bArray,short bOffset,byte bLength){
//建立一個事物日志并指出最大的日志記錄數(shù) max_record_num = bArray[bOffset]
transaction_log = new Log(bArray[bOffset++]);
//設(shè)置錢包ID
wallet_ID = new byte[ID_LENGTH];
Util.arrayCopy(bArray,bOffset,wallet_id,(byte)0,ID_LENGTH);
//bOffset前進ID_LENGTH個字節(jié)
bOffset += ID_LENGTH;
//初始化錢包余額
wallet_balabce = bArray[bOffset++];
//檢查AID
byte AID_len = bArray[bOffset++];
if (AID_len = =0){
      //利用缺省AID向LCRE注冊applet實例
      this.register();
}else{
      //利用安裝參數(shù)中指出的AID向JCRE注冊applet實例
      //bArray中的AID字節(jié)從索引bOffset開始,由AID_len個字節(jié)組成
      this.register(bArray,bOffset,AID_len);
}
}


//該方法由applet用來向JCRE注冊本applet實例并指定CAP文件中的缺省AID給本applet實例
Protected final void Register()

//該方法由applet用來向JCRE注冊本applet實例并將數(shù)組bArray中指出的AID賦予該applet實例。
Protected final void Register(byte[] bArray,short bOffset,byte bLength)


/************************************************************************************/
//JCRE調(diào)用這個方法通知該applet它已經(jīng)被選擇。
Public boolean Select()

//JCRE調(diào)用這個方法指示該applet處理一個輸入的APDU命令。
Public abstract void Process(APDU apdu)

//JCRE調(diào)用這個方法通知當前選擇的applet另一個(或同一個)applet將被選擇。
Public void deselect()

//索取APDU buffer
public void process(APDU apdu){
byte[] apdu_buffer = apdu.getBuffer();
}

//設(shè)置JCRE為數(shù)據(jù)接受模式,返回它所讀入的字節(jié)數(shù),如果無數(shù)據(jù),則返回0
public short setIncomingAndReceive()throws APDUExcetion;

//數(shù)據(jù)讀示例
public void process(APDU apdu){
byte[] apdu_buffer = =apdu.getbuffer();
    short total_bytes = (short)(apdu_buffer[ISO7816.OFFSET_LC] & 0xFF);

    //讀數(shù)據(jù)至APDU buffer   
    short read_count = apdu.setIncomingAndReceive();

    //獲得剩余字節(jié)數(shù)
    short bytes_left = (short)(total_bytes – read_count);

    while(true){

   //處理APDU Buffer中的數(shù)據(jù)或者將數(shù)據(jù)拷貝到內(nèi)部buffer
   ……

   //檢查是否還有剩余數(shù)據(jù),如果無,跳出循環(huán)。
   If (bytes_left <=0) break;
   //如果有剩余數(shù)據(jù),在讀數(shù)據(jù)。
   Read_count = apdu.receiveBytes((short)0);

   Bytes_left -= read_count;

}
    //執(zhí)行其它任務和向host送回響應
    ……
}

//重新設(shè)置數(shù)據(jù)傳送方向為輸出,置JCRE為數(shù)據(jù)發(fā)送模式.剩余的輸入數(shù)據(jù)將被丟棄,并且applet就不能再繼續(xù)接收命令數(shù)據(jù)
Public short setOutgoing() throws APDUException;

//調(diào)用了setOutgoing方法之后,applet必須調(diào)用setOutgoingLength方法,以向host指出它將實際發(fā)送總共多少響應數(shù)據(jù)字節(jié)(不包括SW)
public void setOutgoingLength(short length) throws APDUException;

//sendBytes方法從APDU Buffer中指定位移bOff處發(fā)送len個數(shù)據(jù)字節(jié).因此,applet在調(diào)用這個方法之前,必須在APDU Buffer中生成響應數(shù)據(jù)或從別處拷貝過來。
public void sendBytes(short bOff,short len) throws APDUException;

//示例
public void process(APDU apdu){
    //接收和處理命令APDU
    ……
    //現(xiàn)在準備好發(fā)送響應數(shù)據(jù)   
    //首先設(shè)置JCRE為數(shù)據(jù)發(fā)送模式并獲得期望的行應數(shù)據(jù)長度(Le)
    short le = apdu.setOutgoing();
    //接著通知host:applet將實際發(fā)送10個字節(jié)    
    apdu.setOugoingLength((short)10);
    //在APDU Buffer中準備數(shù)據(jù),從位移0開始
    ……
    //準備結(jié)束時,發(fā)送數(shù)據(jù)
    apdu.sendBytes((short)0,(short)10);
}

//設(shè)置傳輸模式為發(fā)送,設(shè)置響應數(shù)據(jù)長度為len,從APDU Buffer 位移bOff起發(fā)送響應數(shù)據(jù)字節(jié)
public void setOutgoingAndSend(short bOff,short len) throws APDUException;

//sendBytesLong方法從字節(jié)數(shù)組outDATA中的位移bOff開始處發(fā)送len字節(jié)數(shù)據(jù).僅當已經(jīng)先調(diào)用了setOutgoing和setOutgoingLength方法之后,它才能被調(diào)用。
public void sendBytesLong(byte[] outDATA,short bOff,short len) throws APDUException;

//示例
//Get_Account_Info命令APDU要求applet發(fā)送賬號擁有者的名字、賬號,和截止日期。
//另外,要求applet發(fā)送由名字、賬號,和截止日期計算的hash值,以確保數(shù)據(jù)正確傳輸。
//applet將賬號持有者的名字、賬號,和截止日期存儲在獨立的字節(jié)數(shù)組中。

Private byte[] name;           //20字節(jié)
Private byte[] account_number; //9字節(jié)
Private byte[] expiration+date;   //4字節(jié)

//在處理了命令APDU后,applet現(xiàn)在準備好發(fā)送響應數(shù)據(jù)。
//響應數(shù)據(jù)中的字節(jié)數(shù)為:
//total_bytes = 20(name)+9(account_number)+4(expiration_date)+8(hash值)=41字節(jié)

short total_bytes = (short)41;

//step1:
//設(shè)置數(shù)據(jù)傳輸方向為輸出
short le = apdu.setOutgoing;
//step2:
//通知host響應中的實際字節(jié)數(shù)
apdu.setOutgongLength(nametotaal_bytes);
//step3:
//發(fā)送name
apdu.sendBytesLong(name,(short)0, (short)name.length);
//發(fā)送賬號
apdu.sendBytesLong(account_number,(short)0, (short) account_number.length);
//發(fā)送機制日期
apdu.sendBytesLong(expiration_date,(short)0, (short) expiration_date.length);
//現(xiàn)在,在APDU Buffer中計算shah值,
//假定于位移0處生成hash值
//……
//發(fā)送shah值
apdu.sendBytes((short)0,HASH_VALUE_LENGTH);
//現(xiàn)在返回
return;
}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 凤庆县| 普定县| 乌拉特中旗| 宜黄县| 卢龙县| 罗江县| 沙湾县| 揭西县| 绵阳市| 筠连县| 寿阳县| 延吉市| 望城县| 甘南县| 台北县| 威远县| 河曲县| 综艺| 洛南县| 治县。| 曲水县| 启东市| 普格县| 峨山| 桐乡市| 茶陵县| 上思县| 溧阳市| 深圳市| 蒲江县| 遵化市| 元江| 泰安市| 海林市| 大荔县| 新余市| 自治县| 韩城市| 区。| 赤峰市| 吐鲁番市|