aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/applet/AppletBase.java
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/cz/crcs/ectester/applet/AppletBase.java51
1 files changed, 45 insertions, 6 deletions
diff --git a/src/cz/crcs/ectester/applet/AppletBase.java b/src/cz/crcs/ectester/applet/AppletBase.java
index 6db2254..4669352 100644
--- a/src/cz/crcs/ectester/applet/AppletBase.java
+++ b/src/cz/crcs/ectester/applet/AppletBase.java
@@ -76,7 +76,7 @@ public abstract class AppletBase extends Applet {
public static final byte[] VERSION = {'v', '0', '.', '3', '.', '3'};
public static final short ARRAY_LENGTH = 0x100;
- public static final short APDU_MAX_LENGTH = 1024;
+ public static final short APDU_MAX_LENGTH = 1024;//512
// TEMPORARRY ARRAY IN RAM
byte[] ramArray = null;
@@ -105,11 +105,50 @@ public abstract class AppletBase extends Applet {
*/
short resetMemory = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
short deselectMemory = JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_TRANSIENT_DESELECT);
- byte memoryType = (resetMemory >= deselectMemory) ? JCSystem.CLEAR_ON_RESET : JCSystem.CLEAR_ON_DESELECT;
-
- ramArray = JCSystem.makeTransientByteArray(ARRAY_LENGTH, memoryType);
- ramArray2 = JCSystem.makeTransientByteArray(ARRAY_LENGTH, memoryType);
- apduArray = JCSystem.makeTransientByteArray(APDU_MAX_LENGTH, memoryType);
+ short bigMem;
+ short smallMem;
+ byte bigMemType;
+ byte smallMemType;
+ if (resetMemory >= deselectMemory) {
+ bigMem = resetMemory;
+ smallMem = deselectMemory;
+ bigMemType = JCSystem.CLEAR_ON_RESET;
+ smallMemType = JCSystem.CLEAR_ON_DESELECT;
+ } else {
+ bigMem = deselectMemory;
+ smallMem = resetMemory;
+ bigMemType = JCSystem.CLEAR_ON_DESELECT;
+ smallMemType = JCSystem.CLEAR_ON_RESET;
+ }
+ short[] lensBig = new short[]{APDU_MAX_LENGTH + 2 * ARRAY_LENGTH, APDU_MAX_LENGTH + ARRAY_LENGTH, APDU_MAX_LENGTH,};
+ short[] lensSmall = new short[]{0, ARRAY_LENGTH, 2 * ARRAY_LENGTH};
+ byte[] allocsBig = new byte[]{0x07, 0x03, 0x01};
+ boolean done = false;
+ for (short i = 0; i < 3; ++i) {
+ if (lensBig[i] <= bigMem && lensSmall[i] <= smallMem) {
+ byte allocI = 1;
+ while (allocI < 0x08) {
+ byte type = ((allocI & allocsBig[i]) != 0) ? bigMemType : smallMemType;
+ switch (allocI) {
+ case 0x01:
+ apduArray = JCSystem.makeTransientByteArray(APDU_MAX_LENGTH, type);
+ break;
+ case 0x02:
+ ramArray = JCSystem.makeTransientByteArray(ARRAY_LENGTH, type);
+ break;
+ case 0x04:
+ ramArray2 = JCSystem.makeTransientByteArray(ARRAY_LENGTH, type);
+ break;
+ }
+ allocI = (byte) (allocI << 1);
+ }
+ done = true;
+ break;
+ }
+ }
+ if (!done) {
+ ISOException.throwIt((short) 0x6a84);
+ }
randomData = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);
EC_Consts.randomData = randomData;