001package org.apache.commons.ssl.org.bouncycastle.asn1.x9;
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.DERSequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
012
013/**
014 * ANS.1 def for Diffie-Hellman key exchange OtherInfo structure. See
015 * RFC 2631, or X9.42, for further details.
016 */
017public class OtherInfo
018    extends ASN1Object
019{
020    private KeySpecificInfo     keyInfo;
021    private ASN1OctetString     partyAInfo;
022    private ASN1OctetString     suppPubInfo;
023
024    public OtherInfo(
025        KeySpecificInfo     keyInfo,
026        ASN1OctetString     partyAInfo,
027        ASN1OctetString     suppPubInfo)
028    {
029        this.keyInfo = keyInfo;
030        this.partyAInfo = partyAInfo;
031        this.suppPubInfo = suppPubInfo;
032    }
033
034    public OtherInfo(
035        ASN1Sequence  seq)
036    {
037        Enumeration e = seq.getObjects();
038
039        keyInfo = new KeySpecificInfo((ASN1Sequence)e.nextElement());
040
041        while (e.hasMoreElements())
042        {
043            DERTaggedObject o = (DERTaggedObject)e.nextElement();
044
045            if (o.getTagNo() == 0)
046            {
047                partyAInfo = (ASN1OctetString)o.getObject();
048            }
049            else if (o.getTagNo() == 2)
050            {
051                suppPubInfo = (ASN1OctetString)o.getObject();
052            }
053        }
054    }
055
056    public KeySpecificInfo getKeyInfo()
057    {
058        return keyInfo;
059    }
060
061    public ASN1OctetString getPartyAInfo()
062    {
063        return partyAInfo;
064    }
065
066    public ASN1OctetString getSuppPubInfo()
067    {
068        return suppPubInfo;
069    }
070
071    /**
072     * Produce an object suitable for an ASN1OutputStream.
073     * <pre>
074     *  OtherInfo ::= SEQUENCE {
075     *      keyInfo KeySpecificInfo,
076     *      partyAInfo [0] OCTET STRING OPTIONAL,
077     *      suppPubInfo [2] OCTET STRING
078     *  }
079     * </pre>
080     */
081    public ASN1Primitive toASN1Primitive()
082    {
083        ASN1EncodableVector  v = new ASN1EncodableVector();
084
085        v.add(keyInfo);
086
087        if (partyAInfo != null)
088        {
089            v.add(new DERTaggedObject(0, partyAInfo));
090        }
091
092        v.add(new DERTaggedObject(2, suppPubInfo));
093
094        return new DERSequence(v);
095    }
096}