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}