/* | 
|
 * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. | 
|
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|
 * | 
|
 * This code is free software; you can redistribute it and/or modify it | 
|
 * under the terms of the GNU General Public License version 2 only, as | 
|
 * published by the Free Software Foundation.  Oracle designates this | 
|
 * particular file as subject to the "Classpath" exception as provided | 
|
 * by Oracle in the LICENSE file that accompanied this code. | 
|
 * | 
|
 * This code is distributed in the hope that it will be useful, but WITHOUT | 
|
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|
 * version 2 for more details (a copy is included in the LICENSE file that | 
|
 * accompanied this code). | 
|
 * | 
|
 * You should have received a copy of the GNU General Public License version | 
|
 * 2 along with this work; if not, write to the Free Software Foundation, | 
|
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|
 * | 
|
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|
 * or visit www.oracle.com if you need additional information or have any | 
|
 * questions. | 
|
*/  | 
|
package sun.security.x509;  | 
|
import java.io.IOException;  | 
|
import sun.security.util.*;  | 
|
/** | 
|
 * This class defines the EDIPartyName of the GeneralName choice. | 
|
 * The ASN.1 syntax for this is: | 
|
 * <pre> | 
|
 * EDIPartyName ::= SEQUENCE { | 
|
 *     nameAssigner  [0]  DirectoryString OPTIONAL, | 
|
 *     partyName     [1]  DirectoryString } | 
|
 * </pre> | 
|
 * | 
|
 * @author Hemma Prafullchandra | 
|
 * @see GeneralName | 
|
 * @see GeneralNames | 
|
 * @see GeneralNameInterface | 
|
*/  | 
|
public class EDIPartyName implements GeneralNameInterface {  | 
|
    // Private data members | 
|
private static final byte TAG_ASSIGNER = 0;  | 
|
private static final byte TAG_PARTYNAME = 1;  | 
|
private String assigner = null;  | 
|
private String party = null;  | 
|
private int myhash = -1;  | 
|
    /** | 
|
     * Create the EDIPartyName object from the specified names. | 
|
     * | 
|
     * @param assignerName the name of the assigner | 
|
     * @param partyName the name of the EDI party. | 
|
*/  | 
|
public EDIPartyName(String assignerName, String partyName) {  | 
|
this.assigner = assignerName;  | 
|
this.party = partyName;  | 
|
}  | 
|
    /** | 
|
     * Create the EDIPartyName object from the specified name. | 
|
     * | 
|
     * @param partyName the name of the EDI party. | 
|
*/  | 
|
public EDIPartyName(String partyName) {  | 
|
this.party = partyName;  | 
|
}  | 
|
    /** | 
|
     * Create the EDIPartyName object from the passed encoded Der value. | 
|
     * | 
|
     * @param derValue the encoded DER EDIPartyName. | 
|
     * @exception IOException on error. | 
|
*/  | 
|
public EDIPartyName(DerValue derValue) throws IOException {  | 
|
DerInputStream in = new DerInputStream(derValue.toByteArray());  | 
|
DerValue[] seq = in.getSequence(2);  | 
|
int len = seq.length;  | 
|
if (len < 1 || len > 2)  | 
|
throw new IOException("Invalid encoding of EDIPartyName");  | 
|
for (int i = 0; i < len; i++) {  | 
|
DerValue opt = seq[i];  | 
|
if (opt.isContextSpecific(TAG_ASSIGNER) &&  | 
|
!opt.isConstructed()) {  | 
|
if (assigner != null)  | 
|
throw new IOException("Duplicate nameAssigner found in"  | 
|
                                          + " EDIPartyName"); | 
|
opt = opt.data.getDerValue();  | 
|
assigner = opt.getAsString();  | 
|
}  | 
|
if (opt.isContextSpecific(TAG_PARTYNAME) &&  | 
|
!opt.isConstructed()) {  | 
|
if (party != null)  | 
|
throw new IOException("Duplicate partyName found in"  | 
|
                                          + " EDIPartyName"); | 
|
opt = opt.data.getDerValue();  | 
|
party = opt.getAsString();  | 
|
}  | 
|
}  | 
|
}  | 
|
    /** | 
|
     * Return the type of the GeneralName. | 
|
*/  | 
|
    public int getType() { | 
|
return (GeneralNameInterface.NAME_EDI);  | 
|
}  | 
|
    /** | 
|
     * Encode the EDI party name into the DerOutputStream. | 
|
     * | 
|
     * @param out the DER stream to encode the EDIPartyName to. | 
|
     * @exception IOException on encoding errors. | 
|
*/  | 
|
public void encode(DerOutputStream out) throws IOException {  | 
|
DerOutputStream tagged = new DerOutputStream();  | 
|
DerOutputStream tmp = new DerOutputStream();  | 
|
if (assigner != null) {  | 
|
DerOutputStream tmp2 = new DerOutputStream();  | 
|
            // XXX - shd check is chars fit into PrintableString | 
|
tmp2.putPrintableString(assigner);  | 
|
tagged.write(DerValue.createTag(DerValue.TAG_CONTEXT,  | 
|
false, TAG_ASSIGNER), tmp2);  | 
|
}  | 
|
if (party == null)  | 
|
throw new IOException("Cannot have null partyName");  | 
|
        // XXX - shd check is chars fit into PrintableString | 
|
tmp.putPrintableString(party);  | 
|
tagged.write(DerValue.createTag(DerValue.TAG_CONTEXT,  | 
|
false, TAG_PARTYNAME), tmp);  | 
|
out.write(DerValue.tag_Sequence, tagged);  | 
|
}  | 
|
    /** | 
|
     * Return the assignerName | 
|
     * | 
|
     * @returns String assignerName | 
|
*/  | 
|
public String getAssignerName() {  | 
|
return assigner;  | 
|
}  | 
|
    /** | 
|
     * Return the partyName | 
|
     * | 
|
     * @returns String partyName | 
|
*/  | 
|
public String getPartyName() {  | 
|
return party;  | 
|
}  | 
|
    /** | 
|
     * Compare this EDIPartyName with another.  Does a byte-string | 
|
     * comparison without regard to type of the partyName and | 
|
     * the assignerName. | 
|
     * | 
|
     * @returns true if the two names match | 
|
*/  | 
|
public boolean equals(Object other) {  | 
|
if (!(other instanceof EDIPartyName))  | 
|
return false;  | 
|
String otherAssigner = ((EDIPartyName)other).assigner;  | 
|
        if (this.assigner == null) { | 
|
if (otherAssigner != null)  | 
|
return false;  | 
|
        } else { | 
|
if (!(this.assigner.equals(otherAssigner)))  | 
|
return false;  | 
|
}  | 
|
String otherParty = ((EDIPartyName)other).party;  | 
|
        if (this.party == null) { | 
|
if (otherParty != null)  | 
|
return false;  | 
|
        } else { | 
|
if (!(this.party.equals(otherParty)))  | 
|
return false;  | 
|
}  | 
|
return true;  | 
|
}  | 
|
    /** | 
|
     * Returns the hash code value for this EDIPartyName. | 
|
     * | 
|
     * @return a hash code value. | 
|
*/  | 
|
    public int hashCode() { | 
|
if (myhash == -1) {  | 
|
myhash = 37 + (party == null ? 1 : party.hashCode());  | 
|
if (assigner != null) {  | 
|
myhash = 37 * myhash + assigner.hashCode();  | 
|
}  | 
|
}  | 
|
return myhash;  | 
|
}  | 
|
    /** | 
|
     * Return the printable string. | 
|
*/  | 
|
public String toString() {  | 
|
        return ("EDIPartyName: " + | 
|
((assigner == null) ? "" :  | 
|
(" nameAssigner = " + assigner + ","))  | 
|
+ " partyName = " + party);  | 
|
}  | 
|
    /** | 
|
     * Return constraint type:<ul> | 
|
     *   <li>NAME_DIFF_TYPE = -1: input name is different type from name (i.e. does not constrain) | 
|
     *   <li>NAME_MATCH = 0: input name matches name | 
|
     *   <li>NAME_NARROWS = 1: input name narrows name | 
|
     *   <li>NAME_WIDENS = 2: input name widens name | 
|
     *   <li>NAME_SAME_TYPE = 3: input name does not match or narrow name, but is same type | 
|
     * </ul>.  These results are used in checking NameConstraints during | 
|
     * certification path verification. | 
|
     * | 
|
     * @param inputName to be checked for being constrained | 
|
     * @returns constraint type above | 
|
     * @throws UnsupportedOperationException if name is same type, but comparison operations are | 
|
     *          not supported for this name type. | 
|
*/  | 
|
public int constrains(GeneralNameInterface inputName) throws UnsupportedOperationException {  | 
|
int constraintType;  | 
|
if (inputName == null)  | 
|
constraintType = NAME_DIFF_TYPE;  | 
|
else if (inputName.getType() != NAME_EDI)  | 
|
constraintType = NAME_DIFF_TYPE;  | 
|
        else { | 
|
throw new UnsupportedOperationException("Narrowing, widening, and matching of names not supported for EDIPartyName");  | 
|
}  | 
|
return constraintType;  | 
|
}  | 
|
    /** | 
|
     * Return subtree depth of this name for purposes of determining | 
|
     * NameConstraints minimum and maximum bounds and for calculating | 
|
     * path lengths in name subtrees. | 
|
     * | 
|
     * @returns distance of name from root | 
|
     * @throws UnsupportedOperationException if not supported for this name type | 
|
*/  | 
|
public int subtreeDepth() throws UnsupportedOperationException {  | 
|
throw new UnsupportedOperationException("subtreeDepth() not supported for EDIPartyName");  | 
|
}  | 
|
}  |