src/java.base/share/classes/sun/security/x509/X400Address.java
changeset 47216 71c04702a3d5
parent 30374 2abaf49910ea
child 53082 4c539cb11633
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.base/share/classes/sun/security/x509/X400Address.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,423 @@
+/*
+ * 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.
+ * <p>
+ * The ASN.1 syntax for this is:
+ * <pre>
+ * 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.
+ * </pre>
+ *
+ * @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 value 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: <DER-encoded value>");
+    }
+
+    /**
+     * Return type of constraint inputName places on this name:<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 (is lower in the naming subtree)
+     *   <li>NAME_WIDENS = 2: input name widens name (is higher in the naming subtree)
+     *   <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
+     * @return 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.
+     *
+     * @return 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");
+    }
+
+}