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