16e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompackage org.bouncycastle.asn1.x500;
26e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
36e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1Encodable;
46e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
86e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1Set;
96e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.DERSequence;
106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.DERSet;
116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompublic class RDN
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom{
156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private ASN1Set values;
166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private RDN(ASN1Set values)
186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.values = values;
206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static RDN getInstance(Object obj)
236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (obj instanceof RDN)
256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return (RDN)obj;
276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
286e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else if (obj != null)
296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return new RDN(ASN1Set.getInstance(obj));
316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return null;
346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * Create a single valued RDN.
386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @param oid RDN type.
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @param value RDN value.
416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public RDN(ASN1ObjectIdentifier oid, ASN1Encodable value)
436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        ASN1EncodableVector v = new ASN1EncodableVector();
456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        v.add(oid);
476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        v.add(value);
486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.values = new DERSet(new DERSequence(v));
506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public RDN(AttributeTypeAndValue attrTAndV)
536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.values = new DERSet(attrTAndV);
556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * Create a multi-valued RDN.
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @param aAndVs attribute type/value pairs making up the RDN
616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public RDN(AttributeTypeAndValue[] aAndVs)
636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.values = new DERSet(aAndVs);
656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public boolean isMultiValued()
686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return this.values.size() > 1;
706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
716e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    /**
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * Return the number of AttributeTypeAndValue objects in this RDN,
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @return size of RDN, greater than 1 if multi-valued.
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     */
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public int size()
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return this.values.size();
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public AttributeTypeAndValue getFirst()
836e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (this.values.size() == 0)
856e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return null;
876e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return AttributeTypeAndValue.getInstance(this.values.getObjectAt(0));
906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public AttributeTypeAndValue[] getTypesAndValues()
936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        AttributeTypeAndValue[] tmp = new AttributeTypeAndValue[values.size()];
956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
966e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        for (int i = 0; i != tmp.length; i++)
976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            tmp[i] = AttributeTypeAndValue.getInstance(values.getObjectAt(i));
996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
1006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return tmp;
1026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * <pre>
1066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RelativeDistinguishedName ::=
1076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *                     SET OF AttributeTypeAndValue
1086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * AttributeTypeAndValue ::= SEQUENCE {
1106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *        type     AttributeType,
1116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *        value    AttributeValue }
1126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * </pre>
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @return this object as an ASN1Primitive type
1146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
1166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return values;
1186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom}
120