Java卡电子钱包实验报告

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java卡电子钱包实验报告

需求分析

可以应用于现实中的Java卡电子钱包需要有

电子钱包的安装、选择与撤销选择、存款、借款、获取钱包余额以及身份验证。

等功能。

定义4条命令,分别为校验PIN、加钱、减钱和读余额。其中,加钱、减钱和读余额都是对钱包余额的操作.PIN的引入增加了钱包应用的安全性,Wallet应用要求在进行交易(加钱或减钱)之前,必须进行PIN校验,只有PIN校验成功后,才能对余额数据进行修改。同时在取消选择应用时,重载了deselect方法将PIN的校验结果清空,从而要求在每次选择应用后都需进行PIN验证,避免了安全漏洞的产生。

系统结构图

安装

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

new Wallet( bArray ,bOffset,bLength );

}

选择

public boolean select()

{

if (pin.getTriesRemaining()==0) return false;

return true;

}

撤销选择

public void deselect()

{

pin.reset();

}

存款

void debit(APDU apdu)//充值

{

//////////这里//////////////

if(!pin.isValidated())

ISOException.throwIt(SW_VERIFICATION_REQUIRED);

//////////////////////////////

short n,sum;

byte[] buf = apdu.getBuffer();

short p2=(short)getUnsignedByte(buf[ISO7816.OFFSET_P2]);

n=(short)(buf[ISO7816.OFFSET_P1]*256+p2);//取p1,p2转化为一个数.short强制转换

sum=(short)(Balance+n);

if((n<= MAX_BALANCE)&&(n>0x00))

{

if((sum<=MAX_BALANCE)&&(sum>=0x00))

{

Balance=(short)(Balance + n);

buf[0]=(byte)(Balance>>8);

buf[1]=(byte)(Balance&0xff);

apdu.setOutgoingAndSend((byte)0,(byte)2);

}

else

{

ISOException.throwIt((short)0x6102);

}

}

else

{

ISOException.throwIt((short)0x6101);

}

}

取款

void credit(APDU apdu)//消费buf

{

///////////////////这里///

if(!pin.isValidated())

ISOException.throwIt(SW_VERIFICATION_REQUIRED);

/////////////////////////////////

short m;

byte[] buf = apdu.getBuffer();

short p2=(short)getUnsignedByte(buf[ISO7816.OFFSET_P2]);

m=(short)(buf[ISO7816.OFFSET_P1]*256+p2); //取1,p2转化为一个数.short强制转换

if((m<= MAX_TRANSACTION_AMOUNT)&(m>0))

{

if(Balance > m)

{

Balance=(short)(Balance-m);

buf[0]=(byte)(Balance>>8);

buf[1]=(byte)(Balance&0xff);

apdu.setOutgoingAndSend((byte)0,(byte)2);

}

else

{

ISOException.throwIt((short)0x6104);

}

}

else

{

ISOException.throwIt((short)0X6103);

}

}

获取钱包余额

public void getBalance(APDU apdu)

{

byte[] buf = apdu.getBuffer();

buf[0]=(byte)(Balance>>8);

buf[1]=(byte)(Balance&0xff);

apdu.setOutgoingAndSend((byte)0,(byte)2);

}

身份验证

private void verify(APDU apdu)

{

byte[] buffer=apdu.getBuffer();

byte byteRead =(byte)(apdu.setIncomingAndReceive());

if(pin.check(buffer,ISO7816.OFFSET_CDATA,byteRead)==false) ISOException.throwIt(SW_VERIFICATION_FAILED);

}

Process方法

public void process(APDU apdu)

{

if ( selectingApplet())

{

return;

}

byte[] buf = apdu.getBuffer();

switch(buf[ISO7816.OFFSET_INS])

{

case (byte) DEBIT:

debit(apdu);

break;

相关文档
最新文档