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);
    }
}