java card 电子钱包,文献翻译,开题报告ppt

4004
    


来源:
Licence:
联系:
分类:
平台:
环境:
大小:
更新:
标签:
联系方式 :
免费下载 ×

下载APP,支持永久资源免费下载

限免产品服务请联系qq:1585269081

下载APP
免费下载 ×

下载APP,支持永久资源免费下载

下载APP 免费下载
下载 ×

下载APP,资源永久免费


如果出现不能下载的情况,请联系站长,联系方式在下方。

免费下载 ×

下载论文助手APP,资源永久免费

免费获取

如果你已经登录仍然出现不能下载的情况,请【点击刷新】本页面或者联系站长


package javacard;

import javacard.framework.*;
public class JAVACARD extends Applet {

// APDU的指令

final static byte Wallet_CLA = (byte) 0x80;
final static byte VERIFY = (byte) 0x20;// 验证PIN码命令

final static byte CREDIT = (byte) 0x30;// 存款命令

final static byte DEBIT = (byte) 0x40;// 取款命令

final static byte GETBALANCE = (byte) 0x50;// 余额查询

// 存储额最大值

final static short MAX_BALANCE = 0x7FFF;

// 存取金额最大值

final static byte MAX_TRANSACTION_AMOUNT = 127;

// PIN码最多尝试值

final static byte PIN_TRY_LIMIT = (byte) 0x03;

// PIN最长的长度

final static byte MAX_PIN_SIZE = (byte) 0x08;

// 一些返回值

// 验证PIN 码失败

final static short SW_VERIFICATION_FAILED = 0x6300;

// 此操作需验证PIN码

final static short SW_PIN_VERIFICATION_REQUIRED = 0x6301;

// 存取金额值无效

final static short SW_INVALID_TRANSACTION_AMOUNT = 0x6A83;

// 存储额超过最大值

final static short SW_EXCEED_MAXIMUM_BALANCE = 0x6A84;

// 存储额为负

final static short SW_NEGATIVE_BALANCE = 0x6A85;

// PIN 码

OwnerPIN pin;

// 存款余额,最大值为0X7FFF = 32767

short balance;
private JAVACARD(byte[] bArray, short bOffset, byte bLength) {

// 创建OwnerPIN,PIN 的最多尝试数为PIN_TRY_LIMIT,

// 长度最多为MAX_PIN_SIZE

pin = new OwnerPIN(PIN_TRY_LIMIT, MAX_PIN_SIZE);

// 安装Applet 时,会传送PIN 的参数

// (bArray, bOffset, bLength);

// 注册
byte iLen = bArray[bOffset];// AID的长度

bOffset = (short) (bOffset + iLen + 1);

byte cLen = bArray[bOffset];

bOffset = (short) (bOffset + cLen + 1);

byte aLen = bArray[bOffset];
pin.update(bArray, (short) (bOffset + 1), aLen);

register();

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

// 调用构造函数

new JAVACARD(bArray, bOffset, bLength);

}
public boolean select() {

// 如果PIN 码锁死,Applet 将不能被选择

if (pin.getTriesRemaining() == 0)

return false;

return true;

}
public void deselect() {

// 重制PIN

pin.reset();

}
public void process(APDU apdu) {

// 用一个字节数组来处理APDU的头信息,和数据信息

// buffer 就是这个字节数组

byte[] buffer = apdu.getBuffer();

// cla为指令集

buffer[ISO7816.OFFSET_CLA] = (byte) (buffer[ISO7816.OFFSET_CLA] & (byte) 0xFC);

if ((buffer[ISO7816.OFFSET_CLA] == 0)

&& (buffer[ISO7816.OFFSET_INS] == (byte) (0xA4)))

return;
if (buffer[ISO7816.OFFSET_CLA] != Wallet_CLA)

ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
switch (buffer[ISO7816.OFFSET_INS]) {

case GETBALANCE:

getBalance(apdu);// 余额查询

return;

case DEBIT:

debit(apdu);// 取款

return;

case CREDIT:

credit(apdu);// 存款

return;

case VERIFY:

verify(apdu);// 验证PIN码

return;

default:

ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);// 指令未知

}

}
private void credit(APDU apdu) {

// 检验PIN 码是否已被检验,若

// 否,则无权存款,并返回相应错误代码

if (!pin.isValidated())

ISOException.throwIt(SW_PIN_VERIFICATION_REQUIRED);

// 用一个字节数组来处理APDU的头信息,和数据信息

byte[] buffer = apdu.getBuffer();

// OFFSET_LC 用来得到APDU中数据信息的长度

byte numBytes = buffer[ISO7816.OFFSET_LC];

// APDU中实际得到的信息的长度

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

// 如果长度不匹配,返回相应错误信息

if ((numBytes != 1) || (byteRead != 1))

ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);

// 从缓冲的第六个字节得到存储金额

// _CDATA=5

byte creditAmount = buffer[ISO7816.OFFSET_CDATA];
// 验证存款金额是否超过最大值

if ((creditAmount > MAX_TRANSACTION_AMOUNT) || (creditAmount < 0))

ISOException.throwIt(SW_INVALID_TRANSACTION_AMOUNT);
// 验证存款后总金额是否超过最大值

if ((short) (balance + creditAmount) > MAX_BALANCE)

ISOException.throwIt(SW_EXCEED_MAXIMUM_BALANCE);
// 存入存款金额

balance = (short) (balance + creditAmount);

}
private void debit(APDU apdu) {

// 检验PIN 码是否已被检验,若

// 否,则无权取款,并返回相应错误代码

if (!pin.isValidated())

ISOException.throwIt(SW_PIN_VERIFICATION_REQUIRED);

// 用一个字节数组来处理APDU的头信息,和数据信息

byte[] buffer = apdu.getBuffer();

// OFFSET_LC 用来得到APDU中数据信息的长度

byte numBytes = (byte) (buffer[ISO7816.OFFSET_LC]);
// APDU中实际得到的信息的长度

byte byteRead = (byte) (apdu.setIncomingAndReceive());
// 如果长度不匹配,返回相应错误信息

if ((numBytes != 1) || (byteRead != 1))

ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
// 从缓冲的第六个字节获取取款数据

// _CDATA=5

byte debitAmount = buffer[ISO7816.OFFSET_CDATA];
// 判断取款数据是否大于每次允许的最大值

if ((debitAmount > MAX_TRANSACTION_AMOUNT) || (debitAmount < 0))

ISOException.throwIt(SW_INVALID_TRANSACTION_AMOUNT);
// 验证取款后余额是否为负

if ((short) (balance - debitAmount) < (short) 0)

ISOException.throwIt(SW_NEGATIVE_BALANCE);

// 取款

balance = (short) (balance - debitAmount);

}
private void getBalance(APDU apdu) {

// 用一个字节数组来处理APDU的头信息,和数据信息

byte[] buffer = apdu.getBuffer();

// setOutgoing()方法是告知终端Applet准备回传相应

// 并得到期望响应长度

short le = apdu.setOutgoing();

// 响应长度小于2,出错

if (le < 2)
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);

// 告知终端实际的响应长度

apdu.setOutgoingLength((byte) 2);

// 将存储余额附给apdu的缓冲

buffer[0] = (byte) (balance >> 8);

buffer[1] = (byte) (balance & 0xFF);

// 将apdu缓冲区中从0 位置后2 个字节长度的信息发出

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

}
private void verify(APDU apdu) {

// 用一个字节数组来处理APDU的头信息,和数据信息

byte[] buffer = apdu.getBuffer();

// APDU中实际得到的信息的长度,即PIN码长度

byte byteRead = (byte) (apdu.setIncomingAndReceive());
// 验证PIN码,PIN码值在apdu缓冲中,从

// _CDATA=5位置起,

// 长度=byteRead,

if (pin.check(buffer, ISO7816.OFFSET_CDATA, byteRead) == false)

ISOException.throwIt(SW_VERIFICATION_FAILED);

}

}

免费下载 ×

下载APP,支持永久资源免费下载

下载APP 免费下载
温馨提示
请用电脑打开本网页,即可以免费获取你想要的了。
扫描加我微信 ×

演示

×
登录 ×


下载 ×
论文助手网
论文助手,最开放的学术期刊平台
				暂无来源信息			 
回复
来来来,吐槽点啥吧

作者联系方式

×

向作者索要->