001: /*
002: * @(#)GeneralSubtree.java 1.17 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package sun.security.x509;
029:
030: import java.io.*;
031:
032: import sun.security.util.*;
033:
034: /**
035: * Represent the GeneralSubtree ASN.1 object, whose syntax is:
036: * <pre>
037: * GeneralSubtree ::= SEQUENCE {
038: * base GeneralName,
039: * minimum [0] BaseDistance DEFAULT 0,
040: * maximum [1] BaseDistance OPTIONAL
041: * }
042: * BaseDistance ::= INTEGER (0..MAX)
043: * </pre>
044: * @version 1.9
045: * @author Amit Kapoor
046: * @author Hemma Prafullchandra
047: */
048: public class GeneralSubtree {
049: private static final byte TAG_MIN = 0;
050: private static final byte TAG_MAX = 1;
051: private static final int MIN_DEFAULT = 0;
052:
053: private GeneralName name;
054: private int minimum = MIN_DEFAULT;
055: private int maximum = -1;
056:
057: /**
058: * The default constructor for the class.
059: *
060: * @params name the GeneralName
061: * @params min the minimum BaseDistance
062: * @params max the maximum BaseDistance
063: */
064: public GeneralSubtree(GeneralName name, int min, int max) {
065: this .name = name;
066: this .minimum = min;
067: this .maximum = max;
068: }
069:
070: /**
071: * Create the object from its DER encoded form.
072: *
073: * @param val the DER encoded from of the same.
074: */
075: public GeneralSubtree(DerValue val) throws IOException {
076: if (val.tag != DerValue.tag_Sequence) {
077: throw new IOException(
078: "Invalid encoding for GeneralSubtree.");
079: }
080: name = new GeneralName(val.data.getDerValue());
081:
082: // NB. this is always encoded with the IMPLICIT tag
083: // The checks only make sense if we assume implicit tagging,
084: // with explicit tagging the form is always constructed.
085: while (val.data.available() != 0) {
086: DerValue opt = val.data.getDerValue();
087:
088: if (opt.isContextSpecific(TAG_MIN) && !opt.isConstructed()) {
089: opt.resetTag(DerValue.tag_Integer);
090: minimum = opt.getInteger();
091:
092: } else if (opt.isContextSpecific(TAG_MAX)
093: && !opt.isConstructed()) {
094: opt.resetTag(DerValue.tag_Integer);
095: maximum = opt.getInteger();
096: } else
097: throw new IOException(
098: "Invalid encoding of GeneralSubtree.");
099: }
100: }
101:
102: /**
103: * Return the GeneralName.
104: *
105: * @return the GeneralName
106: */
107: public GeneralName getName() {
108: //NOTE: May want to consider cloning this
109: return name;
110: }
111:
112: /**
113: * Return the minimum BaseDistance.
114: *
115: * @return the minimum BaseDistance. Default is 0 if not set.
116: */
117: public int getMinimum() {
118: return minimum;
119: }
120:
121: /**
122: * Return the maximum BaseDistance.
123: *
124: * @return the maximum BaseDistance, or -1 if not set.
125: */
126: public int getMaximum() {
127: return maximum;
128: }
129:
130: /**
131: * Return a printable string of the GeneralSubtree.
132: */
133: public String toString() {
134: String s = "\n GeneralSubtree: [\n" + " GeneralName: "
135: + ((name == null) ? "" : name.toString())
136: + "\n Minimum: " + minimum;
137: if (maximum == -1) {
138: s += "\t Maximum: undefined";
139: } else
140: s += "\t Maximum: " + maximum;
141: s += " ]\n";
142: return (s);
143: }
144:
145: /**
146: * Compare this GeneralSubtree with another
147: *
148: * @param other GeneralSubtree to compare to this
149: * @returns true if match
150: */
151: public boolean equals(Object other) {
152: if (!(other instanceof GeneralSubtree))
153: return false;
154: GeneralSubtree otherGS = (GeneralSubtree) other;
155: if (this .name == null) {
156: if (otherGS.name != null) {
157: return false;
158: }
159: } else {
160: if (!((this .name).equals(otherGS.name)))
161: return false;
162: }
163: if (this .minimum != otherGS.minimum)
164: return false;
165: if (this .maximum != otherGS.maximum)
166: return false;
167: return true;
168: }
169:
170: /**
171: * Encode the GeneralSubtree.
172: *
173: * @params out the DerOutputStream to encode this object to.
174: */
175: public void encode(DerOutputStream out) throws IOException {
176: DerOutputStream seq = new DerOutputStream();
177:
178: name.encode(seq);
179:
180: if (minimum != MIN_DEFAULT) {
181: DerOutputStream tmp = new DerOutputStream();
182: tmp.putInteger(minimum);
183: seq.writeImplicit(DerValue.createTag(DerValue.TAG_CONTEXT,
184: false, TAG_MIN), tmp);
185: }
186: if (maximum != -1) {
187: DerOutputStream tmp = new DerOutputStream();
188: tmp.putInteger(maximum);
189: seq.writeImplicit(DerValue.createTag(DerValue.TAG_CONTEXT,
190: false, TAG_MAX), tmp);
191: }
192: out.write(DerValue.tag_Sequence, seq);
193: }
194: }
|