1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @author Vladimir N. Molotkov
208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.x509;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayInputStream;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for thread safety of the PolicyQualifierInfo DER decoder
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * ("DER" stands for "Distinguished Encoding Rules",
328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * see ITU-T Recommendation X.690,
338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * http://asn1.elibel.tm.fr)
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class PolicyQualifierInfoTest extends TestCase {
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Number of test working threads (may be set externally)
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static int workersNumber;
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Number of test iterations performed by each thread
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // (may be set externally)
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static int iterationsNumber;
418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static {
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            workersNumber = Integer.parseInt(
458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    System.getProperty("PolicyQualifierInfoTest.workersNumber",
468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            "10"));
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            iterationsNumber = Integer.parseInt(
488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    System.getProperty("PolicyQualifierInfoTest.iterationsNumber",
498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            "10000"));
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            workersNumber = 10;
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            iterationsNumber = 10000;
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Holder for thread-specific PolicyQualifier DER encodings
578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    private static final byte[][] enc = new byte[workersNumber][];
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private volatile boolean arrayPassed = true;
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private volatile boolean inpstPassed = true;
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // "Valid" reference DER encoding
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // (generated by own encoder during test development)
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final byte[] encoding = {
658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x30, (byte) 0x26, // tag Seq, length
668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x06, (byte) 0x08, // tag OID, length
678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, // oid value
688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x05, (byte) 0x07, (byte) 0x02, (byte) 0x01, // oid value
698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x16, (byte) 0x1a, // tag IA5String, length
708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70,  // IA5String value
718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x77,  // IA5String value
728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x71,  // IA5String value
738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x71, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,  // IA5String value
748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x6d, (byte) 0x2f, (byte) 0x73, (byte) 0x74,  // IA5String value
758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x6d, (byte) 0x74, (byte) 0x2e, (byte) 0x74,  // IA5String value
768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            (byte) 0x78, (byte) 0x74   // IA5String value
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    };
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Test worker for decoding from byte array
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private class TestWorker1 extends Thread {
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private final int myIntValue;
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestWorker1(int num) {
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super("Worker_" + num);
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            myIntValue = num;
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void run() {
918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            for (int i = 0; i < iterationsNumber; i++) {
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // Perform DER decoding:
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Object[] decoded =
958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            (Object[]) org.apache.harmony.security.x509.
968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                                    PolicyQualifierInfo.ASN1.decode(
978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                                    getDerEncoding(myIntValue));
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // check OID value
998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    assertEquals(this.getName() + "(OID)",
1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            myIntValue, ((int[]) decoded[0])[8]);
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // check qualifier
1028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    assertEquals(this.getName() + "(QA)",
1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            (byte) myIntValue, ((byte[]) decoded[1])[2]);
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (Throwable e) {
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    System.err.println(e);
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    arrayPassed = false;
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return;
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Test worker for decoding from InputStream
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private class TestWorker2 extends Thread {
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private final int myIntValue;
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestWorker2(int num) {
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super("Worker_" + num);
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            myIntValue = num;
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void run() {
1248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            for (int i = 0; i < iterationsNumber; i++) {
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // Perform DER decoding:
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Object[] decoded =
1288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            (Object[]) org.apache.harmony.security.x509.
1298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                                    PolicyQualifierInfo.ASN1.decode(
1308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                                    getDerInputStream(myIntValue));
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // check OID value
1328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    assertEquals(this.getName() + "(OID)",
1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            myIntValue, ((int[]) decoded[0])[8]);
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // check qualifier
1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    assertEquals(this.getName() + "(QA)",
1368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            (byte) myIntValue, ((byte[]) decoded[1])[2]);
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (Throwable e) {
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    System.err.println(e);
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    inpstPassed = false;
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return;
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Test 1
1488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws InterruptedException
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testMtByteArray() throws InterruptedException {
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread[] workers = new Thread[workersNumber];
1538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < workersNumber; i++) {
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            workers[i] = new TestWorker1(i);
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < workersNumber; i++) {
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            workers[i].start();
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < workersNumber; i++) {
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            workers[i].join();
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(arrayPassed);
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Test 2
1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @throws InterruptedException
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public final void testMtInputStream() throws InterruptedException {
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread[] workers = new Thread[workersNumber];
1728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < workersNumber; i++) {
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            workers[i] = new TestWorker2(i);
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < workersNumber; i++) {
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            workers[i].start();
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < workersNumber; i++) {
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            workers[i].join();
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(inpstPassed);
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Generates unique (based on parameter) DER encoding
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // @param intVal value to be incorporated into the resulting encoding
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // @return PolicyQualifier DER encoding
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final byte[] getDerEncoding(int intVal) {
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        setEncArray(intVal);
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return enc[intVal];
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Generates unique (based on parameter) DER encoding
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // @param intVal value to be incorporated into the resulting encoding
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // @return PolicyQualifier DER encoding
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final InputStream getDerInputStream(int intVal) {
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        setEncArray(intVal);
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new ByteArrayInputStream(enc[intVal]);
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Init thread specific data
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // @param intVal worker thread number
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static void setEncArray(int intVal) {
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (enc[intVal] == null) {
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // make encoding thread-specific
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] a = encoding.clone();
2128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            a[11] = (byte) intVal;
2138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            a[14] = (byte) intVal;
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            enc[intVal] = a;
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
218