test/jdk/com/sun/jndi/ldap/lib/LdapMessage.java
author xyin
Wed, 01 May 2019 00:06:22 -0700
branchJDK-8210696-branch
changeset 57345 ff884a2f247b
permissions -rw-r--r--
JDK-8210696-branch: push initial fix change
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57345
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     1
/*
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     4
 *
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     7
 * published by the Free Software Foundation.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     8
 *
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    13
 * accompanied this code).
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    14
 *
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    18
 *
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    21
 * questions.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    22
 */
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    23
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    24
import java.math.BigInteger;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    25
import java.util.Arrays;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    26
import java.util.Optional;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    27
import java.util.stream.Stream;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    28
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    29
/**
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    30
 * Class to present one Ldap message.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    31
 */
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    32
public class LdapMessage {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    33
    private final byte[] messages;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    34
    private int messageID;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    35
    private Operation operation;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    36
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    37
    public enum Operation {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    38
        BIND_REQUEST(0x60, "BindRequest"), // [APPLICATION 0]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    39
        BIND_RESPONSE(0x61, "BindResponse"), // [APPLICATION 1]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    40
        UNBIND_REQUEST(0x42, "UnbindRequest"), // [APPLICATION 2]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    41
        SEARCH_REQUEST(0x63, "SearchRequest"), // [APPLICATION 3]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    42
        SEARCH_RESULT_ENTRY(0x64, "SearchResultEntry"), // [APPLICATION 4]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    43
        SEARCH_RESULT_DONE(0x65, "SearchResultDone"), // [APPLICATION 5]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    44
        MODIFY_REQUEST(0x66, "ModifyRequest"), // [APPLICATION 6]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    45
        MODIFY_RESPONSE(0x67, "ModifyResponse"), // [APPLICATION 7]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    46
        ADD_REQUEST(0x68, "AddRequest"), // [APPLICATION 8]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    47
        ADD_RESPONSE(0x69, "AddResponse"), // [APPLICATION 9]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    48
        DELETE_REQUEST(0x4A, "DeleteRequest"), // [APPLICATION 10]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    49
        DELETE_RESPONSE(0x6B, "DeleteResponse"), // [APPLICATION 11]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    50
        MODIFY_DN_REQUEST(0x6C, "ModifyDNRequest"), // [APPLICATION 12]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    51
        MODIFY_DN_RESPONSE(0x6D, "ModifyDNResponse"), // [APPLICATION 13]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    52
        COMPARE_REQUEST(0x6E, "CompareRequest"), // [APPLICATION 14]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    53
        COMPARE_RESPONSE(0x6F, "CompareResponse"), // [APPLICATION 15]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    54
        ABANDON_REQUEST(0x50, "AbandonRequest"), // [APPLICATION 16]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    55
        SEARCH_RESULT_REFERENCE(0x73,
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    56
                "SearchResultReference"), // [APPLICATION 19]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    57
        EXTENDED_REQUEST(0x77, "ExtendedRequest"), // [APPLICATION 23]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    58
        EXTENDED_RESPONSE(0x78, "ExtendedResponse"), // [APPLICATION 24]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    59
        INTERMEDIATE_RESPONSE(0x79, "IntermediateResponse"); // [APPLICATION 25]
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    60
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    61
        private final int id;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    62
        private final String name;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    63
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    64
        Operation(int id, String name) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    65
            this.id = id;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    66
            this.name = name;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    67
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    68
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    69
        public int getId() {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    70
            return id;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    71
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    72
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    73
        @Override
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    74
        public String toString() {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    75
            return name;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    76
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    77
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    78
        public static Operation fromId(int id) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    79
            Optional<Operation> optional = Stream.of(Operation.values())
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    80
                    .filter(o -> o.id == id).findFirst();
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    81
            if (optional.isPresent()) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    82
                return optional.get();
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    83
            } else {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    84
                throw new RuntimeException(
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    85
                        "Unknown id " + id + " for enum Operation.");
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    86
            }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    87
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    88
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    89
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    90
    public LdapMessage(byte[] messages) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    91
        this.messages = messages;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    92
        parse();
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    93
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    94
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    95
    public LdapMessage(String hexString) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    96
        this(parseHexBinary(hexString));
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    97
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    98
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
    99
    // Extracts the message ID and operation ID from an LDAP protocol encoding
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   100
    private void parse() {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   101
        if (messages == null || messages.length < 2) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   102
            throw new RuntimeException(
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   103
                    "Invalid ldap messages: " + Arrays.toString(messages));
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   104
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   105
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   106
        if (messages[0] != 0x30) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   107
            throw new RuntimeException("Bad LDAP encoding in messages, "
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   108
                    + "expected ASN.1 SEQUENCE tag (0x30), encountered "
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   109
                    + messages[0]);
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   110
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   111
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   112
        int index = 2;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   113
        if ((messages[1] & 0x80) == 0x80) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   114
            index += (messages[1] & 0x0F);
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   115
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   116
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   117
        if (messages[index] != 0x02) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   118
            throw new RuntimeException("Bad LDAP encoding in messages, "
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   119
                    + "expected ASN.1 INTEGER tag (0x02), encountered "
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   120
                    + messages[index]);
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   121
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   122
        int length = messages[index + 1];
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   123
        index += 2;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   124
        messageID = new BigInteger(1,
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   125
                Arrays.copyOfRange(messages, index, index + length)).intValue();
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   126
        index += length;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   127
        int operationID = messages[index];
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   128
        operation = Operation.fromId(operationID);
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   129
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   130
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   131
    /**
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   132
     * Return original ldap message in byte array.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   133
     *
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   134
     * @return original ldap message
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   135
     */
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   136
    public byte[] getMessages() {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   137
        return Arrays.copyOf(messages, messages.length);
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   138
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   139
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   140
    /**
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   141
     * Return ldap message id.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   142
     *
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   143
     * @return ldap message id.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   144
     */
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   145
    public int getMessageID() {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   146
        return messageID;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   147
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   148
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   149
    /**
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   150
     * Return ldap message's operation.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   151
     *
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   152
     * @return ldap message's operation.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   153
     */
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   154
    public Operation getOperation() {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   155
        return operation;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   156
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   157
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   158
    private static byte[] parseHexBinary(String s) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   159
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   160
        final int len = s.length();
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   161
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   162
        // "111" is not a valid hex encoding.
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   163
        if (len % 2 != 0) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   164
            throw new IllegalArgumentException(
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   165
                    "hexBinary needs to be even-length: " + s);
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   166
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   167
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   168
        byte[] out = new byte[len / 2];
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   169
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   170
        for (int i = 0; i < len; i += 2) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   171
            int h = hexToBin(s.charAt(i));
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   172
            int l = hexToBin(s.charAt(i + 1));
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   173
            if (h == -1 || l == -1) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   174
                throw new IllegalArgumentException(
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   175
                        "contains illegal character for hexBinary: " + s);
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   176
            }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   177
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   178
            out[i / 2] = (byte) (h * 16 + l);
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   179
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   180
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   181
        return out;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   182
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   183
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   184
    private static int hexToBin(char ch) {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   185
        if ('0' <= ch && ch <= '9') {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   186
            return ch - '0';
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   187
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   188
        if ('A' <= ch && ch <= 'F') {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   189
            return ch - 'A' + 10;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   190
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   191
        if ('a' <= ch && ch <= 'f') {
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   192
            return ch - 'a' + 10;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   193
        }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   194
        return -1;
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   195
    }
ff884a2f247b JDK-8210696-branch: push initial fix change
xyin
parents:
diff changeset
   196
}