Java卡电子钱包实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;