Is there a java card parser for BER-TLV ?
Posted: Wed Dec 30, 2015 1:45 am
Please check the subject.
And the length of tags and values are not known. Any pointers?
And the length of tags and values are not known. Any pointers?
JavaCardOS - JavaCardForum
https://www.javacardos.com/javacardforum/
https://www.javacardos.com/javacardforum/viewtopic.php?f=11&t=451
KevinAli wrote:Please check the subject.
And the length of tags and values are not known. Any pointers?
Code: Select all
public static Map<String, String> parseTLV(String tlv) {
if (tlv == null || tlv.length()%2!=0) {
throw new RuntimeException("Invalid tlv, null or odd length");
}
HashMap<String, String> hashMap = new HashMap<String, String>();
for (int i=0; i<tlv.length();) {
try {
String key = tlv.substring(i, i=i+2);
if ((Integer.parseInt(key,16) & 0x1F) == 0x1F) {
// extra byte for TAG field
key += tlv.substring(i, i=i+2);
}
String len = tlv.substring(i, i=i+2);
int length = Integer.parseInt(len,16);
if (length > 127) {
// more than 1 byte for lenth
int bytesLength = length-128;
len = tlv.substring(i, i=i+(bytesLength*2));
length = Integer.parseInt(len,16);
}
length*=2;
String value = tlv.substring(i, i=i+length);
//System.out.println(key+" = "+value);
hashMap.put(key, value);
} catch (NumberFormatException e) {
throw new RuntimeException("Error parsing number",e);
} catch (IndexOutOfBoundsException e) {
throw new RuntimeException("Error processing field",e);
}
}
return hashMap;
}