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.DERNull;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
010
011public class ProofOfPossession
012    extends ASN1Object
013    implements ASN1Choice
014{
015    public static final int TYPE_RA_VERIFIED = 0;
016    public static final int TYPE_SIGNING_KEY = 1;
017    public static final int TYPE_KEY_ENCIPHERMENT = 2;
018    public static final int TYPE_KEY_AGREEMENT = 3;
019
020    private int tagNo;
021    private ASN1Encodable obj;
022
023    private ProofOfPossession(ASN1TaggedObject tagged)
024    {
025        tagNo = tagged.getTagNo();
026        switch (tagNo)
027        {
028        case 0:
029            obj = DERNull.INSTANCE;
030            break;
031        case 1:
032            obj = POPOSigningKey.getInstance(tagged, false);
033            break;
034        case 2:
035        case 3:
036            obj = POPOPrivKey.getInstance(tagged, true);
037            break;
038        default:
039            throw new IllegalArgumentException("unknown tag: " + tagNo);
040        }
041    }
042
043    public static ProofOfPossession getInstance(Object o)
044    {
045        if (o == null || o instanceof ProofOfPossession)
046        {
047            return (ProofOfPossession)o;
048        }
049
050        if (o instanceof ASN1TaggedObject)
051        {
052            return new ProofOfPossession((ASN1TaggedObject)o);
053        }
054
055        throw new IllegalArgumentException("Invalid object: " + o.getClass().getName());
056    }
057
058    /** Creates a ProofOfPossession with type raVerified. */
059    public ProofOfPossession()
060    {
061        tagNo = TYPE_RA_VERIFIED;
062        obj = DERNull.INSTANCE;
063    }
064
065    /** Creates a ProofOfPossession for a signing key. */
066    public ProofOfPossession(POPOSigningKey poposk)
067    {
068        tagNo = TYPE_SIGNING_KEY;
069        obj = poposk;
070    }
071
072    /**
073     * Creates a ProofOfPossession for key encipherment or agreement.
074     * @param type one of TYPE_KEY_ENCIPHERMENT or TYPE_KEY_AGREEMENT
075     */
076    public ProofOfPossession(int type, POPOPrivKey privkey)
077    {
078        tagNo = type;
079        obj = privkey;
080    }
081
082    public int getType()
083    {
084        return tagNo;
085    }
086
087    public ASN1Encodable getObject()
088    {
089        return obj;
090    }
091
092    /**
093     * <pre>
094     * ProofOfPossession ::= CHOICE {
095     *                           raVerified        [0] NULL,
096     *                           -- used if the RA has already verified that the requester is in
097     *                           -- possession of the private key
098     *                           signature         [1] POPOSigningKey,
099     *                           keyEncipherment   [2] POPOPrivKey,
100     *                           keyAgreement      [3] POPOPrivKey }
101     * </pre>
102     * @return a basic ASN.1 object representation.
103     */
104    public ASN1Primitive toASN1Primitive()
105    {
106        return new DERTaggedObject(false, tagNo, obj);
107    }
108}