- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这篇文章与我几天前提出的一个问题有关:Store symmetric keys in Java Card
我想在 Java Card 中实现 LinkedList
来存储 AESKey
。所以我写了一个 KeyElement
类:
package LinkedList;
import javacard.security.AESKey;
import javacard.security.KeyBuilder;
class KeyElement {
private KeyElement next;
private short id;
private AESKey key;
private boolean isUsed;
/**
* Constructor.
*
* @param upperBound
* An upper bound to indicate of many elements it cans contain at
* maximum. It is essential to instanciate the structure this way
* to reserve all the necessary memory at the installation time.
*/
public KeyElement(short upperBound) {
this.id = (short) 0x0000;
this.key = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES,
KeyBuilder.LENGTH_AES_256, false);
this.isUsed = false;
this.next = null;
for (short i = (short) 0x0001; i < upperBound; i++) {
KeyElement e = new KeyElement();
this.addKeyElement(e);
}
}
public KeyElement() {
this.id = (short) 0x0000;
this.key = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES,
KeyBuilder.LENGTH_AES_256, false);
this.isUsed = false;
this.next = null;
}
public KeyElement getNext() {
return this.next;
}
public short getID() {
return this.id;
}
public boolean isUsed() {
return isUsed;
}
public void setNext(KeyElement e) {
this.next = e;
}
public static boolean addKey(KeyElement main, final short id, byte[] key) {
for (KeyElement p = main; p != null; p = p.getNext()) {
if (!p.isUsed()) {
p.isUsed = true;
p.id = id;
p.key.setKey(key, (short) 0x0000);
return true;
}
}
return false;
}
public void addKeyElement(KeyElement e) {
e.setNext(this.getNext());
this.setNext(e);
}
public static boolean getKey(final KeyElement e, final short id,
byte[] key) {
for (KeyElement p = e; p != null; p = p.getNext()) {
if (p.id == id) {
p.key.getKey(key, (short) 0x0000);
return true;
}
}
return false;
}
}
我有一个小程序 LinkedListKey
,它使用前面描述的类 KeyElement
。
package LinkedList;
import javacard.framework.APDU;
import javacard.framework.APDUException;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.PINException;
import javacard.framework.SystemException;
import javacard.framework.TransactionException;
import javacard.framework.Util;
import javacard.framework.service.ServiceException;
import javacard.security.CryptoException;
import javacard.security.RandomData;
public class LinkedListKey extends Applet {
byte[] rdm;
RandomData rand;
KeyElement e;
private LinkedListKey(final byte[] aidArray, final short aidOffset,
final byte aidLength, final byte[] dataArray, short dataOffset,
final short dataLength) throws ISOException {
e = new KeyElement((short) 0x0064);
rdm = new byte[(short) 0x0020];
KeyElement.addKey(e, (short) 0x7514, new byte[] { (byte) 0x75, (byte) 0x14,
(byte) 0x75, (byte) 0x14, (byte) 0x75, (byte) 0x14,
(byte) 0x75, (byte) 0x14, (byte) 0x14, (byte) 0x14,
(byte) 0x75, (byte) 0x14, (byte) 0x75, (byte) 0x14,
(byte) 0x75, (byte) 0x14, (byte) 0x75, (byte) 0x14,
(byte) 0x75, (byte) 0x14, (byte) 0x14, (byte) 0x14,
(byte) 0x75, (byte) 0x14, (byte) 0x75, (byte) 0x14,
(byte) 0x75, (byte) 0x14, (byte) 0x75, (byte) 0x14,
(byte) 0x75, (byte) 0x14 });
register();
}
public static void install(final byte[] buffer, short offset,
final byte length) throws ISOException {
if (length == 0) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
}
short remainingBytes = makeShort(length);
// Save instance AID.
byte aidLength = buffer[offset++];
short aidOffset = offset;
// Skip instance AID.
offset += makeShort(aidLength);
remainingBytes--;
remainingBytes -= makeShort(aidLength);
if (remainingBytes <= (short) 0x0000) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
}
// Skip control data.
byte infoLength = buffer[offset++];
offset += makeShort(infoLength);
remainingBytes--;
remainingBytes -= makeShort(infoLength);
if (remainingBytes <= (short) 0x0000) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
}
// Instantiate the application.
// The length of the application data maybe greater than 127 bytes.
short dataLength = makeShort(buffer[offset++]);
remainingBytes--;
if (remainingBytes != dataLength) {
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
}
new LinkedListKey(buffer, aidOffset, aidLength, buffer, offset,
dataLength);
}
public void process(final APDU apdu) throws ISOException {
byte[] apduBuffer = apdu.getBuffer();
if (selectingApplet()) {
apdu.setOutgoingAndSend((short) 0x0000, (short) 0x0019);
return;
}
// Send result.
try {
if (apduBuffer[ISO7816.OFFSET_INS] == (byte) 0x00) {
for (short i = 0x0000; i < (short) 0x0008; i++) {
rand.generateData(rdm, (short) 0x0000, (short) rdm.length);
KeyElement.addKey(e, i, rdm);
}
KeyElement.addKey(e, (short) 0x7503, new byte[] { (byte) 0x75, (byte) 0x03,
(byte) 0x75, (byte) 0x03, (byte) 0x75, (byte) 0x03,
(byte) 0x75, (byte) 0x03, (byte) 0x14, (byte) 0x03,
(byte) 0x75, (byte) 0x03, (byte) 0x75, (byte) 0x03,
(byte) 0x75, (byte) 0x03, (byte) 0x75, (byte) 0x03,
(byte) 0x75, (byte) 0x03, (byte) 0x14, (byte) 0x03,
(byte) 0x75, (byte) 0x03, (byte) 0x75, (byte) 0x03,
(byte) 0x75, (byte) 0x03, (byte) 0x75, (byte) 0x03,
(byte) 0x75, (byte) 0x03 });
}
else if (apduBuffer[ISO7816.OFFSET_INS] == (byte) 0x01){
KeyElement.getKey(e, (short) 0x7503, apduBuffer);
setOutgoingAndSend((short) 0x0000, (short) 0x0020);
}
else {
KeyElement.getKey(e, (short) 0x7514, apduBuffer);
setOutgoingAndSend((short) 0x0000, (short) 0x0020);
}
} catch (ArithmeticException e) {
ISOException.throwIt((short) 0x0100);
} catch (ArrayStoreException e) {
ISOException.throwIt((short) 0x0200);
} catch (APDUException e) {
ISOException.throwIt(Util.makeShort((byte) 0x03,
(byte) e.getReason()));
} catch (CryptoException e) {
ISOException.throwIt(Util.makeShort((byte) 0x04,
(byte) e.getReason()));
} catch (ISOException e) {
ISOException.throwIt(Util.makeShort((byte) 0x05,
(byte) e.getReason()));
} catch (PINException e) {
ISOException.throwIt(Util.makeShort((byte) 0x06,
(byte) e.getReason()));
} catch (ServiceException e) {
ISOException.throwIt(Util.makeShort((byte) 0x07,
(byte) e.getReason()));
} catch (SystemException e) {
ISOException.throwIt(Util.makeShort((byte) 0x08,
(byte) e.getReason()));
} catch (TransactionException e) {
ISOException.throwIt(Util.makeShort((byte) 0x09,
(byte) e.getReason()));
} catch (ClassCastException e) {
ISOException.throwIt((short) 0x0A00);
} catch (IndexOutOfBoundsException e) {
ISOException.throwIt((short) 0x0B00);
} catch (NegativeArraySizeException e) {
ISOException.throwIt((short) 0x0C00);
} catch (NullPointerException e) {
ISOException.throwIt((short) 0x0D00);
} catch (SecurityException e) {
ISOException.throwIt((short) 0x0E00);
} catch (RuntimeException e) {
}
}
static private short makeShort(final byte value) {
return Util.makeShort((byte) 0x00, value);
}
private void setOutgoingAndSend(final short dataOffset, short dataLength) throws ISOException {
APDU.getCurrentAPDU().setOutgoingAndSend(dataOffset, dataLength);
}
}
所以我写了 if/else 条件来确定需要多少时间:
INS
= 0x00)INS
= 0x01 时)INS
= 0x02)因此,使用上面给出的代码,我可以毫无问题地将我的小程序安装到 Java 卡上。
但是当我运行我的小程序时,我得到一个异常 0x0D00
,它引用了一个 NullPointerException
。
那么,什么?我是否必须得出我的 KeyElement
对象实例化失败的结论?但是,由于它是在安装时制作的,我认为它应该在安装过程中返回一个错误,但它没有。
更准确地说,它在以下步骤失败:
// Send result.
try {
if (apduBuffer[ISO7816.OFFSET_INS] == (byte) 0x00) {
for (short i = 0x0000; i < (short) 0x0008; i++) {
rand.generateData(rdm, (short) 0x0000, (short) rdm.length);
KeyElement.addKey(e, i, rdm);
}
...
更准确地说,在 KeyElement.addKey(e, i, rdm);
这就是为什么 e
引发了 NullPointerException
甚至安装成功...
最佳答案
您还没有创建 rand
的实例,它会生成 NullPointerException
。您需要使用:
RandomData.getInstance(byte algorithm)
有算法
public static final byte ALG_PSEUDO_RANDOM 1
public static final byte ALG_SECURE_RANDOM 2
关于java - Java Card 中的 AESKey 链表/数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32698283/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!