001package org.apache.commons.ssl.org.bouncycastle.asn1.crmf;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
009import org.apache.commons.ssl.org.bouncycastle.asn1.cms.EnvelopedData;
010
011public class EncryptedKey
012    extends ASN1Object
013    implements ASN1Choice
014{
015    private EnvelopedData envelopedData;
016    private EncryptedValue encryptedValue;
017
018    public static EncryptedKey getInstance(Object o)
019    {
020        if (o instanceof EncryptedKey)
021        {
022            return (EncryptedKey)o;
023        }
024        else if (o instanceof ASN1TaggedObject)
025        {
026            return new EncryptedKey(EnvelopedData.getInstance((ASN1TaggedObject)o, false));
027        }
028        else if (o instanceof EncryptedValue)
029        {
030            return new EncryptedKey((EncryptedValue)o);
031        }
032        else
033        {
034            return new EncryptedKey(EncryptedValue.getInstance(o));
035        }
036    }
037
038    public EncryptedKey(EnvelopedData envelopedData)
039    {
040        this.envelopedData = envelopedData;
041    }
042
043    public EncryptedKey(EncryptedValue encryptedValue)
044    {
045        this.encryptedValue = encryptedValue;
046    }
047
048    public boolean isEncryptedValue()
049    {
050        return encryptedValue != null;
051    }
052
053    public ASN1Encodable getValue()
054    {
055        if (encryptedValue != null)
056        {
057            return encryptedValue;
058        }
059
060        return envelopedData;
061    }
062
063    /**
064     * <pre>
065     *    EncryptedKey ::= CHOICE {
066     *        encryptedValue        EncryptedValue, -- deprecated
067     *        envelopedData     [0] EnvelopedData }
068     *        -- The encrypted private key MUST be placed in the envelopedData
069     *        -- encryptedContentInfo encryptedContent OCTET STRING.
070     * </pre>
071     */
072    public ASN1Primitive toASN1Primitive()
073    {
074        if (encryptedValue != null)
075        {
076            return encryptedValue.toASN1Primitive();
077        }
078
079        return new DERTaggedObject(false, 0, envelopedData);
080    }
081}