001package org.apache.commons.ssl.org.bouncycastle.asn1.pkcs;
002
003import java.util.Enumeration;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
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.ASN1Sequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
013
014public class EncryptedPrivateKeyInfo
015    extends ASN1Object
016{
017    private AlgorithmIdentifier algId;
018    private ASN1OctetString     data;
019
020    private EncryptedPrivateKeyInfo(
021        ASN1Sequence  seq)
022    {
023        Enumeration e = seq.getObjects();
024
025        algId = AlgorithmIdentifier.getInstance(e.nextElement());
026        data = ASN1OctetString.getInstance(e.nextElement());
027    }
028
029    public EncryptedPrivateKeyInfo(
030        AlgorithmIdentifier algId,
031        byte[]              encoding)
032    {
033        this.algId = algId;
034        this.data = new DEROctetString(encoding);
035    }
036
037    public static EncryptedPrivateKeyInfo getInstance(
038        Object  obj)
039    {
040        if (obj instanceof EncryptedPrivateKeyInfo)
041        {
042            return (EncryptedPrivateKeyInfo)obj;
043        }
044        else if (obj != null)
045        { 
046            return new EncryptedPrivateKeyInfo(ASN1Sequence.getInstance(obj));
047        }
048
049        return null;
050    }
051    
052    public AlgorithmIdentifier getEncryptionAlgorithm()
053    {
054        return algId;
055    }
056
057    public byte[] getEncryptedData()
058    {
059        return data.getOctets();
060    }
061
062    /**
063     * Produce an object suitable for an ASN1OutputStream.
064     * <pre>
065     * EncryptedPrivateKeyInfo ::= SEQUENCE {
066     *      encryptionAlgorithm AlgorithmIdentifier {{KeyEncryptionAlgorithms}},
067     *      encryptedData EncryptedData
068     * }
069     *
070     * EncryptedData ::= OCTET STRING
071     *
072     * KeyEncryptionAlgorithms ALGORITHM-IDENTIFIER ::= {
073     *          ... -- For local profiles
074     * }
075     * </pre>
076     */
077    public ASN1Primitive toASN1Primitive()
078    {
079        ASN1EncodableVector v = new ASN1EncodableVector();
080
081        v.add(algId);
082        v.add(data);
083
084        return new DERSequence(v);
085    }
086}