001package org.apache.commons.ssl.org.bouncycastle.asn1.crmf;
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.ASN1OctetString;
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.DERBitString;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
012import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
014
015public class EncryptedValue
016    extends ASN1Object
017{
018    private AlgorithmIdentifier intendedAlg;
019    private AlgorithmIdentifier symmAlg;
020    private DERBitString        encSymmKey;
021    private AlgorithmIdentifier keyAlg;
022    private ASN1OctetString     valueHint;
023    private DERBitString        encValue;
024
025    private EncryptedValue(ASN1Sequence seq)
026    {
027        int index = 0;
028        while (seq.getObjectAt(index) instanceof ASN1TaggedObject)
029        {
030            ASN1TaggedObject tObj = (ASN1TaggedObject)seq.getObjectAt(index);
031
032            switch (tObj.getTagNo())
033            {
034            case 0:
035                intendedAlg = AlgorithmIdentifier.getInstance(tObj, false);
036                break;
037            case 1:
038                symmAlg = AlgorithmIdentifier.getInstance(tObj, false);
039                break;
040            case 2:
041                encSymmKey = DERBitString.getInstance(tObj, false);
042                break;
043            case 3:
044                keyAlg = AlgorithmIdentifier.getInstance(tObj, false);
045                break;
046            case 4:
047                valueHint = ASN1OctetString.getInstance(tObj, false);
048                break;
049            }
050            index++;
051        }
052
053        encValue = DERBitString.getInstance(seq.getObjectAt(index));
054    }
055
056    public static EncryptedValue getInstance(Object o)
057    {
058        if (o instanceof EncryptedValue)
059        {
060            return (EncryptedValue)o;
061        }
062        else if (o != null)
063        {
064            return new EncryptedValue(ASN1Sequence.getInstance(o));
065        }
066
067        return null;
068    }
069
070    public EncryptedValue(
071        AlgorithmIdentifier intendedAlg,
072        AlgorithmIdentifier symmAlg,
073        DERBitString encSymmKey,
074        AlgorithmIdentifier keyAlg,
075        ASN1OctetString valueHint,
076        DERBitString encValue)
077    {
078        if (encValue == null)
079        {
080            throw new IllegalArgumentException("'encValue' cannot be null");
081        }
082
083        this.intendedAlg = intendedAlg;
084        this.symmAlg = symmAlg;
085        this.encSymmKey = encSymmKey;
086        this.keyAlg = keyAlg;
087        this.valueHint = valueHint;
088        this.encValue = encValue;
089    }
090
091    public AlgorithmIdentifier getIntendedAlg()
092    {
093        return intendedAlg;
094    }
095
096    public AlgorithmIdentifier getSymmAlg()
097    {
098        return symmAlg;
099    }
100
101    public DERBitString getEncSymmKey()
102    {
103        return encSymmKey;
104    }
105
106    public AlgorithmIdentifier getKeyAlg()
107    {
108        return keyAlg;
109    }
110
111    public ASN1OctetString getValueHint()
112    {
113        return valueHint;
114    }
115
116    public DERBitString getEncValue()
117    {
118        return encValue;
119    }
120
121    /**
122     * <pre>
123     * EncryptedValue ::= SEQUENCE {
124     *                     intendedAlg   [0] AlgorithmIdentifier  OPTIONAL,
125     *                     -- the intended algorithm for which the value will be used
126     *                     symmAlg       [1] AlgorithmIdentifier  OPTIONAL,
127     *                     -- the symmetric algorithm used to encrypt the value
128     *                     encSymmKey    [2] BIT STRING           OPTIONAL,
129     *                     -- the (encrypted) symmetric key used to encrypt the value
130     *                     keyAlg        [3] AlgorithmIdentifier  OPTIONAL,
131     *                     -- algorithm used to encrypt the symmetric key
132     *                     valueHint     [4] OCTET STRING         OPTIONAL,
133     *                     -- a brief description or identifier of the encValue content
134     *                     -- (may be meaningful only to the sending entity, and used only
135     *                     -- if EncryptedValue might be re-examined by the sending entity
136     *                     -- in the future)
137     *                     encValue       BIT STRING }
138     *                     -- the encrypted value itself
139     * </pre>
140     * @return a basic ASN.1 object representation.
141     */
142    public ASN1Primitive toASN1Primitive()
143    {
144        ASN1EncodableVector v = new ASN1EncodableVector();
145
146        addOptional(v, 0, intendedAlg);
147        addOptional(v, 1, symmAlg);
148        addOptional(v, 2, encSymmKey);
149        addOptional(v, 3, keyAlg);
150        addOptional(v, 4, valueHint);
151
152        v.add(encValue);
153
154        return new DERSequence(v);
155    }
156
157    private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj)
158    {
159        if (obj != null)
160        {
161            v.add(new DERTaggedObject(false, tagNo, obj));
162        }
163    }
164}