@Override public byte[] decodeIA5StringAsBytes() throws ASN1Exception { readTag(IA5_STRING_TYPE); return decodeUncheckedStringAsBytes(); }
public byte[] decodeUtf8StringAsBytes() throws ASN1Exception { readTag(UTF8_STRING_TYPE); return decodeUncheckedStringAsBytes(); }
public byte[] decodeUniversalStringAsBytes() throws ASN1Exception { readTag(UNIVERSAL_STRING_TYPE); return decodeUncheckedStringAsBytes(); }
public byte[] decodeBMPStringAsBytes() throws ASN1Exception { readTag(BMP_STRING_TYPE); return decodeUncheckedStringAsBytes(); }
@Override public void decodeNull() throws ASN1Exception { readTag(NULL_TYPE); int length = readLength(); if (length != 0) { throw log.asnNonZeroLengthForNullTypeTag(); } }
@Override public void startSequence() throws ASN1Exception { readTag(SEQUENCE_TYPE); int length = readLength(); states.add(new DecoderState(SEQUENCE_TYPE, bi.getIndex() + length)); }
@Override public void startExplicit(int clazz, int number) throws ASN1Exception { int explicitTag = clazz | CONSTRUCTED_MASK | number; readTag(explicitTag); int length = readLength(); states.add(new DecoderState(explicitTag, bi.getIndex() + length)); }
@Override public void startSet() throws ASN1Exception { readTag(SET_TYPE); int length = readLength(); states.add(new DecoderState(SET_TYPE, bi.getIndex() + length)); }
@Override public byte[] decodeOctetString() throws ASN1Exception { readTag(OCTET_STRING_TYPE); int length = readLength(); byte[] result = new byte[length]; if ((length != 0) && (bi.drain(result, 0, length) != length)) { throw log.asnUnexpectedEndOfInput(); } return result; }
@Override public String decodeBitStringAsString() throws ASN1Exception { readTag(BIT_STRING_TYPE); int length = readLength(); int numUnusedBits = bi.next(); if (numUnusedBits < 0 || numUnusedBits > 7) { throw log.asnInvalidNumberOfUnusedBits(); } int k = 0, next; int numBits = (length - 1) * 8 - numUnusedBits; StringBuilder result = new StringBuilder(numBits); for (int i = 0; i < (length - 1); i++) { next = bi.next(); for (int j = 7; j >= 0 && k < numBits; j--) { if ((next & (1 << j)) != 0) { result.append("1"); } else { result.append("0"); } k += 1; } } return result.toString(); }
@Override public byte[] drainElementValue() throws ASN1Exception { if (implicitTag != -1) { implicitTag = -1; } readTag(); int length = readLength(); byte[] value = new byte[length]; if ((length != 0) && (bi.drain(value) != length)) { throw log.asnUnexpectedEndOfInput(); } return value; }
@Override public String decodeOctetStringAsString(String charSet) throws ASN1Exception { readTag(OCTET_STRING_TYPE); int length = readLength(); byte[] octets = new byte[length]; if ((length != 0) && (bi.drain(octets, 0, length) != length)) { throw log.asnUnexpectedEndOfInput(); } try { return new String(octets, charSet); } catch (UnsupportedEncodingException e) { throw new ASN1Exception(e); } }
@Override public int peekType() throws ASN1Exception { long currOffset = bi.getIndex(); int tag = readTag(); while ((bi.getIndex() != currOffset) && bi.hasPrevious()) { bi.previous(); } return tag; }
@Override public void skipElement() throws ASN1Exception { readTag(); int length = readLength(); int i; for (i = 0; i < length && bi.hasNext(); i++) { bi.next(); } if (i != length) { throw log.asnUnexpectedEndOfInput(); } }
@Override public boolean decodeBoolean() throws ASN1Exception { readTag(BOOLEAN_TYPE); int length = readLength(); if (length != 1) { throw log.asnInvalidLengthForBooleanTypeTag(); } if (! bi.hasNext()) { throw log.asnUnexpectedEndOfInput(); } return bi.next() != BOOLEAN_FALSE; }
private void readTag(int expectedTag) throws ASN1Exception { if (implicitTag != -1) { expectedTag = implicitTag | (expectedTag & CONSTRUCTED_MASK); implicitTag = -1; } long currOffset = bi.getIndex(); int actualTag = readTag(); if (actualTag != expectedTag) { while ((bi.getIndex() != currOffset) && bi.hasPrevious()) { bi.previous(); } throw log.asnUnexpectedTag(); } }
@Override public byte[] decodePrintableStringAsBytes() throws ASN1Exception { readTag(PRINTABLE_STRING_TYPE); final int length = readLength(); int c = 0; byte[] result = new byte[length]; while (bi.hasNext() && c < length) { final int b = bi.next(); validatePrintableByte(b); result[c++] = (byte) b; } if (c < length) { throw log.asnUnexpectedEndOfInput(); } return result; }
@Override public byte[] decodeBitString() throws ASN1Exception { readTag(BIT_STRING_TYPE); int length = readLength(); byte[] result = new byte[length - 1]; int numUnusedBits = bi.next(); if (numUnusedBits < 0 || numUnusedBits > 7) { throw log.asnInvalidNumberOfUnusedBits(); } if (numUnusedBits == 0) { for (int i = 0; i < (length -1); i++) { result[i] = (byte) bi.next(); } } else { // Any unused bits will be removed int leftShift = 8 - numUnusedBits; int previous = 0; int next; for (int i = 0; i < (length -1); i++) { next = bi.next(); if (i == 0) { result[i] = (byte) (next >>> numUnusedBits); } else { result[i] = (byte) ((next >>> numUnusedBits) | (previous << leftShift)); } previous = next; } } return result; }
private boolean hasCompleteElement() { boolean hasNext; long currOffset = bi.getIndex(); try { readTag(); int length = readLength(); int i; for (i = 0; (i < length) && bi.hasNext(); i++) { bi.next(); } hasNext = (i == length); } catch (ASN1Exception e) { hasNext = false; } while ((bi.getIndex() != currOffset) && bi.hasPrevious()) { bi.previous(); } return hasNext; }
@Override public byte[] drainElement() throws ASN1Exception { if (implicitTag != -1) { implicitTag = -1; } long currOffset = bi.getIndex(); readTag(); int valueLength = readLength(); int length = (int) ((bi.getIndex() - currOffset) + valueLength); while ((bi.getIndex() != currOffset) && bi.hasPrevious()) { bi.previous(); } byte[] element = new byte[length]; if ((length != 0) && (bi.drain(element) != length)) { throw log.asnUnexpectedEndOfInput(); } return element; }