org.bouncycastle.asn1

## Class ASN1Set

- java.lang.Object
- - org.bouncycastle.asn1.ASN1Object
  - - org.bouncycastle.asn1.ASN1Primitive
    - - org.bouncycastle.asn1.ASN1Set

- All Implemented Interfaces:
    java.lang.Iterable<ASN1Encodable>, ASN1Encodable, Encodable
  Direct Known Subclasses:
    BERSet, DERSet, DLSet

      public abstract class ASN1Set
      extends ASN1Primitive
      implements Iterable<ASN1Encodable>

  ASN.1 `SET` and `SET OF` constructs.

  Note: This does not know which syntax the set is! (The difference: ordering of SET elements or not ordering.)

  DER form is always definite form length fields, while BER support uses indefinite form.

  The CER form support does not exist.

  ## X.690

  ### 8: Basic encoding rules

  #### 8.11 Encoding of a set value

  8.11.1 The encoding of a set value shall be constructed

  8.11.2 The contents octets shall consist of the complete encoding of a data value from each of the types listed in the ASN.1 definition of the set type, in an order chosen by the sender, unless the type was referenced with the keyword OPTIONAL or the keyword DEFAULT.

  8.11.3 The encoding of a data value may, but need not, be present for a type which was referenced with the keyword OPTIONAL or the keyword DEFAULT.

  > NOTE — The order of data values in a set value is not significant, and places no constraints on the order during transfer

  #### 8.12 Encoding of a set-of value

  8.12.1 The encoding of a set-of value shall be constructed.

  8.12.2 The text of 8.10.2 applies: The contents octets shall consist of zero, one or more complete encodings of data values from the type listed in the ASN.1 definition.

  8.12.3 The order of data values need not be preserved by the encoding and subsequent decoding.

  ### 9: Canonical encoding rules

  #### 9.1 Length forms

  If the encoding is constructed, it shall employ the indefinite-length form. If the encoding is primitive, it shall include the fewest length octets necessary. [Contrast with 8.1.3.2 b).]

  #### 9.3 Set components

  The encodings of the component values of a set value shall appear in an order determined by their tags as specified in 8.6 of ITU-T Rec. X.680 | ISO/IEC 8824-1. Additionally, for the purposes of determining the order in which components are encoded when one or more component is an untagged choice type, each untagged choice type is ordered as though it has a tag equal to that of the smallest tag in that choice type or any untagged choice types nested within.

  ### 10: Distinguished encoding rules

  #### 10.1 Length forms

  The definite form of length encoding shall be used, encoded in the minimum number of octets. [Contrast with 8.1.3.2 b).]

  #### 10.3 Set components

  The encodings of the component values of a set value shall appear in an order determined by their tags as specified in 8.6 of ITU-T Rec. X.680 | ISO/IEC 8824-1.

  > NOTE — Where a component of the set is an untagged choice type, the location of that component in the ordering will depend on the tag of the choice component being encoded.

  ### 11: Restrictions on BER employed by both CER and DER

  #### 11.5 Set and sequence components with default value

  The encoding of a set value or sequence value shall not include an encoding for any component value which is equal to its default value.

  #### 11.6 Set-of components

  The encodings of the component values of a set-of value shall appear in ascending order, the encodings being compared as octet strings with the shorter components being padded at their trailing end with 0-octets.

  > NOTE — The padding octets are for comparison purposes only and do not appear in the encodings.

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `protected ASN1Encodable[]` | `elements`
    `protected ASN1Encodable[]` | `sortedElements`

  - ### Constructor Summary

    Constructors
    Modifier | Constructor and Description
    --- | ---
    `protected` | `ASN1Set()`
    `protected` | `ASN1Set(ASN1Encodable element)` Create a SET containing one object
    `protected` | `ASN1Set(ASN1Encodable[] elements, boolean doSort)` Create a SET containing an array of objects.
    `protected` | `ASN1Set(ASN1EncodableVector elementVector, boolean doSort)` Create a SET containing a vector of objects.

  - ### Method Summary

    All Methods Static Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `static ASN1Set` | `getInstance(ASN1TaggedObject taggedObject, boolean declaredExplicit)` Return an ASN1 set from a tagged object.
    `static ASN1Set` | `getInstance(java.lang.Object obj)` return an ASN1Set from the given object.
    `ASN1Encodable` | `getObjectAt(int index)` return the object at the set position indicated by index.
    `java.util.Enumeration` | `getObjects()`
    `static ASN1Set` | `getTagged(ASN1TaggedObject taggedObject, boolean declaredExplicit)`
    `int` | `hashCode()`
    `java.util.Iterator<ASN1Encodable>` | `iterator()` Returns an iterator over a set of elements of type T.
    `ASN1SetParser` | `parser()`
    `int` | `size()` return the number of objects in this set.
    `ASN1Encodable[]` | `toArray()`
    `java.lang.String` | `toString()`

    - ### Methods inherited from class org.bouncycastle.asn1.ASN1Primitive

      `encodeTo, encodeTo, equals, equals, equals, fromByteArray, fromStream, toASN1Primitive`

    - ### Methods inherited from class org.bouncycastle.asn1.ASN1Object

      `getEncoded, getEncoded, hasEncodedTagValue`

    - ### Methods inherited from class java.lang.Object

      `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

    - ### Methods inherited from interface java.lang.Iterable

      `forEach, spliterator`

- - ### Field Detail

    - #### elements

          protected final ASN1Encodable[] elements

    - #### sortedElements

          protected ASN1Encodable[] sortedElements

  - ### Constructor Detail

    - #### ASN1Set

          protected ASN1Set()

    - #### ASN1Set

          protected ASN1Set(ASN1Encodable element)

      Create a SET containing one object
      Parameters:
        `element` - object to be added to the SET.

    - #### ASN1Set

          protected ASN1Set(ASN1EncodableVector elementVector,
                            boolean doSort)

      Create a SET containing a vector of objects.
      Parameters:
        `elementVector` - a vector of objects to make up the SET.
        `doSort` - true if should be sorted DER style, false otherwise.

    - #### ASN1Set

          protected ASN1Set(ASN1Encodable[] elements,
                            boolean doSort)

      Create a SET containing an array of objects.
      Parameters:
        `elements` - an array of objects to make up the SET.
        `doSort` - true if should be sorted DER style, false otherwise.

  - ### Method Detail

    - #### getInstance

          public static ASN1Set getInstance(java.lang.Object obj)

      return an ASN1Set from the given object.
      Parameters:
        `obj` - the object we want converted.
      Returns:
        an ASN1Set instance, or null.
      Throws:
        `java.lang.IllegalArgumentException` - if the object cannot be converted.

    - #### getInstance

          public static ASN1Set getInstance(ASN1TaggedObject taggedObject,
                                            boolean declaredExplicit)

      Return an ASN1 set from a tagged object. There is a special case here, if an object appears to have been explicitly tagged on reading but we were expecting it to be implicitly tagged in the normal course of events it indicates that we lost the surrounding set - so we need to add it back (this will happen if the tagged object is a sequence that contains other sequences). If you are dealing with implicitly tagged sets you really should be using this method.
      Parameters:
        `taggedObject` - the tagged object.
        `declaredExplicit` - true if the object is meant to be explicitly tagged false otherwise.
      Returns:
        an ASN1Set instance.
      Throws:
        `java.lang.IllegalArgumentException` - if the tagged object cannot be converted.

    - #### getTagged

          public static ASN1Set getTagged(ASN1TaggedObject taggedObject,
                                          boolean declaredExplicit)

    - #### getObjects

          public java.util.Enumeration getObjects()

    - #### getObjectAt

          public ASN1Encodable getObjectAt(int index)

      return the object at the set position indicated by index.
      Parameters:
        `index` - the set number (starting at zero) of the object
      Returns:
        the object at the set position indicated by index.

    - #### size

          public int size()

      return the number of objects in this set.
      Returns:
        the number of objects in this set.

    - #### toArray

          public ASN1Encodable[] toArray()

    - #### parser

          public ASN1SetParser parser()

    - #### hashCode

          public int hashCode()

      Specified by:
        `hashCode` in class `ASN1Primitive`

    - #### toString

          public java.lang.String toString()

      Overrides:
        `toString` in class `java.lang.Object`

    - #### iterator

          public java.util.Iterator<ASN1Encodable> iterator()

      Description copied from interface: `Iterable`
      Returns an iterator over a set of elements of type T.
      Specified by:
        `iterator` in interface `java.lang.Iterable<ASN1Encodable>`
      Returns:
        an Iterator.