Unable to handle some tag values in a sequence of values - issues in BERDecoder.readTag
I was trying to parse some ASN (from google android attestation example data) and it couldn't handle the tag values correctly.
The data was
MIGwoQgxBgIBAgIBA6IDAgEBowQCAggApQUxAwIBBKYIMQYCAQMCAQW/gUgFAgMBAAG/g3cCBQC/hT4DAgEAv4VATDBKBCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAoBAgQgco2xJ08fHPFXHeQ4CwSKVUrEo4Dnb1NVCDUpCEqTeAG/hUEDAgEAv4VCBQIDAxSzv4VOBgIEATQV8b+FTwYCBAE0Few=
which should have parsed to
SEQUENCE (13 elem)
[1] (1 elem)
SET (2 elem)
INTEGER 2
INTEGER 3
[2] (1 elem)
INTEGER 1
[3] (1 elem)
INTEGER 2048
[5] (1 elem)
SET (1 elem)
INTEGER 4
[6] (1 elem)
SET (2 elem)
INTEGER 3
INTEGER 5
[200] (1 elem)
INTEGER 65537
[503] (1 elem)
NULL
[702] (1 elem)
INTEGER 0
[704] (1 elem)
SEQUENCE (4 elem)
OCTET STRING (32 byte) 0000000000000000000000000000000000000000000000000000000000000000
BOOLEAN false
ENUMERATED
OCTET STRING (32 byte) 728DB1274F1F1CF1571DE4380B048A554AC4A380E76F5355083529084A937801
[705] (1 elem)
INTEGER 0
[706] (1 elem)
INTEGER 201907
[718] (1 elem)
[719] (1 elem)
INTEGER 20190700
Instead, all the tagged values where the tag was > 6 became either a 3 or a 5 :-(
Patching the code to use something like the BouncyCastle tag reading then successfully parsed
public ASN1Tag<? extends ASN1Object> readTag(InputStream s) {
try {
int tagByte = s.read();
ASN1TagClass asn1TagClass = ASN1TagClass.parseClass((byte) tagByte);
ASN1Encoding asn1Encoding = ASN1Encoding.parseEncoding((byte) tagByte);
int tagNo = tagByte & 0x1f;
if (tagNo == 0x1f) {
tagNo = 0;
int b = s.read();
if ((b & 0x7f) == 0) {
throw new ASN1ParseException("corrupted stream - invalid high tag number found");
}
while ((b >= 0) && ((b & 0x80) != 0)) {
tagNo |= (b & 0x7f);
tagNo <<= 7;
b = s.read();
}
if (b < 0) {
throw new ASN1ParseException("EOF found inside tag value.");
}
tagNo |= (b & 0x7f);
}
return ASN1Tag.forTag(asn1TagClass, tagNo).asEncoded(asn1Encoding);
} catch (IOException ioe) {
throw new ASN1ParseException("Unable to parse ASN.1 tag", ioe);
}
}