001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERNull;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
012
013public class AlgorithmIdentifier
014    extends ASN1Object
015{
016    private ASN1ObjectIdentifier objectId;
017    private ASN1Encodable       parameters;
018    private boolean             parametersDefined = false;
019
020    public static AlgorithmIdentifier getInstance(
021        ASN1TaggedObject obj,
022        boolean          explicit)
023    {
024        return getInstance(ASN1Sequence.getInstance(obj, explicit));
025    }
026    
027    public static AlgorithmIdentifier getInstance(
028        Object  obj)
029    {
030        if (obj== null || obj instanceof AlgorithmIdentifier)
031        {
032            return (AlgorithmIdentifier)obj;
033        }
034
035        // TODO: delete
036        if (obj instanceof ASN1ObjectIdentifier)
037        {
038            return new AlgorithmIdentifier((ASN1ObjectIdentifier)obj);
039        }
040
041        // TODO: delete
042        if (obj instanceof String)
043        {
044            return new AlgorithmIdentifier((String)obj);
045        }
046
047        return new AlgorithmIdentifier(ASN1Sequence.getInstance(obj));
048    }
049
050    public AlgorithmIdentifier(
051        ASN1ObjectIdentifier     objectId)
052    {
053        this.objectId = objectId;
054    }
055
056    /**
057     * @deprecated use ASN1ObjectIdentifier
058     * @param objectId
059     */
060    public AlgorithmIdentifier(
061        String     objectId)
062    {
063        this.objectId = new ASN1ObjectIdentifier(objectId);
064    }
065
066    public AlgorithmIdentifier(
067        ASN1ObjectIdentifier     objectId,
068        ASN1Encodable           parameters)
069    {
070        parametersDefined = true;
071        this.objectId = objectId;
072        this.parameters = parameters;
073    }
074
075    /**
076     * @deprecated use AlgorithmIdentifier.getInstance()
077     * @param seq
078     */
079    public AlgorithmIdentifier(
080        ASN1Sequence   seq)
081    {
082        if (seq.size() < 1 || seq.size() > 2)
083        {
084            throw new IllegalArgumentException("Bad sequence size: "
085                    + seq.size());
086        }
087        
088        objectId = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0));
089
090        if (seq.size() == 2)
091        {
092            parametersDefined = true;
093            parameters = seq.getObjectAt(1);
094        }
095        else
096        {
097            parameters = null;
098        }
099    }
100
101    public ASN1ObjectIdentifier getAlgorithm()
102    {
103        return new ASN1ObjectIdentifier(objectId.getId());
104    }
105
106    /**
107     * @deprecated use getAlgorithm
108     * @return
109     */
110    public ASN1ObjectIdentifier getObjectId()
111    {
112        return objectId;
113    }
114
115    public ASN1Encodable getParameters()
116    {
117        return parameters;
118    }
119
120    /**
121     * Produce an object suitable for an ASN1OutputStream.
122     * <pre>
123     *      AlgorithmIdentifier ::= SEQUENCE {
124     *                            algorithm OBJECT IDENTIFIER,
125     *                            parameters ANY DEFINED BY algorithm OPTIONAL }
126     * </pre>
127     */
128    public ASN1Primitive toASN1Primitive()
129    {
130        ASN1EncodableVector  v = new ASN1EncodableVector();
131
132        v.add(objectId);
133
134        if (parametersDefined)
135        {
136            if (parameters != null)
137            {
138                v.add(parameters);
139            }
140            else
141            {
142                v.add(DERNull.INSTANCE);
143            }
144        }
145
146        return new DERSequence(v);
147    }
148}