001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.crypto.asn1.x509;
019
020 import java.util.Enumeration;
021 import java.util.Vector;
022
023 import org.apache.geronimo.crypto.asn1.ASN1Encodable;
024 import org.apache.geronimo.crypto.asn1.ASN1EncodableVector;
025 import org.apache.geronimo.crypto.asn1.ASN1OctetString;
026 import org.apache.geronimo.crypto.asn1.ASN1Sequence;
027 import org.apache.geronimo.crypto.asn1.ASN1TaggedObject;
028 import org.apache.geronimo.crypto.asn1.DERObject;
029 import org.apache.geronimo.crypto.asn1.DERObjectIdentifier;
030 import org.apache.geronimo.crypto.asn1.DEROctetString;
031 import org.apache.geronimo.crypto.asn1.DERSequence;
032 import org.apache.geronimo.crypto.asn1.DERTaggedObject;
033 import org.apache.geronimo.crypto.asn1.DERUTF8String;
034
035 /**
036 * Implementation of <code>IetfAttrSyntax</code> as specified by RFC3281.
037 */
038 public class IetfAttrSyntax
039 extends ASN1Encodable
040 {
041 public static final int VALUE_OCTETS = 1;
042 public static final int VALUE_OID = 2;
043 public static final int VALUE_UTF8 = 3;
044 GeneralNames policyAuthority = null;
045 Vector values = new Vector();
046 int valueChoice = -1;
047
048 /**
049 *
050 */
051 public IetfAttrSyntax(ASN1Sequence seq)
052 {
053 int i = 0;
054
055 if (seq.getObjectAt(0) instanceof ASN1TaggedObject)
056 {
057 policyAuthority = GeneralNames.getInstance(((ASN1TaggedObject)seq.getObjectAt(0)), false);
058 i++;
059 }
060 else if (seq.size() == 2)
061 { // VOMS fix
062 policyAuthority = GeneralNames.getInstance(seq.getObjectAt(0));
063 i++;
064 }
065
066 if (!(seq.getObjectAt(i) instanceof ASN1Sequence))
067 {
068 throw new IllegalArgumentException("Non-IetfAttrSyntax encoding");
069 }
070
071 seq = (ASN1Sequence)seq.getObjectAt(i);
072
073 for (Enumeration e = seq.getObjects(); e.hasMoreElements();)
074 {
075 DERObject obj = (DERObject)e.nextElement();
076 int type;
077
078 if (obj instanceof DERObjectIdentifier)
079 {
080 type = VALUE_OID;
081 }
082 else if (obj instanceof DERUTF8String)
083 {
084 type = VALUE_UTF8;
085 }
086 else if (obj instanceof DEROctetString)
087 {
088 type = VALUE_OCTETS;
089 }
090 else
091 {
092 throw new IllegalArgumentException("Bad value type encoding IetfAttrSyntax");
093 }
094
095 if (valueChoice < 0)
096 {
097 valueChoice = type;
098 }
099
100 if (type != valueChoice)
101 {
102 throw new IllegalArgumentException("Mix of value types in IetfAttrSyntax");
103 }
104
105 values.addElement(obj);
106 }
107 }
108
109 public GeneralNames getPolicyAuthority()
110 {
111 return policyAuthority;
112 }
113
114 public int getValueType()
115 {
116 return valueChoice;
117 }
118
119 public Object[] getValues()
120 {
121 if (this.getValueType() == VALUE_OCTETS)
122 {
123 ASN1OctetString[] tmp = new ASN1OctetString[values.size()];
124
125 for (int i = 0; i != tmp.length; i++)
126 {
127 tmp[i] = (ASN1OctetString)values.elementAt(i);
128 }
129
130 return tmp;
131 }
132 else if (this.getValueType() == VALUE_OID)
133 {
134 DERObjectIdentifier[] tmp = new DERObjectIdentifier[values.size()];
135
136 for (int i = 0; i != tmp.length; i++)
137 {
138 tmp[i] = (DERObjectIdentifier)values.elementAt(i);
139 }
140
141 return tmp;
142 }
143 else
144 {
145 DERUTF8String[] tmp = new DERUTF8String[values.size()];
146
147 for (int i = 0; i != tmp.length; i++)
148 {
149 tmp[i] = (DERUTF8String)values.elementAt(i);
150 }
151
152 return tmp;
153 }
154 }
155
156 /**
157 *
158 * <pre>
159 *
160 * IetfAttrSyntax ::= SEQUENCE {
161 * policyAuthority [0] GeneralNames OPTIONAL,
162 * values SEQUENCE OF CHOICE {
163 * octets OCTET STRING,
164 * oid OBJECT IDENTIFIER,
165 * string UTF8String
166 * }
167 * }
168 *
169 * </pre>
170 */
171 public DERObject toASN1Object()
172 {
173 ASN1EncodableVector v = new ASN1EncodableVector();
174
175 if (policyAuthority != null)
176 {
177 v.add(new DERTaggedObject(0, policyAuthority));
178 }
179
180 ASN1EncodableVector v2 = new ASN1EncodableVector();
181
182 for (Enumeration i = values.elements(); i.hasMoreElements();)
183 {
184 v2.add((ASN1Encodable)i.nextElement());
185 }
186
187 v.add(new DERSequence(v2));
188
189 return new DERSequence(v);
190 }
191 }