/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Portions copyright 2012 ForgeRock AS. */ package org.forgerock.opendj.asn1; import java.io.InputStream; import java.io.OutputStream; import org.forgerock.opendj.ldap.ByteSequence; import org.forgerock.opendj.ldap.ByteSequenceReader; import org.forgerock.opendj.ldap.ByteString; import org.forgerock.opendj.ldap.ByteStringBuilder; import com.forgerock.opendj.util.ByteSequenceOutputStream; /** * This class contains various static factory methods for creating ASN.1 readers * and writers. * * @see ASN1Reader * @see ASN1Writer */ public final class ASN1 { /** * The byte array containing the pre-encoded ASN.1 encoding for a boolean * value of "false". */ public static final byte BOOLEAN_VALUE_FALSE = 0x00; /** * The byte array containing the pre-encoded ASN.1 encoding for a boolean * value of "false". */ public static final byte BOOLEAN_VALUE_TRUE = (byte) 0xFF; /** * The BER type that is assigned to the universal Boolean element. */ public static final byte UNIVERSAL_BOOLEAN_TYPE = 0x01; /** * The BER type that is assigned to the universal enumerated type. */ public static final byte UNIVERSAL_ENUMERATED_TYPE = 0x0A; /** * The BER type that is assigned to the universal integer type. */ public static final byte UNIVERSAL_INTEGER_TYPE = 0x02; /** * The BER type that is assigned to the universal null type. */ public static final byte UNIVERSAL_NULL_TYPE = 0x05; /** * The BER type that is assigned to the universal octet string type. */ public static final byte UNIVERSAL_OCTET_STRING_TYPE = 0x04; /** * The BER type that is assigned to the universal sequence type. */ public static final byte UNIVERSAL_SEQUENCE_TYPE = 0x30; /** * The BER type that is assigned to the universal set type. */ public static final byte UNIVERSAL_SET_TYPE = 0x31; /** * The ASN.1 element decoding state that indicates that the next byte read * should be additional bytes of a multi-byte length. */ static final int ELEMENT_READ_STATE_NEED_ADDITIONAL_LENGTH_BYTES = 2; /** * The ASN.1 element decoding state that indicates that the next byte read * should be the first byte for the element length. */ static final int ELEMENT_READ_STATE_NEED_FIRST_LENGTH_BYTE = 1; /** * The ASN.1 element decoding state that indicates that the next byte read * should be the BER type for a new element. */ static final int ELEMENT_READ_STATE_NEED_TYPE = 0; /** * The ASN.1 element decoding state that indicates that the next byte read * should be applied to the value of the element. */ static final int ELEMENT_READ_STATE_NEED_VALUE_BYTES = 3; /** * The byte array that will be used for ASN.1 elements with no value. */ static final byte[] NO_VALUE = new byte[0]; /** * The bitmask that can be ANDed with the BER type to zero out all bits * except those used in the class. */ static final byte TYPE_MASK_ALL_BUT_CLASS = (byte) 0xC0; /** * The bitmask that can be ANDed with the BER type to zero out all bits * except the primitive/constructed bit. */ static final byte TYPE_MASK_ALL_BUT_PC = (byte) 0x20; /** * The bitmask that can be ANDed with the BER type to determine if the * element is in the application-specific class. */ static final byte TYPE_MASK_APPLICATION = 0x40; /** * The bitmask that can be ANDed with the BER type to determine if the * element is constructed. */ static final byte TYPE_MASK_CONSTRUCTED = 0x20; /** * The bitmask that can be ANDed with the BER type to determine if the * element is in the context-specific class. */ static final byte TYPE_MASK_CONTEXT = (byte) 0x80; /** * The bitmask that can be ANDed with the BER type to determine if the * element is a primitive. */ static final byte TYPE_MASK_PRIMITIVE = 0x00; /** * The bitmask that can be ANDed with the BER type to determine if the * element is in the private class. */ static final byte TYPE_MASK_PRIVATE = (byte) 0xC0; /** * The bitmask that can be ANDed with the BER type to determine if the * element is in the universal class. */ static final byte TYPE_MASK_UNIVERSAL = 0x00; /** * Returns an ASN.1 reader whose source is the provided byte array and * having an unlimited maximum BER element size. * * @param array * The byte array to use. * @return The new ASN.1 reader. */ public static ASN1Reader getReader(final byte[] array) { return getReader(array, 0); } /** * Returns an ASN.1 reader whose source is the provided byte array and * having a user defined maximum BER element size. * * @param array * The byte array to use. * @param maxElementSize * The maximum BER element size, or {@code 0} to indicate that * there is no limit. * @return The new ASN.1 reader. */ public static ASN1Reader getReader(final byte[] array, final int maxElementSize) { return getReader(ByteString.wrap(array), maxElementSize); } /** * Returns an ASN.1 reader whose source is the provided byte sequence and * having an unlimited maximum BER element size. * * @param sequence * The byte sequence to use. * @return The new ASN.1 reader. */ public static ASN1Reader getReader(final ByteSequence sequence) { return getReader(sequence, 0); } /** * Returns an ASN.1 reader whose source is the provided byte sequence and * having a user defined maximum BER element size. * * @param sequence * The byte sequence to use. * @param maxElementSize * The maximum BER element size, or {@code 0} to indicate that * there is no limit. * @return The new ASN.1 reader. */ public static ASN1Reader getReader(final ByteSequence sequence, final int maxElementSize) { return new ASN1ByteSequenceReader(sequence.asReader(), maxElementSize); } /** * Returns an ASN.1 reader whose source is the provided byte sequence reader * and having an unlimited maximum BER element size. * * @param reader * The byte sequence reader to use. * @return The new ASN.1 reader. */ public static ASN1Reader getReader(final ByteSequenceReader reader) { return getReader(reader, 0); } /** * Returns an ASN.1 reader whose source is the provided byte sequence reader * and having a user defined maximum BER element size. * * @param reader * The byte sequence reader to use. * @param maxElementSize * The maximum BER element size, or {@code 0} to indicate that * there is no limit. * @return The new ASN.1 reader. */ public static ASN1Reader getReader(final ByteSequenceReader reader, final int maxElementSize) { return new ASN1ByteSequenceReader(reader, maxElementSize); } /** * Returns an ASN.1 reader whose source is the provided input stream and * having an unlimited maximum BER element size. * * @param stream * The input stream to use. * @return The new ASN.1 reader. */ public static ASN1Reader getReader(final InputStream stream) { return getReader(stream, 0); } /** * Returns an ASN.1 reader whose source is the provided input stream and * having a user defined maximum BER element size. * * @param stream * The input stream to use. * @param maxElementSize * The maximum BER element size, or {@code 0} to indicate that * there is no limit. * @return The new ASN.1 reader. */ public static ASN1Reader getReader(final InputStream stream, final int maxElementSize) { return new ASN1InputStreamReader(stream, maxElementSize); } /** * Returns an ASN.1 writer whose destination is the provided byte string * builder. * * @param builder * The byte string builder to use. * @return The new ASN.1 writer. */ public static ASN1Writer getWriter(final ByteStringBuilder builder) { final ByteSequenceOutputStream outputStream = new ByteSequenceOutputStream(builder); return getWriter(outputStream); } /** * Returns an ASN.1 writer whose destination is the provided output stream. * * @param stream * The output stream to use. * @return The new ASN.1 writer. */ public static ASN1Writer getWriter(final OutputStream stream) { return new ASN1OutputStreamWriter(stream); } // Prevent instantiation. private ASN1() { // Nothing to do. } }