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); }}
java card 电子钱包,文献翻译,开题报告ppt
3997
来源:
Licence:
联系:
分类:
平台:
环境:
大小:
更新:
标签:
免费下载
×
温馨提示
请用电脑打开本网页,即可以免费获取你想要的了。