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.util.asn1.x509;
019
020 import java.math.BigInteger;
021
022 import org.apache.geronimo.util.asn1.ASN1EncodableVector;
023 import org.apache.geronimo.util.asn1.ASN1Sequence;
024 import org.apache.geronimo.util.asn1.ASN1TaggedObject;
025 import org.apache.geronimo.util.asn1.DERBoolean;
026 import org.apache.geronimo.util.asn1.ASN1Encodable;
027 import org.apache.geronimo.util.asn1.DERInteger;
028 import org.apache.geronimo.util.asn1.DERObject;
029 import org.apache.geronimo.util.asn1.DERSequence;
030
031 public class BasicConstraints
032 extends ASN1Encodable
033 {
034 DERBoolean cA = new DERBoolean(false);
035 DERInteger pathLenConstraint = null;
036
037 public static BasicConstraints getInstance(
038 ASN1TaggedObject obj,
039 boolean explicit)
040 {
041 return getInstance(ASN1Sequence.getInstance(obj, explicit));
042 }
043
044 public static BasicConstraints getInstance(
045 Object obj)
046 {
047 if (obj == null || obj instanceof BasicConstraints)
048 {
049 return (BasicConstraints)obj;
050 }
051 else if (obj instanceof ASN1Sequence)
052 {
053 return new BasicConstraints((ASN1Sequence)obj);
054 }
055
056 throw new IllegalArgumentException("unknown object in factory");
057 }
058
059 public BasicConstraints(
060 ASN1Sequence seq)
061 {
062 if (seq.size() == 0)
063 {
064 this.cA = null;
065 this.pathLenConstraint = null;
066 }
067 else
068 {
069 this.cA = (DERBoolean)seq.getObjectAt(0);
070 if (seq.size() > 1)
071 {
072 this.pathLenConstraint = (DERInteger)seq.getObjectAt(1);
073 }
074 }
075 }
076
077 /**
078 * @deprecated use one of the other two unambigous constructors.
079 * @param cA
080 * @param pathLenConstraint
081 */
082 public BasicConstraints(
083 boolean cA,
084 int pathLenConstraint)
085 {
086 if (cA )
087 {
088 this.cA = new DERBoolean(cA);
089 this.pathLenConstraint = new DERInteger(pathLenConstraint);
090 }
091 else
092 {
093 this.cA = null;
094 this.pathLenConstraint = null;
095 }
096 }
097
098 public BasicConstraints(
099 boolean cA)
100 {
101 if (cA)
102 {
103 this.cA = new DERBoolean(true);
104 }
105 else
106 {
107 this.cA = null;
108 }
109 this.pathLenConstraint = null;
110 }
111
112 /**
113 * create a cA=true object for the given path length constraint.
114 *
115 * @param pathLenConstraint
116 */
117 public BasicConstraints(
118 int pathLenConstraint)
119 {
120 this.cA = new DERBoolean(true);
121 this.pathLenConstraint = new DERInteger(pathLenConstraint);
122 }
123
124 public boolean isCA()
125 {
126 return (cA != null) && cA.isTrue();
127 }
128
129 public BigInteger getPathLenConstraint()
130 {
131 if (pathLenConstraint != null)
132 {
133 return pathLenConstraint.getValue();
134 }
135
136 return null;
137 }
138
139 /**
140 * Produce an object suitable for an ASN1OutputStream.
141 * <pre>
142 * BasicConstraints := SEQUENCE {
143 * cA BOOLEAN DEFAULT FALSE,
144 * pathLenConstraint INTEGER (0..MAX) OPTIONAL
145 * }
146 * </pre>
147 */
148 public DERObject toASN1Object()
149 {
150 ASN1EncodableVector v = new ASN1EncodableVector();
151
152 if (cA != null)
153 {
154 v.add(cA);
155
156 if (pathLenConstraint != null)
157 {
158 v.add(pathLenConstraint);
159 }
160 }
161
162 return new DERSequence(v);
163 }
164
165 public String toString()
166 {
167 if (pathLenConstraint == null)
168 {
169 if (cA == null)
170 {
171 return "BasicConstraints: isCa(false)";
172 }
173 return "BasicConstraints: isCa(" + this.isCA() + ")";
174 }
175 return "BasicConstraints: isCa(" + this.isCA() + "), pathLenConstraint = " + pathLenConstraint.getValue();
176 }
177 }