001package org.apache.commons.ssl.org.bouncycastle.asn1.x509; 002 003import java.util.Enumeration; 004import java.util.Vector; 005 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier; 010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString; 011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 012import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 013import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 014import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString; 015import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 016import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 017import org.apache.commons.ssl.org.bouncycastle.asn1.DERUTF8String; 018 019/** 020 * Implementation of <code>IetfAttrSyntax</code> as specified by RFC3281. 021 */ 022public class IetfAttrSyntax 023 extends ASN1Object 024{ 025 public static final int VALUE_OCTETS = 1; 026 public static final int VALUE_OID = 2; 027 public static final int VALUE_UTF8 = 3; 028 GeneralNames policyAuthority = null; 029 Vector values = new Vector(); 030 int valueChoice = -1; 031 032 public static IetfAttrSyntax getInstance(Object obj) 033 { 034 if (obj instanceof IetfAttrSyntax) 035 { 036 return (IetfAttrSyntax)obj; 037 } 038 if (obj != null) 039 { 040 return new IetfAttrSyntax(ASN1Sequence.getInstance(obj)); 041 } 042 043 return null; 044 } 045 046 /** 047 * 048 */ 049 private IetfAttrSyntax(ASN1Sequence seq) 050 { 051 int i = 0; 052 053 if (seq.getObjectAt(0) instanceof ASN1TaggedObject) 054 { 055 policyAuthority = GeneralNames.getInstance(((ASN1TaggedObject)seq.getObjectAt(0)), false); 056 i++; 057 } 058 else if (seq.size() == 2) 059 { // VOMS fix 060 policyAuthority = GeneralNames.getInstance(seq.getObjectAt(0)); 061 i++; 062 } 063 064 if (!(seq.getObjectAt(i) instanceof ASN1Sequence)) 065 { 066 throw new IllegalArgumentException("Non-IetfAttrSyntax encoding"); 067 } 068 069 seq = (ASN1Sequence)seq.getObjectAt(i); 070 071 for (Enumeration e = seq.getObjects(); e.hasMoreElements();) 072 { 073 ASN1Primitive obj = (ASN1Primitive)e.nextElement(); 074 int type; 075 076 if (obj instanceof ASN1ObjectIdentifier) 077 { 078 type = VALUE_OID; 079 } 080 else if (obj instanceof DERUTF8String) 081 { 082 type = VALUE_UTF8; 083 } 084 else if (obj instanceof DEROctetString) 085 { 086 type = VALUE_OCTETS; 087 } 088 else 089 { 090 throw new IllegalArgumentException("Bad value type encoding IetfAttrSyntax"); 091 } 092 093 if (valueChoice < 0) 094 { 095 valueChoice = type; 096 } 097 098 if (type != valueChoice) 099 { 100 throw new IllegalArgumentException("Mix of value types in IetfAttrSyntax"); 101 } 102 103 values.addElement(obj); 104 } 105 } 106 107 public GeneralNames getPolicyAuthority() 108 { 109 return policyAuthority; 110 } 111 112 public int getValueType() 113 { 114 return valueChoice; 115 } 116 117 public Object[] getValues() 118 { 119 if (this.getValueType() == VALUE_OCTETS) 120 { 121 ASN1OctetString[] tmp = new ASN1OctetString[values.size()]; 122 123 for (int i = 0; i != tmp.length; i++) 124 { 125 tmp[i] = (ASN1OctetString)values.elementAt(i); 126 } 127 128 return tmp; 129 } 130 else if (this.getValueType() == VALUE_OID) 131 { 132 ASN1ObjectIdentifier[] tmp = new ASN1ObjectIdentifier[values.size()]; 133 134 for (int i = 0; i != tmp.length; i++) 135 { 136 tmp[i] = (ASN1ObjectIdentifier)values.elementAt(i); 137 } 138 139 return tmp; 140 } 141 else 142 { 143 DERUTF8String[] tmp = new DERUTF8String[values.size()]; 144 145 for (int i = 0; i != tmp.length; i++) 146 { 147 tmp[i] = (DERUTF8String)values.elementAt(i); 148 } 149 150 return tmp; 151 } 152 } 153 154 /** 155 * 156 * <pre> 157 * 158 * IetfAttrSyntax ::= SEQUENCE { 159 * policyAuthority [0] GeneralNames OPTIONAL, 160 * values SEQUENCE OF CHOICE { 161 * octets OCTET STRING, 162 * oid OBJECT IDENTIFIER, 163 * string UTF8String 164 * } 165 * } 166 * 167 * </pre> 168 */ 169 public ASN1Primitive toASN1Primitive() 170 { 171 ASN1EncodableVector v = new ASN1EncodableVector(); 172 173 if (policyAuthority != null) 174 { 175 v.add(new DERTaggedObject(0, policyAuthority)); 176 } 177 178 ASN1EncodableVector v2 = new ASN1EncodableVector(); 179 180 for (Enumeration i = values.elements(); i.hasMoreElements();) 181 { 182 v2.add((ASN1Encodable)i.nextElement()); 183 } 184 185 v.add(new DERSequence(v2)); 186 187 return new DERSequence(v); 188 } 189}