/* * Copyright (c) 2000, 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.DerValue; import sun.security.util.DerOutputStream; /** * This class defines the X400Address of the GeneralName choice. *

* The ASN.1 syntax for this is: *

 * ORAddress ::= SEQUENCE {
 *    built-in-standard-attributes BuiltInStandardAttributes,
 *    built-in-domain-defined-attributes
 *                         BuiltInDomainDefinedAttributes OPTIONAL,
 *    -- see also teletex-domain-defined-attributes
 *    extension-attributes ExtensionAttributes OPTIONAL }
 * --      The OR-address is semantically absent from the OR-name if the
 * --      built-in-standard-attribute sequence is empty and the
 * --      built-in-domain-defined-attributes and extension-attributes are
 * --      both omitted.
 *
 * --      Built-in Standard Attributes
 *
 * BuiltInStandardAttributes ::= SEQUENCE {
 *    country-name CountryName OPTIONAL,
 *    administration-domain-name AdministrationDomainName OPTIONAL,
 *    network-address      [0] NetworkAddress OPTIONAL,
 *    -- see also extended-network-address
 *    terminal-identifier  [1] TerminalIdentifier OPTIONAL,
 *    private-domain-name  [2] PrivateDomainName OPTIONAL,
 *    organization-name    [3] OrganizationName OPTIONAL,
 *    -- see also teletex-organization-name
 *    numeric-user-identifier      [4] NumericUserIdentifier OPTIONAL,
 *    personal-name        [5] PersonalName OPTIONAL,
 *    -- see also teletex-personal-name
 *    organizational-unit-names    [6] OrganizationalUnitNames OPTIONAL
 *    -- see also teletex-organizational-unit-names -- }
 *
 * CountryName ::= [APPLICATION 1] CHOICE {
 *    x121-dcc-code NumericString
 *                 (SIZE (ub-country-name-numeric-length)),
 *    iso-3166-alpha2-code PrintableString
 *                 (SIZE (ub-country-name-alpha-length)) }
 *
 * AdministrationDomainName ::= [APPLICATION 2] CHOICE {
 *    numeric NumericString (SIZE (0..ub-domain-name-length)),
 *    printable PrintableString (SIZE (0..ub-domain-name-length)) }
 *
 * NetworkAddress ::= X121Address  -- see also extended-network-address
 *
 * X121Address ::= NumericString (SIZE (1..ub-x121-address-length))
 *
 * TerminalIdentifier ::= PrintableString (SIZE (1..ub-terminal-id-length))
 *
 * PrivateDomainName ::= CHOICE {
 *    numeric NumericString (SIZE (1..ub-domain-name-length)),
 *    printable PrintableString (SIZE (1..ub-domain-name-length)) }
 *
 * OrganizationName ::= PrintableString
 *                             (SIZE (1..ub-organization-name-length))
 * -- see also teletex-organization-name
 *
 * NumericUserIdentifier ::= NumericString
 *                             (SIZE (1..ub-numeric-user-id-length))
 *
 * PersonalName ::= SET {
 *    surname [0] PrintableString (SIZE (1..ub-surname-length)),
 *    given-name [1] PrintableString
 *                         (SIZE (1..ub-given-name-length)) OPTIONAL,
 *    initials [2] PrintableString (SIZE (1..ub-initials-length)) OPTIONAL,
 *    generation-qualifier [3] PrintableString
 *                 (SIZE (1..ub-generation-qualifier-length)) OPTIONAL }
 * -- see also teletex-personal-name
 *
 * OrganizationalUnitNames ::= SEQUENCE SIZE (1..ub-organizational-units)
 *                                         OF OrganizationalUnitName
 * -- see also teletex-organizational-unit-names
 *
 * OrganizationalUnitName ::= PrintableString (SIZE
 *                         (1..ub-organizational-unit-name-length))
 *
 * --      Built-in Domain-defined Attributes
 *
 * BuiltInDomainDefinedAttributes ::= SEQUENCE SIZE
 *                                 (1..ub-domain-defined-attributes) OF
 *                                 BuiltInDomainDefinedAttribute
 *
 * BuiltInDomainDefinedAttribute ::= SEQUENCE {
 *    type PrintableString (SIZE
 *                         (1..ub-domain-defined-attribute-type-length)),
 *    value PrintableString (SIZE
 *                         (1..ub-domain-defined-attribute-value-length))}
 *
 * --      Extension Attributes
 *
 * ExtensionAttributes ::= SET SIZE (1..ub-extension-attributes) OF
 *                         ExtensionAttribute
 *
 * ExtensionAttribute ::=  SEQUENCE {
 *    extension-attribute-type [0] INTEGER (0..ub-extension-attributes),
 *    extension-attribute-value [1]
 *                         ANY DEFINED BY extension-attribute-type }
 *
 * -- Extension types and attribute values
 * --
 *
 * common-name INTEGER ::= 1
 *
 * CommonName ::= PrintableString (SIZE (1..ub-common-name-length))
 *
 * teletex-common-name INTEGER ::= 2
 *
 * TeletexCommonName ::= TeletexString (SIZE (1..ub-common-name-length))
 *
 * teletex-organization-name INTEGER ::= 3
 *
 * TeletexOrganizationName ::=
 *                 TeletexString (SIZE (1..ub-organization-name-length))
 *
 * teletex-personal-name INTEGER ::= 4
 *
 * TeletexPersonalName ::= SET {
 *    surname [0] TeletexString (SIZE (1..ub-surname-length)),
 *    given-name [1] TeletexString
 *                 (SIZE (1..ub-given-name-length)) OPTIONAL,
 *    initials [2] TeletexString (SIZE (1..ub-initials-length)) OPTIONAL,
 *    generation-qualifier [3] TeletexString (SIZE
 *                 (1..ub-generation-qualifier-length)) OPTIONAL }
 *
 * teletex-organizational-unit-names INTEGER ::= 5
 *
 * TeletexOrganizationalUnitNames ::= SEQUENCE SIZE
 *         (1..ub-organizational-units) OF TeletexOrganizationalUnitName
 *
 * TeletexOrganizationalUnitName ::= TeletexString
 *                         (SIZE (1..ub-organizational-unit-name-length))
 *
 * pds-name INTEGER ::= 7
 *
 * PDSName ::= PrintableString (SIZE (1..ub-pds-name-length))
 *
 * physical-delivery-country-name INTEGER ::= 8
 *
 * PhysicalDeliveryCountryName ::= CHOICE {
 *    x121-dcc-code NumericString (SIZE (ub-country-name-numeric-length)),
 *    iso-3166-alpha2-code PrintableString
 *                         (SIZE (ub-country-name-alpha-length)) }
 *
 * postal-code INTEGER ::= 9
 *
 * PostalCode ::= CHOICE {
 *    numeric-code NumericString (SIZE (1..ub-postal-code-length)),
 *    printable-code PrintableString (SIZE (1..ub-postal-code-length)) }
 *
 * physical-delivery-office-name INTEGER ::= 10
 *
 * PhysicalDeliveryOfficeName ::= PDSParameter
 *
 * physical-delivery-office-number INTEGER ::= 11
 *
 * PhysicalDeliveryOfficeNumber ::= PDSParameter
 *
 * extension-OR-address-components INTEGER ::= 12
 *
 * ExtensionORAddressComponents ::= PDSParameter
 *
 * physical-delivery-personal-name INTEGER ::= 13
 *
 * PhysicalDeliveryPersonalName ::= PDSParameter
 *
 * physical-delivery-organization-name INTEGER ::= 14
 *
 * PhysicalDeliveryOrganizationName ::= PDSParameter
 *
 * extension-physical-delivery-address-components INTEGER ::= 15
 *
 * ExtensionPhysicalDeliveryAddressComponents ::= PDSParameter
 *
 * unformatted-postal-address INTEGER ::= 16
 *
 * UnformattedPostalAddress ::= SET {
 *    printable-address SEQUENCE SIZE (1..ub-pds-physical-address-lines) OF
 *            PrintableString (SIZE (1..ub-pds-parameter-length)) OPTIONAL,
 *    teletex-string TeletexString
 *          (SIZE (1..ub-unformatted-address-length)) OPTIONAL }
 *
 * street-address INTEGER ::= 17
 *
 * StreetAddress ::= PDSParameter
 *
 * post-office-box-address INTEGER ::= 18
 *
 * PostOfficeBoxAddress ::= PDSParameter
 *
 * poste-restante-address INTEGER ::= 19
 *
 * PosteRestanteAddress ::= PDSParameter
 *
 * unique-postal-name INTEGER ::= 20
 *
 * UniquePostalName ::= PDSParameter
 *
 * local-postal-attributes INTEGER ::= 21
 *
 * LocalPostalAttributes ::= PDSParameter
 *
 * PDSParameter ::= SET {
 *    printable-string PrintableString
 *                 (SIZE(1..ub-pds-parameter-length)) OPTIONAL,
 *    teletex-string TeletexString
 *                 (SIZE(1..ub-pds-parameter-length)) OPTIONAL }
 *
 * extended-network-address INTEGER ::= 22
 *
 * ExtendedNetworkAddress ::= CHOICE {
 *    e163-4-address SEQUENCE {
 *         number [0] NumericString (SIZE (1..ub-e163-4-number-length)),
 *         sub-address [1] NumericString
 *                 (SIZE (1..ub-e163-4-sub-address-length)) OPTIONAL },
 *    psap-address [0] PresentationAddress }
 *
 * PresentationAddress ::= SEQUENCE {
 *         pSelector       [0] EXPLICIT OCTET STRING OPTIONAL,
 *         sSelector       [1] EXPLICIT OCTET STRING OPTIONAL,
 *         tSelector       [2] EXPLICIT OCTET STRING OPTIONAL,
 *         nAddresses      [3] EXPLICIT SET SIZE (1..MAX) OF OCTET STRING }
 *
 * terminal-type  INTEGER ::= 23
 *
 * TerminalType ::= INTEGER {
 *    telex (3),
 *    teletex (4),
 *    g3-facsimile (5),
 *    g4-facsimile (6),
 *    ia5-terminal (7),
 *    videotex (8) } (0..ub-integer-options)
 *
 * --      Extension Domain-defined Attributes
 *
 * teletex-domain-defined-attributes INTEGER ::= 6
 *
 * TeletexDomainDefinedAttributes ::= SEQUENCE SIZE
 *    (1..ub-domain-defined-attributes) OF TeletexDomainDefinedAttribute
 *
 * TeletexDomainDefinedAttribute ::= SEQUENCE {
 *         type TeletexString
 *                (SIZE (1..ub-domain-defined-attribute-type-length)),
 *         value TeletexString
 *                (SIZE (1..ub-domain-defined-attribute-value-length)) }
 *
 * --  specifications of Upper Bounds shall be regarded as mandatory
 * --  from Annex B of ITU-T X.411 Reference Definition of MTS Parameter
 * --  Upper Bounds
 *
 * --      Upper Bounds
 * ub-name INTEGER ::=     32768
 * ub-common-name  INTEGER ::=     64
 * ub-locality-name        INTEGER ::=     128
 * ub-state-name   INTEGER ::=     128
 * ub-organization-name    INTEGER ::=     64
 * ub-organizational-unit-name     INTEGER ::=     64
 * ub-title        INTEGER ::=     64
 * ub-match        INTEGER ::=     128
 *
 * ub-emailaddress-length INTEGER ::= 128
 *
 * ub-common-name-length INTEGER ::= 64
 * ub-country-name-alpha-length INTEGER ::= 2
 * ub-country-name-numeric-length INTEGER ::= 3
 * ub-domain-defined-attributes INTEGER ::= 4
 * ub-domain-defined-attribute-type-length INTEGER ::= 8
 * ub-domain-defined-attribute-value-length INTEGER ::= 128
 * ub-domain-name-length INTEGER ::= 16
 * ub-extension-attributes INTEGER ::= 256
 * ub-e163-4-number-length INTEGER ::= 15
 * ub-e163-4-sub-address-length INTEGER ::= 40
 * ub-generation-qualifier-length INTEGER ::= 3
 * ub-given-name-length INTEGER ::= 16
 * ub-initials-length INTEGER ::= 5
 * ub-integer-options INTEGER ::= 256
 * ub-numeric-user-id-length INTEGER ::= 32
 * ub-organization-name-length INTEGER ::= 64
 * ub-organizational-unit-name-length INTEGER ::= 32
 * ub-organizational-units INTEGER ::= 4
 * ub-pds-name-length INTEGER ::= 16
 * ub-pds-parameter-length INTEGER ::= 30
 * ub-pds-physical-address-lines INTEGER ::= 6
 * ub-postal-code-length INTEGER ::= 16
 * ub-surname-length INTEGER ::= 40
 * ub-terminal-id-length INTEGER ::= 24
 * ub-unformatted-address-length INTEGER ::= 180
 * ub-x121-address-length INTEGER ::= 16
 *
 * -- Note - upper bounds on string types, such as TeletexString, are
 * -- measured in characters.  Excepting PrintableString or IA5String, a
 * -- significantly greater number of octets will be required to hold
 * -- such a value.  As a minimum, 16 octets, or twice the specified upper
 * -- bound, whichever is the larger, should be allowed for TeletexString.
 * -- For UTF8String or UniversalString at least four times the upper
 * -- bound should be allowed.
 * 
* * @author Anne Anderson * @since 1.4 * @see GeneralName * @see GeneralNames * @see GeneralNameInterface */ public class X400Address implements GeneralNameInterface { // Private data members byte[] nameValue = null; /** * Create the X400Address object from the specified byte array * * @param nameValue value of the name as a byte array */ public X400Address(byte[] value) { nameValue = value; } /** * Create the X400Address object from the passed encoded Der value. * * @param derValue the encoded DER X400Address. * @exception IOException on error. */ public X400Address(DerValue derValue) throws IOException { nameValue = derValue.toByteArray(); } /** * Return the type of the GeneralName. */ public int getType() { return (GeneralNameInterface.NAME_X400); } /** * Encode the X400 name into the DerOutputStream. * * @param out the DER stream to encode the X400Address to. * @exception IOException on encoding errors. */ public void encode(DerOutputStream out) throws IOException { DerValue derValue = new DerValue(nameValue); out.putDerValue(derValue); } /** * Return the printable string. */ public String toString() { return ("X400Address: "); } /** * Return type of constraint inputName places on this name:. 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_X400) constraintType = NAME_DIFF_TYPE; else //Narrowing, widening, and match constraints not defined in rfc2459 for X400Address throw new UnsupportedOperationException("Narrowing, widening, and match are not supported for X400Address."); 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 X400Address"); } }