Although recursive programming style isn't recommended in Java Card, I want to make a little test on the Fibonacci algorithm. I wrote a function that compute the Fibonacci's suite for big integers (represented by byte arrays).
My code is the following:
public static byte[] fibonacci(byte[] n) {
if (isLEThan1(n)) {
return n;
}
else {
return add(fibonacci(subtract(n, new byte[]{0x01})),fibonacci(subtract(n,new byte[]{0x02})));
}
}
where boolean isLEThan(byte[])
returns true
if the integer represented by the byte array is less or equal than 1, false
if not.
byte[] add(byte[], byte[])
and byte[] subtract(byte[], byte[])
implement addition and subtraction for big integers represented by byte arrays. They return a new byte array containing the result of the operation.
I thought that by giving a large array to the function described above, I will get an exception such as SystemException.NO_RESOURCE
because of the number of array instantiated by subtract due to recursive calls.
But I have to think that I don't catch the right exception because I get 6F00
as status word.
Here's the list of exceptions that I consider:
try {
fibonacci(array);
} 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);
}
}
So, does somebody have an idea about the exception concerned in that case?