All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tencent.kona.sun.security.x509.GeneralName Maven / Gradle / Ivy

Go to download

A Java security provider for supporting ShangMi algorithms in public key infrastructure

There is a newer version: 1.0.15
Show newest version
/*
 * Copyright (c) 1997, 2023, 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 com.tencent.kona.sun.security.x509;

import java.io.IOException;

import com.tencent.kona.sun.security.util.DerEncoder;
import com.tencent.kona.sun.security.util.DerOutputStream;
import com.tencent.kona.sun.security.util.DerValue;

/**
 * This class implements the ASN.1 GeneralName object class.
 * 

* The ASN.1 syntax for this is: *

 * GeneralName ::= CHOICE {
 *    otherName                       [0]     OtherName,
 *    rfc822Name                      [1]     IA5String,
 *    dNSName                         [2]     IA5String,
 *    x400Address                     [3]     ORAddress,
 *    directoryName                   [4]     Name,
 *    ediPartyName                    [5]     EDIPartyName,
 *    uniformResourceIdentifier       [6]     IA5String,
 *    iPAddress                       [7]     OCTET STRING,
 *    registeredID                    [8]     OBJECT IDENTIFIER
 * }
 * 
* @author Amit Kapoor * @author Hemma Prafullchandra */ public class GeneralName implements DerEncoder { // Private data members private final GeneralNameInterface name; /** * Default constructor for the class. * * @param name the selected CHOICE from the list. * @throws NullPointerException if name is null */ public GeneralName(GeneralNameInterface name) { if (name == null) { throw new NullPointerException("GeneralName must not be null"); } this.name = name; } /** * Create the object from its DER encoded value. * * @param encName the DER encoded GeneralName. */ public GeneralName(DerValue encName) throws IOException { this(encName, false); } /** * Create the object from its DER encoded value. * * @param encName the DER encoded GeneralName. * @param nameConstraint true if general name is a name constraint */ public GeneralName(DerValue encName, boolean nameConstraint) throws IOException { short tag = (byte)(encName.tag & 0x1f); // All names except for NAME_DIRECTORY should be encoded with the // IMPLICIT tag. switch (tag) { case GeneralNameInterface.NAME_ANY: if (encName.isContextSpecific() && encName.isConstructed()) { encName.resetTag(DerValue.tag_Sequence); name = new OtherName(encName); } else { throw new IOException("Invalid encoding of Other-Name"); } break; case GeneralNameInterface.NAME_RFC822: if (encName.isContextSpecific() && !encName.isConstructed()) { encName.resetTag(DerValue.tag_IA5String); name = new RFC822Name(encName); } else { throw new IOException("Invalid encoding of RFC822 name"); } break; case GeneralNameInterface.NAME_DNS: if (encName.isContextSpecific() && !encName.isConstructed()) { encName.resetTag(DerValue.tag_IA5String); name = new DNSName(encName); } else { throw new IOException("Invalid encoding of DNSName"); } break; case GeneralNameInterface.NAME_X400: if (encName.isContextSpecific() && encName.isConstructed()) { encName.resetTag(DerValue.tag_IA5String); name = new X400Address(encName); } else { throw new IOException("Invalid encoding of X400Address name"); } break; case GeneralNameInterface.NAME_URI: if (encName.isContextSpecific() && !encName.isConstructed()) { encName.resetTag(DerValue.tag_IA5String); name = (nameConstraint ? URIName.nameConstraint(encName) : new URIName(encName)); } else { throw new IOException("Invalid encoding of URI"); } break; case GeneralNameInterface.NAME_IP: if (encName.isContextSpecific() && !encName.isConstructed()) { encName.resetTag(DerValue.tag_OctetString); name = new IPAddressName(encName); } else { throw new IOException("Invalid encoding of IP address"); } break; case GeneralNameInterface.NAME_OID: if (encName.isContextSpecific() && !encName.isConstructed()) { encName.resetTag(DerValue.tag_ObjectId); name = new OIDName(encName); } else { throw new IOException("Invalid encoding of OID name"); } break; case GeneralNameInterface.NAME_DIRECTORY: if (encName.isContextSpecific() && encName.isConstructed()) { name = new X500Name(encName.getData()); } else { throw new IOException("Invalid encoding of Directory name"); } break; case GeneralNameInterface.NAME_EDI: if (encName.isContextSpecific() && encName.isConstructed()) { encName.resetTag(DerValue.tag_Sequence); name = new EDIPartyName(encName); } else { throw new IOException("Invalid encoding of EDI name"); } break; default: throw new IOException("Unrecognized GeneralName tag, (" + tag +")"); } } /** * Return the type of the general name. */ public int getType() { return name.getType(); } /** * Return the GeneralNameInterface name. */ public GeneralNameInterface getName() { //XXXX May want to consider cloning this return name; } /** * Return the name as user readable string */ public String toString() { return name.toString(); } /** * Compare this GeneralName with another * * @param obj GeneralName to compare to this * @return true if match */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof GeneralName)) return false; try { return name.constrains(((GeneralName) obj).name) == GeneralNameInterface.NAME_MATCH; } catch (UnsupportedOperationException ioe) { return false; } } /** * {@return the hash code for this GeneralName} */ @Override public int hashCode() { return name.hashCode(); } /** * Encode the name to the specified DerOutputStream. * * @param out the DerOutputStream to encode the GeneralName to. */ @Override public void encode(DerOutputStream out) { DerOutputStream tmp = new DerOutputStream(); name.encode(tmp); int nameType = name.getType(); if (nameType == GeneralNameInterface.NAME_ANY || nameType == GeneralNameInterface.NAME_X400 || nameType == GeneralNameInterface.NAME_EDI) { // implicit, constructed form out.writeImplicit(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)nameType), tmp); } else if (nameType == GeneralNameInterface.NAME_DIRECTORY) { // explicit, constructed form since underlying tag is CHOICE // (see X.680 section 30.6, part c) out.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)nameType), tmp); } else { // implicit, primitive form out.writeImplicit(DerValue.createTag(DerValue.TAG_CONTEXT, false, (byte)nameType), tmp); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy