001: /*
002: * @(#)EDIPartyName.java 1.14 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.IOException;
031: import sun.security.util.*;
032:
033: /**
034: * This class defines the EDIPartyName of the GeneralName choice.
035: * The ASN.1 syntax for this is:
036: * <pre>
037: * EDIPartyName ::= SEQUENCE {
038: * nameAssigner [0] DirectoryString OPTIONAL,
039: * partyName [1] DirectoryString }
040: * </pre>
041: *
042: * @author Hemma Prafullchandra
043: * @version 1.6
044: * @see GeneralName
045: * @see GeneralNames
046: * @see GeneralNameInterface
047: */
048: public class EDIPartyName implements GeneralNameInterface {
049:
050: // Private data members
051: private static final byte TAG_ASSIGNER = 0;
052: private static final byte TAG_PARTYNAME = 1;
053:
054: private String assigner = null;
055: private String party = null;
056:
057: /**
058: * Create the EDIPartyName object from the specified names.
059: *
060: * @param assignerName the name of the assigner
061: * @param partyName the name of the EDI party.
062: */
063: public EDIPartyName(String assignerName, String partyName) {
064: this .assigner = assignerName;
065: this .party = partyName;
066: }
067:
068: /**
069: * Create the EDIPartyName object from the specified name.
070: *
071: * @param partyName the name of the EDI party.
072: */
073: public EDIPartyName(String partyName) {
074: this .party = partyName;
075: }
076:
077: /**
078: * Create the EDIPartyName object from the passed encoded Der value.
079: *
080: * @param derValue the encoded DER EDIPartyName.
081: * @exception IOException on error.
082: */
083: public EDIPartyName(DerValue derValue) throws IOException {
084: DerInputStream in = new DerInputStream(derValue.toByteArray());
085: DerValue[] seq = in.getSequence(2);
086:
087: int len = seq.length;
088: if (len < 1 || len > 2)
089: throw new IOException("Invalid encoding of EDIPartyName");
090:
091: for (int i = 0; i < len; i++) {
092: DerValue opt = seq[i];
093: if (opt.isContextSpecific((byte) TAG_ASSIGNER)
094: && !opt.isConstructed()) {
095: if (assigner != null)
096: throw new IOException(
097: "Duplicate nameAssigner found in"
098: + " EDIPartyName");
099: opt = opt.data.getDerValue();
100: assigner = opt.getAsString();
101: }
102: if (opt.isContextSpecific((byte) TAG_PARTYNAME)
103: && !opt.isConstructed()) {
104: if (party != null)
105: throw new IOException(
106: "Duplicate partyName found in"
107: + " EDIPartyName");
108: opt = opt.data.getDerValue();
109: party = opt.getAsString();
110: }
111: }
112: }
113:
114: /**
115: * Return the type of the GeneralName.
116: */
117: public int getType() {
118: return (GeneralNameInterface.NAME_EDI);
119: }
120:
121: /**
122: * Encode the EDI party name into the DerOutputStream.
123: *
124: * @param out the DER stream to encode the EDIPartyName to.
125: * @exception IOException on encoding errors.
126: */
127: public void encode(DerOutputStream out) throws IOException {
128: DerOutputStream tagged = new DerOutputStream();
129: DerOutputStream tmp = new DerOutputStream();
130:
131: if (assigner != null) {
132: DerOutputStream tmp2 = new DerOutputStream();
133: // TODO - shd check is chars fit into PrintableString
134: tmp2.putPrintableString(assigner);
135: tagged.write(DerValue.createTag(DerValue.TAG_CONTEXT,
136: false, TAG_ASSIGNER), tmp2);
137: }
138: if (party == null)
139: throw new IOException("Cannot have null partyName");
140:
141: // TODO - shd check is chars fit into PrintableString
142: tmp.putPrintableString(party);
143: tagged.write(DerValue.createTag(DerValue.TAG_CONTEXT, false,
144: TAG_PARTYNAME), tmp);
145:
146: out.write(DerValue.tag_Sequence, tagged);
147: }
148:
149: /**
150: * Return the assignerName
151: *
152: * @returns String assignerName
153: */
154: public String getAssignerName() {
155: return assigner;
156: }
157:
158: /**
159: * Return the partyName
160: *
161: * @returns String partyName
162: */
163: public String getPartyName() {
164: return party;
165: }
166:
167: /**
168: * Compare this EDIPartyName with another. Does a byte-string
169: * comparison without regard to type of the partyName and
170: * the assignerName.
171: *
172: * @returns true if the two names match
173: */
174: public boolean equals(Object other) {
175: if (!(other instanceof EDIPartyName))
176: return false;
177: String otherAssigner = ((EDIPartyName) other).assigner;
178: if (this .assigner == null) {
179: if (otherAssigner != null)
180: return false;
181: } else {
182: if (!(this .assigner.equals(otherAssigner)))
183: return false;
184: }
185: String otherParty = ((EDIPartyName) other).party;
186: if (this .party == null) {
187: if (otherParty != null)
188: return false;
189: } else {
190: if (!(this .party.equals(otherParty)))
191: return false;
192: }
193: return true;
194: }
195:
196: /**
197: * Return the printable string.
198: */
199: public String toString() {
200: return ("EDIPartyName: "
201: + ((assigner == null) ? "" : (" nameAssigner = "
202: + assigner + ",")) + " partyName = " + party);
203: }
204:
205: /**
206: * Return constraint type:<ul>
207: * <li>NAME_DIFF_TYPE = -1: input name is different type from name (i.e. does not constrain)
208: * <li>NAME_MATCH = 0: input name matches name
209: * <li>NAME_NARROWS = 1: input name narrows name
210: * <li>NAME_WIDENS = 2: input name widens name
211: * <li>NAME_SAME_TYPE = 3: input name does not match or narrow name, but is same type
212: * </ul>. These results are used in checking NameConstraints during
213: * certification path verification.
214: *
215: * @param inputName to be checked for being constrained
216: * @returns constraint type above
217: * @throws UnsupportedOperationException if name is same type, but comparison operations are
218: * not supported for this name type.
219: */
220: public int constrains(GeneralNameInterface inputName)
221: throws UnsupportedOperationException {
222: int constraintType;
223: if (inputName == null)
224: constraintType = NAME_DIFF_TYPE;
225: else if (inputName.getType() != NAME_EDI)
226: constraintType = NAME_DIFF_TYPE;
227: else {
228: throw new UnsupportedOperationException(
229: "Narrowing, widening, and matching of names not supported for EDIPartyName");
230: }
231: return constraintType;
232: }
233:
234: /**
235: * Return subtree depth of this name for purposes of determining
236: * NameConstraints minimum and maximum bounds and for calculating
237: * path lengths in name subtrees.
238: *
239: * @returns distance of name from root
240: * @throws UnsupportedOperationException if not supported for this name type
241: */
242: public int subtreeDepth() throws UnsupportedOperationException {
243: throw new UnsupportedOperationException(
244: "subtreeDepth() not supported for EDIPartyName");
245: }
246:
247: }
|