prompt(): add prefillVal arg

This commit is contained in:
Neels Hofmeyr 2020-02-25 03:21:12 +01:00
parent ad4531a414
commit 9a3428e46e
1 changed files with 44 additions and 1 deletions

View File

@ -102,6 +102,38 @@ public class IMSIPseudo extends Applet implements ToolkitInterface, ToolkitConst
return resp;
}
/*
This was used to find out that the first byte of a text field seems to be 4.
private byte[] getResponseDBG()
{
ProactiveResponseHandler rspHdlr;
byte resp[];
byte strlen = -1;
rspHdlr = ProactiveResponseHandler.getTheHandler();
for (byte occurence = 1; occurence <= 3; occurence++) {
short len;
try {
if (rspHdlr.findTLV(TAG_TEXT_STRING, (byte)occurence) != TLV_NOT_FOUND) {
if ((len = rspHdlr.getValueLength()) > 1) {
len = 3;
resp = new byte[len];
rspHdlr.copyValue((short)0, resp, (short)0, (short)(len));
showMsg(resp);
showMsgAndWaitKey(Bytes.hexdump(resp));
return resp;
}
}
} catch (Exception e) {
showError((short)(30 + occurence));
return null;
}
}
showError((short)(39));
return null;
}
*/
private byte[] showMsgAndWaitKey(byte[] msg) {
ProactiveHandler proHdlr = ProactiveHandler.getTheHandler();
proHdlr.initGetInkey((byte)0, DCS_8_BIT_DATA, msg, (short)0, (short)(msg.length));
@ -110,13 +142,24 @@ public class IMSIPseudo extends Applet implements ToolkitInterface, ToolkitConst
return getResponse();
}
private byte[] prompt(byte[] msg, short minLen, short maxLen) {
private byte[] prompt(byte[] msg, byte[] prefillVal, short minLen, short maxLen) {
/* if maxLen < 1, the applet crashes */
if (maxLen < 1)
maxLen = 1;
ProactiveHandler proHdlr = ProactiveHandler.getTheHandler();
proHdlr.initGetInput((byte)0, DCS_8_BIT_DATA, msg, (short)0, (short)(msg.length), minLen, maxLen);
if (prefillVal != null && prefillVal.length > 0) {
/* appendTLV() expects the first byte to be some header before the actual text.
* At first I thought it was the value's length, but turned out to only work for lengths under 8...
* In the end I reversed the value 4 from the first byte read by rspHdlr.copyValue() for
* TAG_TEXT_STRING fields. As long as we write 4 into the first byte, things just work out,
* apparently.
* Fucking well could have said so in the API docs, too; oh the brain damage, oh the hours wasted.
* This is the appendTLV() variant that writes one byte ahead of writing an array: */
proHdlr.appendTLV((byte)(TAG_DEFAULT_TEXT), (byte)4, prefillVal, (short)0,
(short)(prefillVal.length));
}
proHdlr.send();
return getResponse();