@Override public void encodeBoolean(final boolean value) { writeElement(BOOLEAN_TYPE, value ? BOOLEAN_TRUE_AS_BYTES : BOOLEAN_FALSE_AS_BYTES); }
@Override public void encodeOctetString(byte[] str) { writeElement(OCTET_STRING_TYPE, str); }
@Override public void encodeNull() { writeElement(NULL_TYPE, NULL_CONTENTS); }
@Override public void encodeIA5String(byte[] str) { writeElement(IA5_STRING_TYPE, str); }
void encodeIA5String(ByteStringBuilder str) { writeElement(IA5_STRING_TYPE, str); }
void encodeOctetString(ByteStringBuilder str) { writeElement(OCTET_STRING_TYPE, str); }
@Override public void encodeBitString(byte[] str, int numUnusedBits) { byte[] contents = new byte[str.length + 1]; contents[0] = (byte) numUnusedBits; System.arraycopy(str, 0, contents, 1, str.length); writeElement(BIT_STRING_TYPE, contents); }
@Override public void encodeBMPString(final String str) { // technically this may fail if str contains a code point outside of the BMP writeElement(BMP_STRING_TYPE, str.getBytes(StandardCharsets.UTF_16BE)); }
@Override public void encodeUTF8String(final String str) { writeElement(UTF8_STRING_TYPE, str.getBytes(StandardCharsets.UTF_8)); }
@Override public void encodeInteger(BigInteger integer) { writeElement(INTEGER_TYPE, integer.toByteArray()); }
@Override public void encodeUniversalString(final String str) { writeElement(UNIVERSAL_STRING_TYPE, str.getBytes(UTF_32BE)); }
@Override public void encodeGeneralizedTime(final ZonedDateTime time) { writeElement(GENERALIZED_TIME_TYPE, GENERALIZED_TIME_FORMAT.format(time).getBytes(StandardCharsets.UTF_8)); }
@Override public void encodePrintableString(final byte[] str) { for (byte b : str) { validatePrintableByte(b & 0xff); } writeElement(PRINTABLE_STRING_TYPE, str); }
@Override public void encodeBitString(String binaryStr) { int numBits = binaryStr.length(); int numBytes = numBits >> 3; int remainder = numBits % 8; int numUnusedBits = 0; if (remainder != 0) { numBytes = numBytes + 1; numUnusedBits = 8 - remainder; } byte[] contents = new byte[numBytes + 1]; contents[0] = (byte) numUnusedBits; for (int i = 1; i <= numBytes; i++) { contents[i] = (byte) 0; } char[] binaryStrChars = binaryStr.toCharArray(); int index = 0; for (int i = 1; i <= numBytes && index < numBits; i++) { for (int bit = 7; bit >= 0 && index < numBits; bit--) { if ((i == numBytes) && (bit < numUnusedBits)) { continue; } if (binaryStrChars[index++] == '1') { contents[i] |= BITS[bit]; } } } writeElement(BIT_STRING_TYPE, contents); }
@Override public void encodePrintableString(final String str) { for (int i = 0; i < str.length(); i = str.offsetByCodePoints(i, 1)) { validatePrintableByte(str.codePointAt(i)); } writeElement(PRINTABLE_STRING_TYPE, str.getBytes(StandardCharsets.US_ASCII)); }
writeElement(OBJECT_IDENTIFIER_TYPE, contents); return; writeElement(OBJECT_IDENTIFIER_TYPE, contents); return;
@Override public void encodeBMPString(final String str) { // technically this may fail if str contains a code point outside of the BMP writeElement(BMP_STRING_TYPE, str.getBytes(StandardCharsets.UTF_16BE)); }
@Override public void encodeBMPString(final String str) { // technically this may fail if str contains a code point outside of the BMP writeElement(BMP_STRING_TYPE, str.getBytes(StandardCharsets.UTF_16BE)); }
@Override public void encodePrintableString(final byte[] str) { for (byte b : str) { validatePrintableByte(b & 0xff); } writeElement(PRINTABLE_STRING_TYPE, str); }
@Override public void encodePrintableString(final String str) { for (int i = 0; i < str.length(); i = str.offsetByCodePoints(i, 1)) { validatePrintableByte(str.codePointAt(i)); } writeElement(PRINTABLE_STRING_TYPE, str.getBytes(StandardCharsets.US_ASCII)); }