001package org.apache.commons.ssl.org.bouncycastle.asn1.crmf;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Boolean;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
011
012public class PKIArchiveOptions
013    extends ASN1Object
014    implements ASN1Choice
015{
016    public static final int encryptedPrivKey = 0;
017    public static final int keyGenParameters = 1;
018    public static final int archiveRemGenPrivKey = 2;
019
020    private ASN1Encodable value;
021
022    public static PKIArchiveOptions getInstance(Object o)
023    {
024        if (o == null || o instanceof PKIArchiveOptions)
025        {
026            return (PKIArchiveOptions)o;
027        }
028        else if (o instanceof ASN1TaggedObject)
029        {
030            return new PKIArchiveOptions((ASN1TaggedObject)o);
031        }
032
033        throw new IllegalArgumentException("unknown object: " + o);
034    }
035
036    private PKIArchiveOptions(ASN1TaggedObject tagged)
037    {
038        switch (tagged.getTagNo())
039        {
040        case encryptedPrivKey:
041            value = EncryptedKey.getInstance(tagged.getObject());
042            break;
043        case keyGenParameters:
044            value = ASN1OctetString.getInstance(tagged, false);
045            break;
046        case archiveRemGenPrivKey:
047            value = ASN1Boolean.getInstance(tagged, false);
048            break;
049        default:
050            throw new IllegalArgumentException("unknown tag number: " + tagged.getTagNo());
051        }
052    }
053
054    public PKIArchiveOptions(EncryptedKey encKey)
055    {
056        this.value = encKey;
057    }
058
059    public PKIArchiveOptions(ASN1OctetString keyGenParameters)
060    {
061        this.value = keyGenParameters;
062    }
063
064    public PKIArchiveOptions(boolean archiveRemGenPrivKey)
065    {
066        this.value = ASN1Boolean.getInstance(archiveRemGenPrivKey);
067    }
068
069    public int getType()
070    {
071        if (value instanceof EncryptedKey)
072        {
073            return encryptedPrivKey;
074        }
075
076        if (value instanceof ASN1OctetString)
077        {
078            return keyGenParameters;
079        }
080
081        return archiveRemGenPrivKey;
082    }
083
084    public ASN1Encodable getValue()
085    {
086        return value;
087    }
088    
089    /**
090     * <pre>
091     *  PKIArchiveOptions ::= CHOICE {
092     *      encryptedPrivKey     [0] EncryptedKey,
093     *      -- the actual value of the private key
094     *      keyGenParameters     [1] KeyGenParameters,
095     *      -- parameters which allow the private key to be re-generated
096     *      archiveRemGenPrivKey [2] BOOLEAN }
097     *      -- set to TRUE if sender wishes receiver to archive the private
098     *      -- key of a key pair that the receiver generates in response to
099     *      -- this request; set to FALSE if no archival is desired.
100     * </pre>
101     */
102    public ASN1Primitive toASN1Primitive()
103    {
104        if (value instanceof EncryptedKey)
105        {
106            return new DERTaggedObject(true, encryptedPrivKey, value);  // choice
107        }
108
109        if (value instanceof ASN1OctetString)
110        {
111            return new DERTaggedObject(false, keyGenParameters, value);
112        }
113
114        return new DERTaggedObject(false, archiveRemGenPrivKey, value);
115    }
116}