105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar/* 205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * Copyright (C) 2015 The Android Open Source Project 305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * 405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * Licensed under the Apache License, Version 2.0 (the "License"); 505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * you may not use this file except in compliance with the License. 605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * You may obtain a copy of the License at 705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * 805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * http://www.apache.org/licenses/LICENSE-2.0 905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * 1005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * Unless required by applicable law or agreed to in writing, software 1105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * distributed under the License is distributed on an "AS IS" BASIS, 1205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * See the License for the specific language governing permissions and 1405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar * limitations under the License. 1505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar */ 1605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 1705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietarpackage org.conscrypt.ct; 1805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 1905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietarimport java.io.ByteArrayOutputStream; 2005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietarimport java.util.Arrays; 21d0687b8c0d5aa6e88853fff774afd24ec331964cKenny Rootimport junit.framework.TestCase; 2205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 2305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietarpublic class SerializationTest extends TestCase { 2405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar public void test_decode_SignedCertificateTimestamp() throws Exception { 2505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar byte[] in = new byte[] { 2605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, // version 2705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // log id 2805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x01, 0x02, 0x03, 0x04, // timestamp 3005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x05, 0x06, 0x07, 0x08, 3105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x00, // extensions length 3205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x04, 0x03, // hash & signature algorithm 3305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x04, // signature length 3405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x12, 0x34, 0x56, 0x78 // signature 3505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }; 3605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 3705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar SignedCertificateTimestamp sct 3805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar = SignedCertificateTimestamp.decode(in, SignedCertificateTimestamp.Origin.EMBEDDED); 3905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 4005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(SignedCertificateTimestamp.Version.V1, sct.getVersion()); 4105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(0x0102030405060708L, sct.getTimestamp()); 4205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(0, sct.getExtensions().length); 4305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(DigitallySigned.HashAlgorithm.SHA256, 4405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar sct.getSignature().getHashAlgorithm()); 4505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(DigitallySigned.SignatureAlgorithm.ECDSA, 4605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar sct.getSignature().getSignatureAlgorithm()); 4705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertTrue(Arrays.equals(new byte[] { 0x12, 0x34, 0x56, 0x78}, 4805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar sct.getSignature().getSignature())); 4905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(SignedCertificateTimestamp.Origin.EMBEDDED, sct.getOrigin()); 5005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } 5105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 5205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar public void test_decode_invalid_SignedCertificateTimestamp() throws Exception { 5305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar byte[] sct = new byte[] { 5405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, // version 5505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // log id 5605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 5705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x01, 0x02, 0x03, 0x04, // timestamp 5805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x05, 0x06, 0x07, 0x08, 5905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x00, // extensions length 6005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x04, 0x03, // hash & signature algorithm 6105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x04, // signature length 6205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x12, 0x34, 0x56, 0x78 // signature 6305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }; 6405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 6505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar // Make sure the original decodes fine 6605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar SignedCertificateTimestamp.decode(sct, SignedCertificateTimestamp.Origin.EMBEDDED); 6705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 6805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar // Perform various modification to it, and make sure it throws an exception on decoding 6905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar try { 7005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar byte[] in = sct.clone(); 7105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar in[0] = 1; // Modify version field 7205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar SignedCertificateTimestamp.decode(in, SignedCertificateTimestamp.Origin.EMBEDDED); 7305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar fail("SerializationException not thrown on unsupported version"); 7405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } catch (SerializationException e) {} 7505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 7605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar try { 7705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar byte[] in = sct.clone(); 7805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar in[41] = 1; // Modify extensions lemgth 7905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar SignedCertificateTimestamp.decode(in, SignedCertificateTimestamp.Origin.EMBEDDED); 8005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar fail("SerializationException not thrown on invalid extensions length"); 8105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } catch (SerializationException e) {} 8205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } 8305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 8405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar public void test_decode_DigitallySigned() throws Exception { 8505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar byte[] in = new byte[] { 8605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x04, 0x03, // hash & signature algorithm 8705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x04, // signature length 8805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x12, 0x34, 0x56, 0x78 // signature 8905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }; 9005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 9105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar DigitallySigned dst = DigitallySigned.decode(in); 9205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(DigitallySigned.HashAlgorithm.SHA256, dst.getHashAlgorithm()); 9305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(DigitallySigned.SignatureAlgorithm.ECDSA, dst.getSignatureAlgorithm()); 9405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEqualByteArrays(new byte[] { 0x12, 0x34, 0x56, 0x78}, dst.getSignature()); 9505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } 9605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 9705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar public void test_decode_invalid_DigitallySigned() throws Exception { 9805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar try { 9905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar DigitallySigned.decode(new byte[] { 10005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x07, 0x03, // hash & signature algorithm 10105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x04, // signature length 10205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x12, 0x34, 0x56, 0x78 // signature 10305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }); 10405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar fail("SerializationException not thrown on invalid hash type"); 10505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } catch (SerializationException e) {} 10605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 10705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar try { 10805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar DigitallySigned.decode(new byte[] { 10905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x04, 0x04, // hash & signature algorithm 11005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x04, // signature length 11105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x12, 0x34, 0x56, 0x78 // signature 11205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }); 11305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar fail("SerializationException not thrown on invalid signature type"); 11405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } catch (SerializationException e) {} 11505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 11605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar try { 11705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar DigitallySigned.decode(new byte[] { 11805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x07, 0x03, // hash & signature algorithm 11905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x64, 0x35, // signature length 12005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x12, 0x34, 0x56, 0x78 // signature 12105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }); 12205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar fail("SerializationException not thrown on invalid signature length"); 12305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } catch (SerializationException e) {} 12405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 12505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar try { 12605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar DigitallySigned.decode(new byte[] { 12705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x07, 0x03, // hash & signature algorithm 12805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }); 12905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar fail("SerializationException not thrown on missing signature"); 13005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } catch (SerializationException e) {} 13105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } 13205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 13305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar public void test_encode_CertificateEntry_X509Certificate() throws Exception { 13405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar // Use a dummy certificate. It doesn't matter, CertificateEntry doesn't care about the contents. 13505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar CertificateEntry entry = CertificateEntry.createForX509Certificate(new byte[] { 0x12, 0x34, 0x56, 0x78 }); 13605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar ByteArrayOutputStream output = new ByteArrayOutputStream(); 13705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar entry.encode(output); 13805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 13905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEqualByteArrays(new byte[] { 14005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x00, // entry_type 14105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x00, 0x04, // x509_entry length 14205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x12, 0x34, 0x56, 0x78 // x509_entry 14305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }, output.toByteArray()); 14405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } 14505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 14605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar public void test_encode_CertificateEntry_PreCertificate() throws Exception { 14705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar // Use a dummy certificate and issuer key hash. It doesn't matter, 14805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar // CertificateEntry doesn't care about the contents. 14905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar CertificateEntry entry = CertificateEntry.createForPrecertificate(new byte[] { 0x12, 0x34, 0x56, 0x78 }, 15005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar new byte[32]); 15105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 15205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar ByteArrayOutputStream output = new ByteArrayOutputStream(); 15305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar entry.encode(output); 15405f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 15505f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEqualByteArrays(new byte[] { 15605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x01, // entry_type 15705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // issuer key hash 15805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 15905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x00, 0x00, 0x04, // precert_entry length 16005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 0x12, 0x34, 0x56, 0x78 // precert_entry 16105f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar }, output.toByteArray()); 16205f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } 16305f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 164b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar public void test_readDEROctetString() throws Exception { 165b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar byte[] in, expected; 166b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 167b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar in = new byte[] { 168b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x04, // TAG 169b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x06, // length 170b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x01, 0x02, 0x03, 0x04, 0x05, 0x05 // data 171b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar }; 172b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar expected = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x05 }; 173b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar assertEqualByteArrays(expected, Serialization.readDEROctetString(in)); 174b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 1759f5850838f16ec1cc53ec1f2ece559c2e6396d3ePaul Lietar in = new byte[203]; 176b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar in[0] = 0x04; // TAG 177b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar in[1] = (byte)0x81; // long length flag 178b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar in[2] = (byte)200; // length 179b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar in[3] = 0x45; // data, the rest is just zeros 180b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 181b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar expected = new byte[200]; 182b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar expected[0] = 0x45; 183b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar assertEqualByteArrays(expected, Serialization.readDEROctetString(in)); 184b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 185b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar try { 186b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar in = new byte[] { 187b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x12, // wrong tag 188b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x06, // length 189b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x01, 0x02, 0x03, 0x04, 0x05, 0x05 // data 190b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar }; 191b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar Serialization.readDEROctetString(in); 192b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar fail("SerializationException not thrown on invalid tag."); 193b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar } catch (SerializationException e) {} 194b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 195b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar try { 196b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar in = new byte[] { 197b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x04, // wrong tag 198b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x06, // length 199b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 0x01, 0x02 // data 200b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar }; 201b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar Serialization.readDEROctetString(in); 202b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar fail("SerializationException not thrown on invalid length."); 203b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar } catch (SerializationException e) {} 204b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar } 205b02e9dea1e7f4c6ef10697bb1cdaf8363626d1e4Paul Lietar 20605f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar public static void assertEqualByteArrays(byte[] expected, byte[] actual) { 20705f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar assertEquals(Arrays.toString(expected), Arrays.toString(actual)); 20805f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar } 20905f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar} 21005f3b16adf0117fd47e23e03d18be3507b3549e7Paul Lietar 211