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.ASN1Integer;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
011import org.apache.commons.ssl.org.bouncycastle.asn1.cms.EnvelopedData;
012
013public class POPOPrivKey
014    extends ASN1Object
015    implements ASN1Choice
016{
017    public static final int thisMessage = 0;
018    public static final int subsequentMessage = 1;
019    public static final int dhMAC = 2;
020    public static final int agreeMAC = 3;
021    public static final int encryptedKey = 4;
022
023    private int tagNo;
024    private ASN1Encodable obj;
025
026    private POPOPrivKey(ASN1TaggedObject obj)
027    {
028        this.tagNo = obj.getTagNo();
029
030        switch (tagNo)
031        {
032        case thisMessage:
033            this.obj = DERBitString.getInstance(obj, false);
034            break;
035        case subsequentMessage:
036            this.obj = SubsequentMessage.valueOf(ASN1Integer.getInstance(obj, false).getValue().intValue());
037            break;
038        case dhMAC:
039            this.obj = DERBitString.getInstance(obj, false);
040            break;
041        case agreeMAC:
042            this.obj = PKMACValue.getInstance(obj, false);
043            break;
044        case encryptedKey:
045            this.obj = EnvelopedData.getInstance(obj, false);
046            break;
047        default:
048            throw new IllegalArgumentException("unknown tag in POPOPrivKey");
049        }
050    }
051
052    public static POPOPrivKey getInstance(Object obj)
053    {
054        if (obj instanceof POPOPrivKey)
055        {
056            return (POPOPrivKey)obj;
057        }
058        if (obj != null)
059        {
060            return new POPOPrivKey(ASN1TaggedObject.getInstance(obj));
061        }
062
063        return null;
064    }
065
066    public static POPOPrivKey getInstance(ASN1TaggedObject obj, boolean explicit)
067    {
068        return getInstance(ASN1TaggedObject.getInstance(obj, explicit));
069    }
070
071    public POPOPrivKey(SubsequentMessage msg)
072    {
073        this.tagNo = subsequentMessage;
074        this.obj = msg;
075    }
076
077    public int getType()
078    {
079        return tagNo;
080    }
081
082    public ASN1Encodable getValue()
083    {
084        return obj;
085    }
086
087    /**
088     * <pre>
089     * POPOPrivKey ::= CHOICE {
090     *        thisMessage       [0] BIT STRING,         -- Deprecated
091     *         -- possession is proven in this message (which contains the private
092     *         -- key itself (encrypted for the CA))
093     *        subsequentMessage [1] SubsequentMessage,
094     *         -- possession will be proven in a subsequent message
095     *        dhMAC             [2] BIT STRING,         -- Deprecated
096     *        agreeMAC          [3] PKMACValue,
097     *        encryptedKey      [4] EnvelopedData }
098     * </pre>
099     */
100    public ASN1Primitive toASN1Primitive()
101    {
102        return new DERTaggedObject(false, tagNo, obj);
103    }
104}