151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 230350d69719039aafc65e9c783f56b46d9d8725bSergio Giro * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.security.x509; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.lang.reflect.Constructor; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Arrays; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.util.*; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class represents the OtherName as required by the GeneralNames 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ASN.1 object. It supplies the generic framework to allow specific 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Other Name types, and also provides minimal support for unrecognized 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Other Name types. 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The ASN.1 definition for OtherName is: 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * OtherName ::= SEQUENCE { 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * type-id OBJECT IDENTIFIER, 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * value [0] EXPLICIT ANY DEFINED BY type-id 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * } 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Hemma Prafullchandra 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class OtherName implements GeneralNameInterface { 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private String name; 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private ObjectIdentifier oid; 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private byte[] nameValue = null; 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private GeneralNameInterface gni = null; 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final byte TAG_VALUE = 0; 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int myhash = -1; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create the OtherName object from a passed ObjectIdentfier and 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * byte array name value 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param oid ObjectIdentifier of this OtherName object 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value the DER-encoded value of the OtherName 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException on error 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public OtherName(ObjectIdentifier oid, byte[] value) throws IOException { 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (oid == null || value == null) { 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException("parameters may not be null"); 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.oid = oid; 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.nameValue = value; 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski gni = getGNI(oid, value); 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (gni != null) { 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski name = gni.toString(); 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski name = "Unrecognized ObjectIdentifier: " + oid.toString(); 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create the OtherName object from the passed encoded Der value. 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param derValue the encoded DER OtherName. 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on error. 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public OtherName(DerValue derValue) throws IOException { 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerInputStream in = derValue.toDerInputStream(); 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski oid = in.getOID(); 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerValue val = in.getDerValue(); 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nameValue = val.toByteArray(); 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski gni = getGNI(oid, nameValue); 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (gni != null) { 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski name = gni.toString(); 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski name = "Unrecognized ObjectIdentifier: " + oid.toString(); 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get ObjectIdentifier 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ObjectIdentifier getOID() { 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski //XXXX May want to consider cloning this 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return oid; 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get name value 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public byte[] getNameValue() { 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return nameValue.clone(); 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get GeneralNameInterface 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private GeneralNameInterface getGNI(ObjectIdentifier oid, byte[] nameValue) 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException { 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 12330350d69719039aafc65e9c783f56b46d9d8725bSergio Giro Class<?> extClass = OIDMap.getClass(oid); 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (extClass == null) { // Unsupported OtherName 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12730350d69719039aafc65e9c783f56b46d9d8725bSergio Giro Class<?>[] params = { Object.class }; 12830350d69719039aafc65e9c783f56b46d9d8725bSergio Giro Constructor<?> cons = extClass.getConstructor(params); 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object[] passed = new Object[] { nameValue }; 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski GeneralNameInterface gni = 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (GeneralNameInterface)cons.newInstance(passed); 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return gni; 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception e) { 13530350d69719039aafc65e9c783f56b46d9d8725bSergio Giro throw new IOException("Instantiation error: " + e, e); 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the type of the GeneralName. 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getType() { 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return GeneralNameInterface.NAME_ANY; 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Encode the Other name into the DerOutputStream. 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the DER stream to encode the Other-Name to. 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on encoding errors. 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void encode(DerOutputStream out) throws IOException { 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (gni != null) { 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This OtherName has a supported class 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski gni.encode(out); 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This OtherName has no supporting class 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerOutputStream tmp = new DerOutputStream(); 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski tmp.putOID(oid); 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski tmp.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, TAG_VALUE), nameValue); 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.write(DerValue.tag_Sequence, tmp); 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares this name with another, for equality. 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true iff the names are identical. 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object other) { 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (this == other) { 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(other instanceof OtherName)) { 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski OtherName otherOther = (OtherName)other; 17930350d69719039aafc65e9c783f56b46d9d8725bSergio Giro if (!(otherOther.oid.equals((Object)oid))) { 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski GeneralNameInterface otherGNI = null; 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski otherGNI = getGNI(otherOther.oid, otherOther.nameValue); 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException ioe) { 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean result; 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (otherGNI != null) { 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result = (otherGNI.constrains(this) == NAME_MATCH); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (UnsupportedOperationException ioe) { 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result = false; 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result = Arrays.equals(nameValue, otherOther.nameValue); 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return result; 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the hash code for this OtherName. 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a hash code value. 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int hashCode() { 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (myhash == -1) { 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski myhash = 37 + oid.hashCode(); 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < nameValue.length; i++) { 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski myhash = 37 * myhash + nameValue[i]; 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return myhash; 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Convert the name into user readable string. 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return "Other-Name: " + name; 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return type of constraint inputName places on this name:<ul> 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>NAME_DIFF_TYPE = -1: input name is different type from name 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (i.e. does not constrain). 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>NAME_MATCH = 0: input name matches name. 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>NAME_NARROWS = 1: input name narrows name (is lower in the 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * naming subtree) 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>NAME_WIDENS = 2: input name widens name (is higher in the 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * naming subtree) 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>NAME_SAME_TYPE = 3: input name does not match or narrow name, 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * but is same type. 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ul>. These results are used in checking NameConstraints during 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * certification path verification. 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param inputName to be checked for being constrained 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @returns constraint type above 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedOperationException if name is same type, but 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * comparison operations are not supported for this name type. 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int constrains(GeneralNameInterface inputName) { 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int constraintType; 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (inputName == null) { 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski constraintType = NAME_DIFF_TYPE; 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (inputName.getType() != NAME_ANY) { 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski constraintType = NAME_DIFF_TYPE; 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnsupportedOperationException("Narrowing, widening, " 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "and matching are not supported for OtherName."); 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return constraintType; 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return subtree depth of this name for purposes of determining 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * NameConstraints minimum and maximum bounds. 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @returns distance of name from root 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedOperationException if not supported for this name type 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int subtreeDepth() { 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnsupportedOperationException 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ("subtreeDepth() not supported for generic OtherName"); 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 270