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