/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.asn1; import java.nio.ByteBuffer; /** * Converts booleans to and from their DER encoded format. * * @author Middleware Services */ public class BooleanType extends AbstractDERType implements DEREncoder { /** Boolean true byte representation. */ private static final byte TRUE_BYTE = (byte) 0xff; /** Boolean false byte representation. */ private static final byte FALSE_BYTE = (byte) 0x00; /** Boolean to encode. */ private final byte[] derItem; /** * Creates a new boolean type. * * @param item to DER encode */ public BooleanType(final boolean item) { super(UniversalDERTag.BOOL); derItem = toBytes(item); } /** * Creates a new boolean type. * * @param tag der tag associated with this type * @param item to DER encode * * @throws IllegalArgumentException if the der tag is constructed */ public BooleanType(final DERTag tag, final boolean item) { super(tag); if (tag.isConstructed()) { throw new IllegalArgumentException("DER tag must not be constructed"); } derItem = toBytes(item); } @Override public byte[] encode() { return encode(derItem); } /** * Converts bytes in the buffer to a boolean by reading from the current position to the limit. * * @param encoded buffer containing DER-encoded data where the buffer is positioned at the start of boolean bytes * and the limit is set beyond the last byte of integer data. * * @return decoded bytes as a boolean. */ public static boolean decode(final ByteBuffer encoded) { final byte[] bytes = readBuffer(encoded); if (bytes.length > 1) { throw new IllegalArgumentException("Boolean cannot be longer than 1 byte"); } if (bytes[0] == TRUE_BYTE) { return true; } else if (bytes[0] == FALSE_BYTE) { return false; } else { throw new IllegalArgumentException("Invalid boolean value: " + (int) bytes[0]); } } /** * Converts the supplied boolean to a byte array. * * @param b to convert * * @return byte array */ public static byte[] toBytes(final boolean b) { return new byte[] {b ? TRUE_BYTE : FALSE_BYTE}; } }