1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18e82be46881b2ab9d64b35c0ee53fc359b5cfd18aNarayan Kamathpackage org.apache.harmony.tests.javax.net.ssl;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ByteBuffer;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ReadOnlyBufferException;
23051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport java.nio.channels.Pipe;
24051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport java.nio.channels.Pipe.SinkChannel;
25051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport java.nio.channels.Pipe.SourceChannel;
261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.security.KeyManagementException;
271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.security.NoSuchAlgorithmException;
281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.util.Arrays;
29be25811712488827cf836ee6170eca8fb4e14fe4Urs Grobimport java.util.HashSet;
30be25811712488827cf836ee6170eca8fb4e14fe4Urs Grobimport java.util.Set;
31051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport javax.net.ssl.SSLContext;
32051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport javax.net.ssl.SSLEngine;
33051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport javax.net.ssl.SSLEngineResult;
34b330a5e324ef8d399f12db82b4bf472859815fafKenny Rootimport javax.net.ssl.SSLEngineResult.Status;
35051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport javax.net.ssl.SSLException;
36051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumannimport javax.net.ssl.SSLEngineResult.HandshakeStatus;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
38b330a5e324ef8d399f12db82b4bf472859815fafKenny Rootimport libcore.java.security.StandardNames;
395be4c97a83895b7e1385445db6a1717eb8df3e9bKenny Rootimport libcore.javax.net.ssl.TestSSLContext;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests for SSLEngine class
43f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SSLEngineTest extends TestCase {
46b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    private static final int MAX_TLS_RECORD_SIZE = 32768;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann    private HandshakeHandler clientEngine;
49051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann    private HandshakeHandler serverEngine;
50051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
51d37c804ccd11e38ee9221194866a152a4de6c8e9Jesse Wilson    @Override protected void setUp() throws Exception {
52d37c804ccd11e38ee9221194866a152a4de6c8e9Jesse Wilson        super.setUp();
53d37c804ccd11e38ee9221194866a152a4de6c8e9Jesse Wilson    }
54d37c804ccd11e38ee9221194866a152a4de6c8e9Jesse Wilson
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>SSLEngine()</code> constructor Assertion: creates
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SSLEngine object with null host and -1 port
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
59b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_Constructor() throws Exception {
601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine e = getEngine();
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNull(e.getPeerHost());
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(-1, e.getPeerPort());
631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] suites = e.getSupportedCipherSuites();
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        e.setEnabledCipherSuites(suites);
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(e.getEnabledCipherSuites().length, suites.length);
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>SSLEngine(String host, int port)</code> constructor
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
71b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_ConstructorLjava_lang_StringI01() throws Exception {
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 1010;
731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine e = getEngine(null, port);
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNull(e.getPeerHost());
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(e.getPeerPort(), port);
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.beginHandshake();
78b330a5e324ef8d399f12db82b4bf472859815fafKenny Root            fail("should throw IllegalStateException");
79b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalStateException expected) {
801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
81b330a5e324ef8d399f12db82b4bf472859815fafKenny Root
821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        e = getEngine(null, port);
831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        e.setUseClientMode(true);
84b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        e.beginHandshake();
85b330a5e324ef8d399f12db82b4bf472859815fafKenny Root
861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        e = getEngine(null, port);
871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        e.setUseClientMode(false);
88b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        e.beginHandshake();
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>SSLEngine(String host, int port)</code> constructor
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
94b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_ConstructorLjava_lang_StringI02() throws Exception {
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine e = getEngine(host, port);
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(e.getPeerHost(), host);
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(e.getPeerPort(), port);
1001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] suites = e.getSupportedCipherSuites();
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        e.setEnabledCipherSuites(suites);
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(e.getEnabledCipherSuites().length, suites.length);
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        e.setUseClientMode(true);
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(e.getUseClientMode());
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>getPeerHost()</code> method
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
110b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_getPeerHost() throws Exception {
1111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine e = getEngine();
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNull(e.getPeerHost());
1131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        e = getEngine("www.fortify.net", 80);
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect host name", "www.fortify.net", e.getPeerHost());
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
116f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>getPeerPort()</code> method
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
120b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_getPeerPort() throws Exception {
1211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine e = getEngine();
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect default value of peer port",
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                -1 ,e.getPeerPort());
1241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        e = getEngine("www.fortify.net", 80);
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect peer port", 80, e.getPeerPort());
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
128b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_getSupportedProtocols() throws Exception {
1291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
130b330a5e324ef8d399f12db82b4bf472859815fafKenny Root
131b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        String[] res = sse.getSupportedProtocols();
132b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertNotNull(res);
133b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue(res.length > 0);
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
135f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
137229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#setEnabledProtocols(String[] protocols)
138229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getEnabledProtocols()
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_EnabledProtocols() throws Exception {
1411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
1421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] pr = sse.getSupportedProtocols();
143b330a5e324ef8d399f12db82b4bf472859815fafKenny Root
144b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setEnabledProtocols(pr);
145b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        String[] res = sse.getEnabledProtocols();
146b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertNotNull("Null array was returned", res);
147b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals("Incorrect array length", res.length, pr.length);
148b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue("Incorrect array was returned", Arrays.equals(res, pr));
149b330a5e324ef8d399f12db82b4bf472859815fafKenny Root
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sse.setEnabledProtocols(null);
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
153b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
156f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
158229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getSupportedCipherSuites()
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
160b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_getSupportedCipherSuites() throws Exception {
1611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
162b330a5e324ef8d399f12db82b4bf472859815fafKenny Root
163b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        String[] res = sse.getSupportedCipherSuites();
164b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertNotNull(res);
165b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue(res.length > 0);
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#setEnabledCipherSuites(String[] suites)
170229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getEnabledCipherSuites()
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
172b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_EnabledCipherSuites() throws Exception {
1731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
1741cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] st = sse.getSupportedCipherSuites();
175b330a5e324ef8d399f12db82b4bf472859815fafKenny Root
176b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setEnabledCipherSuites(st);
177b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        String[] res = sse.getEnabledCipherSuites();
178b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertNotNull("Null array was returned", res);
179b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals("Incorrect array length", res.length, st.length);
180b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue("Incorrect array was returned", Arrays.equals(res, st));
181b330a5e324ef8d399f12db82b4bf472859815fafKenny Root
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sse.setEnabledCipherSuites(null);
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
185b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
188f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
190229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#setEnableSessionCreation(boolean flag)
191229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getEnableSessionCreation()
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
193b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_EnableSessionCreation() throws Exception {
1941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertTrue(sse.getEnableSessionCreation());
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sse.setEnableSessionCreation(false);
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertFalse(sse.getEnableSessionCreation());
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sse.setEnableSessionCreation(true);
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertTrue(sse.getEnableSessionCreation());
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception " + ex);
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
205f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
207229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#setNeedClientAuth(boolean need)
208229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getNeedClientAuth()
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
210b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_NeedClientAuth() throws Exception {
2111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sse.setNeedClientAuth(false);
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertFalse(sse.getNeedClientAuth());
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sse.setNeedClientAuth(true);
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertTrue(sse.getNeedClientAuth());
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception " + ex);
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
223229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#setWantClientAuth(boolean want)
224229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getWantClientAuth()
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
226b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_WantClientAuth() throws Exception {
2271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
228b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setWantClientAuth(false);
229b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertFalse(sse.getWantClientAuth());
230b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setWantClientAuth(true);
231b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue(sse.getWantClientAuth());
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
233f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
235229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#beginHandshake()
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
237b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_beginHandshake() throws Exception {
2381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sse.beginHandshake();
2411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IllegalStateException wasn't thrown");
242b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalStateException expected) {
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        sse = getEngine("new host", 1080);
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sse.beginHandshake();
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalStateException wasn't thrown");
248b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalStateException expected) {
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        sse = getEngine();
251b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setUseClientMode(true);
252b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.beginHandshake();
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
254f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
256229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#setUseClientMode(boolean mode)
257229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getUseClientMode()
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
259b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_UseClientMode() throws Exception {
2601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
261b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setUseClientMode(false);
262b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertFalse(sse.getUseClientMode());
263b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setUseClientMode(true);
264b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue(sse.getUseClientMode());
265f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
266b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse = getEngine(null, 1080);
267b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setUseClientMode(true);
268b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.beginHandshake();
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
270b330a5e324ef8d399f12db82b4bf472859815fafKenny Root            sse.setUseClientMode(false);
271b330a5e324ef8d399f12db82b4bf472859815fafKenny Root            fail("IllegalArgumentException was not thrown");
272b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
275f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
277229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getSession()
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
279b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_getSession() throws Exception {
2801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
281b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertNotNull(sse.getSession());
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
283f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
285229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getHandshakeStatus()
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
287b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_getHandshakeStatus() throws Exception {
2881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
289b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(sse.getHandshakeStatus().toString(), "NOT_HANDSHAKING");
290b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.setUseClientMode(true);
291b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.beginHandshake();
292b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(sse.getHandshakeStatus().toString(), "NEED_WRAP");
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
294f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
296229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#getDelegatedTask()
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
298b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_getDelegatedTask() throws Exception {
2991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
300b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertNull(sse.getDelegatedTask());
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
302f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
304229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                       int offset, int length)
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: SSLException should be thrown.
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
308b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_01() throws Exception {
309051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        prepareEngines();
310051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        doHandshake();
311f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
312051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        ByteBuffer bbs = ByteBuffer.wrap(new byte[] {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,31,2,3,1,2,3,1,2,3,1,2,3});
313d833702509b0cd9f738fb44c7c103b4e5dae439aKenny Root        ByteBuffer bbd = ByteBuffer.allocate(clientEngine.engine.getSession().getApplicationBufferSize());
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
315051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            clientEngine.engine.unwrap(bbs, new ByteBuffer[] { bbd }, 0, 1);
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("SSLException wasn't thrown");
317b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (SSLException expected) {
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
320f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
322229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                       int offset, int length)
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: IndexOutOfBoundsException should be thrown.
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
326b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_02() throws Exception {
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
3321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
334f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
336051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbA, -1, 3);
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IndexOutOfBoundsException wasn't thrown");
338b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IndexOutOfBoundsException expected) {
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
341051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbA, 0, -3);
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IndexOutOfBoundsException wasn't thrown");
343b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IndexOutOfBoundsException expected) {
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
346051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbA, bbA.length + 1, bbA.length);
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IndexOutOfBoundsException wasn't thrown");
348b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IndexOutOfBoundsException expected) {
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
351051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbA, 0, bbA.length + 1);
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IndexOutOfBoundsException wasn't thrown");
353b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IndexOutOfBoundsException expected) {
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
356f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
358229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                       int offset, int length)
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: ReadOnlyBufferException should be thrown.
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
362b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_03() throws Exception {
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbR = ByteBuffer.allocate(100).asReadOnlyBuffer();
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = { bbR, ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
3691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
371f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
373051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbA, 0, bbA.length);
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("ReadOnlyBufferException wasn't thrown");
375b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (ReadOnlyBufferException expected) {
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
378f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
380229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                       int offset, int length)
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: IllegalArgumentException should be thrown.
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
384b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_04() throws Exception {
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100)};
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbAN = {ByteBuffer.allocate(100), null, ByteBuffer.allocate(100)};
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbN = null;
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bN = null;
3921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
394f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
396051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bN, bbA, 0, 3);
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
398b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
401051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbAN, 0, 3);
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
403b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
406051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbN, 0, 0);
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
408b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
411051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bN, bbN, 0, 0);
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
413b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
416f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
418229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                       int offset, int length)
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: IllegalStateException should be thrown.
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
422b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_05() throws Exception {
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
4281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
429f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
431b330a5e324ef8d399f12db82b4bf472859815fafKenny Root            SSLEngineResult result = sse.unwrap(bb, bbA, 0, bbA.length);
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalStateException wasn't thrown");
433b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalStateException expected) {
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
436f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
438229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                       int offset, int length)
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
441b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_06() throws Exception {
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
4471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
449f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
450b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        SSLEngineResult res = sse.unwrap(bb, bbA, 0, bbA.length);
451b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesConsumed());
452b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesProduced());
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
454f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
455b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_01() throws Exception {
456051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        prepareEngines();
457051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        doHandshake();
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(100);
459b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        ByteBuffer bbd = ByteBuffer.allocate(MAX_TLS_RECORD_SIZE);
4605a1dfc86838c8030550a8c954a1f817d0929f20aJesse Wilson        clientEngine.engine.wrap(new ByteBuffer[] { bbs }, 0, 1, bbd);
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
462f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
464229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                     int length, ByteBuffer dst)
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: IndexOutOfBoundsException should be thrown.
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
468b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_02() throws Exception {
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
4731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
475f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
477051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbA, -1, 3, bb);
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IndexOutOfBoundsException wasn't thrown");
479b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IndexOutOfBoundsException expected) {
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
482051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbA, 0, -3, bb);
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IndexOutOfBoundsException wasn't thrown");
484b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IndexOutOfBoundsException expected) {
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
487051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbA, bbA.length + 1, bbA.length, bb);
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IndexOutOfBoundsException wasn't thrown");
489b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IndexOutOfBoundsException expected) {
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
492051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbA, 0, bbA.length + 1, bb);
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IndexOutOfBoundsException wasn't thrown");
494b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IndexOutOfBoundsException expected) {
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
497f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
499229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                     int length, ByteBuffer dst)
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: ReadOnlyBufferException should be thrown.
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
503b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_03() throws Exception {
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
506b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        ByteBuffer bb = ByteBuffer.allocate(MAX_TLS_RECORD_SIZE).asReadOnlyBuffer();
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
5081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
510f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
512051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbA, 0, bbA.length, bb);
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("ReadOnlyBufferException wasn't thrown");
514b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (ReadOnlyBufferException expected) {
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
517f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
519229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                     int length, ByteBuffer dst)
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: IllegalArgumentException should be thrown.
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
523b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_04() throws Exception {
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100)};
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbN = null;
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bN = null;
5291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine e = getEngine(host, port);
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        e.setUseClientMode(true);
531f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.wrap(bbA, 0, 3, bN);
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException must be thrown for null srcs byte buffer array");
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException ex) {
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
537f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.wrap(bbN, 0, 0, bN);
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException ex) {
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
544f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
546229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                     int length, ByteBuffer dst)
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Exception case: IllegalStateException should be thrown.
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
550b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_05() throws Exception {
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
553b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        ByteBuffer bb = ByteBuffer.allocate(MAX_TLS_RECORD_SIZE);
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
5551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
556f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
558b330a5e324ef8d399f12db82b4bf472859815fafKenny Root            SSLEngineResult result = sse.wrap(bbA, 0, bbA.length, bb);
559b330a5e324ef8d399f12db82b4bf472859815fafKenny Root            fail("Should fail since mode not set yet");
560b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalStateException expected) {
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
563f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
565229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                     int length, ByteBuffer dst)
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
568b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_06() throws Exception {
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
571b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        ByteBuffer bb = ByteBuffer.allocate(MAX_TLS_RECORD_SIZE);
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
5731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
574f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        sse.setUseClientMode(true);
575f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
576b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        SSLEngineResult result = sse.wrap(bbA, 0, bbA.length, bb);
577b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(SSLEngineResult.Status.OK, result.getStatus());
578b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, result.bytesConsumed());
579b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue(result.bytesProduced() > 0);
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
581f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
583229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#closeOutbound()
584229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#isOutboundDone()
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
586b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_closeOutbound() throws Exception {
5871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
588f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
589b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertFalse(sse.isOutboundDone());
590b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.closeOutbound();
591b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue(sse.isOutboundDone());
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
593f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
595229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#closeInbound()
596229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#isInboundDone()
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
598b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_closeInbound() throws Exception {
5991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine();
600f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
601b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertFalse(sse.isInboundDone());
602b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        sse.closeInbound();
603b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertTrue(sse.isInboundDone());
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
605f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
607229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SSLException should be thrown.
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
610b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer_ByteBuffer_01() throws Exception {
611051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        prepareEngines();
612051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        doHandshake();
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(100);
614051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        ByteBuffer bbd = ByteBuffer.allocate(100);
615f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
617051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            SSLEngineResult unwrap = clientEngine.engine.unwrap(bbs, bbd);
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("SSLException wasn't thrown");
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SSLException ex) {
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
623f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
625229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ReadOnlyBufferException should be thrown.
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
628b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer_ByteBuffer_02() throws Exception {
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbd = ByteBuffer.allocate(100).asReadOnlyBuffer();
6331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
635f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
637051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bbs, bbd);
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("ReadOnlyBufferException wasn't thrown");
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (ReadOnlyBufferException iobe) {
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail(e + " was thrown instead of ReadOnlyBufferException");
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
645f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
647229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalArgumentException should be thrown.
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
650b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer_ByteBuffer_03() throws Exception {
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbsN = null;
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbdN = null;
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbd = ByteBuffer.allocate(100);
6571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
659f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
661051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bbsN, bbd);
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
663b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
665f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
667051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bbs, bbdN);
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
669b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
671f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
673051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bbsN, bbdN);
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
675b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
678f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
680229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalStateException should be thrown.
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
683b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer_ByteBuffer_04() throws Exception {
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbd = ByteBuffer.allocate(100);
6881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
689f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
691051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bbs, bbd);
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalStateException wasn't thrown");
693b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalStateException expected) {
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
696f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
698229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
700b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer_ByteBuffer_05() throws Exception {
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbd = ByteBuffer.allocate(100);
7051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
707f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
708b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        SSLEngineResult res = sse.unwrap(bbs, bbd);
709b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesConsumed());
710b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesProduced());
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
712f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
714229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SSLException should be thrown.
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
717b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer$ByteBuffer_01() throws Exception {
718be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob        prepareEngines();
719be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob        doHandshake();
720051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
721f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        ByteBuffer bbs = ByteBuffer.allocate(100);
722be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob        ByteBuffer bbd = ByteBuffer.allocate(100);
723f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
724051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        try {
725be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob            clientEngine.engine.unwrap(bbs, new ByteBuffer[] { bbd });
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("SSLException wasn't thrown");
727b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (SSLException expected) {
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
730051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
732229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ReadOnlyBufferException should be thrown.
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
735b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer$ByteBuffer_02() throws Exception {
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbR = ByteBuffer.allocate(100).asReadOnlyBuffer();
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = { bbR, ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
7411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
743f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
745051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bbs, bbA);
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("ReadOnlyBufferException wasn't thrown");
747b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (ReadOnlyBufferException expected) {
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
750f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
752229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalArgumentException should be thrown.
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
755b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer$ByteBuffer_03() throws Exception {
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbN = { ByteBuffer.allocate(100), null, ByteBuffer.allocate(100) };
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbAN = null;
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bN = null;
7631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
765f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
767051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bN, bbA);
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
769b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
771f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
773051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbAN);
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
775b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
777f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
779051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bb, bbN);
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
781b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
783f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
785051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bN, bbAN);
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
787b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
790f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
792229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalStateException should be thrown.
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
795b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer$ByteBuffer_04() throws Exception {
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbd = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
8001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
801f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
803051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.unwrap(bbs, bbd);
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalStateException wasn't thrown");
805b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalStateException expected) {
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
808f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
810229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
812b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_unwrap_ByteBuffer$ByteBuffer_05() throws Exception {
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbd = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
8171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
819f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
820b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        SSLEngineResult res = sse.unwrap(bbs, bbd);
821b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesConsumed());
822b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesProduced());
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
824f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
825b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer_ByteBuffer_01() throws Exception {
826051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        prepareEngines();
827051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        doHandshake();
828051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        ByteBuffer bbs = ByteBuffer.allocate(20);
829051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        ByteBuffer bbd = ByteBuffer.allocate(20000);
8305a1dfc86838c8030550a8c954a1f817d0929f20aJesse Wilson        clientEngine.engine.wrap(bbs, bbd);
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
832f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
834229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer src, ByteBuffer dst)
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ReadOnlyBufferException should be thrown.
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
837b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer_ByteBuffer_02() throws Exception {
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbd = ByteBuffer.allocate(100).asReadOnlyBuffer();
8421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
844f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
846051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbs, bbd);
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("ReadOnlyBufferException wasn't thrown");
848b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (ReadOnlyBufferException expected) {
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
851f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
853229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer src, ByteBuffer dst)
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalArgumentException should be thrown.
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
856b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer_ByteBuffer_03() throws Exception {
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbsN = null;
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbdN = null;
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbd = ByteBuffer.allocate(100);
8631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
865f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
867051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbsN, bbd);
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
869b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
871f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
873051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbs, bbdN);
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
875b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
877f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
879051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbsN, bbdN);
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
881b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
884f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
886229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer src, ByteBuffer dst)
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalStateException should be thrown.
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
889b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer_ByteBuffer_04() throws Exception {
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(10);
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbd = ByteBuffer.allocate(10);
8941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
895f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
897b330a5e324ef8d399f12db82b4bf472859815fafKenny Root            SSLEngineResult result = sse.wrap(bbs, bbd);
898c54efa1b0849fde7c1dec4a6b9b8d4f60f7a1b7dKenny Root            fail();
899b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalStateException expected) {
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
902f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
904229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer src, ByteBuffer dst)
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
906b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer_ByteBuffer_05() throws Exception {
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
9101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
912f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
913b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        SSLEngineResult res = sse.wrap(bb, ByteBuffer.allocate(10));
914b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(Status.BUFFER_OVERFLOW, res.getStatus());
915b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesConsumed());
916b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesProduced());
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
918f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
920229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SSLException should be thrown.
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
923b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer$ByteBuffer_01() throws Exception {
924051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        prepareEngines();
925051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        doHandshake();
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbs = ByteBuffer.allocate(100);
927051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        ByteBuffer bbd = ByteBuffer.allocate(20000);
928f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
929b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        clientEngine.engine.wrap(new ByteBuffer[] { bbs }, bbd);
930b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        serverEngine.engine.wrap(new ByteBuffer[] { bbs }, bbd);
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
932f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
934229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ReadOnlyBufferException should be thrown.
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
937b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer$ByteBuffer_02() throws Exception {
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10).asReadOnlyBuffer();
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
9421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
944f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
946051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbA, bb);
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("ReadOnlyBufferException wasn't thrown");
948b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (ReadOnlyBufferException expected) {
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
951f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
953229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalArgumentException should be thrown.
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
956b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer$ByteBuffer_03() throws Exception {
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100)};
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbAN = null;
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bN = null;
9631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
965f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
967051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbA, bN);
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
969b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
971f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
973051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbAN, bb);
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
975b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
977f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
979051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            sse.wrap(bbAN, bN);
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
981b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        } catch (IllegalArgumentException expected) {
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
984f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
986229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalStateException should be thrown.
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
989b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer$ByteBuffer_04() throws Exception {
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb = ByteBuffer.allocate(10);
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = { ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5) };
9941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
995f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
996c54efa1b0849fde7c1dec4a6b9b8d4f60f7a1b7dKenny Root        try {
997c54efa1b0849fde7c1dec4a6b9b8d4f60f7a1b7dKenny Root            SSLEngineResult result = sse.wrap(bbA, bb);
998c54efa1b0849fde7c1dec4a6b9b8d4f60f7a1b7dKenny Root            fail();
999c54efa1b0849fde7c1dec4a6b9b8d4f60f7a1b7dKenny Root        } catch (IllegalStateException expected) {
1000c54efa1b0849fde7c1dec4a6b9b8d4f60f7a1b7dKenny Root        }
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1002f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1004229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1006b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void test_wrap_ByteBuffer$ByteBuffer_05() throws Exception {
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String host = "new host";
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 8080;
1009b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        ByteBuffer bb = ByteBuffer.allocate(2000);
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer[] bbA = { ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5) };
10111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLEngine sse = getEngine(host, port);
1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sse.setUseClientMode(true);
1013f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1014b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        SSLEngineResult res = sse.wrap(bbA, bb);
1015b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        assertEquals(0, res.bytesConsumed());
1016039b20086fa05ea9b2fa10f508c20afab34663dfKenny Root        if (res.bytesProduced() == 0) {
1017039b20086fa05ea9b2fa10f508c20afab34663dfKenny Root            assertEquals(HandshakeStatus.NEED_WRAP, res.getHandshakeStatus());
1018039b20086fa05ea9b2fa10f508c20afab34663dfKenny Root        } else {
1019039b20086fa05ea9b2fa10f508c20afab34663dfKenny Root            assertEquals(HandshakeStatus.NEED_UNWRAP, res.getHandshakeStatus());
1020039b20086fa05ea9b2fa10f508c20afab34663dfKenny Root        }
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1023b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    private SSLEngine getEngine() throws Exception {
1024b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        SSLContext context = SSLContext.getInstance("TLS");
1025b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        context.init(null, null, null);
10261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return context.createSSLEngine();
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1029b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    private SSLEngine getEngine(String host, int port) throws Exception {
1030b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        SSLContext context = SSLContext.getInstance("TLS");
1031b330a5e324ef8d399f12db82b4bf472859815fafKenny Root        context.init(null, null, null);
10321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return context.createSSLEngine(host, port);
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1034f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1035051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann    class HandshakeHandler implements Runnable {
1036051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1037051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private final SSLEngine engine;
1038051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1039051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private final SourceChannel in;
1040051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1041051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private final SinkChannel out;
1042051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1043051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private final ByteBuffer EMPTY = ByteBuffer.allocate(0);
1044051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1045051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        @SuppressWarnings("unused")
1046051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private final String LOGTAG;
1047051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1048051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private SSLEngineResult.HandshakeStatus status;
1049051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1050051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private ByteBuffer readBuffer;
1051051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1052051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private ByteBuffer writeBuffer;
1053051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
10545be4c97a83895b7e1385445db6a1717eb8df3e9bKenny Root        HandshakeHandler(SSLContext context, boolean clientMode, SourceChannel in, SinkChannel out)
10555be4c97a83895b7e1385445db6a1717eb8df3e9bKenny Root                throws Exception {
1056051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            this.in = in;
1057051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            this.out = out;
10585be4c97a83895b7e1385445db6a1717eb8df3e9bKenny Root            engine = context.createSSLEngine();
1059051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            engine.setUseClientMode(clientMode);
1060be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob            engine.beginHandshake();
1061be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob            status = engine.getHandshakeStatus();
1062051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1063051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            if (clientMode) {
1064051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                LOGTAG = "CLIENT: ";
1065051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            } else {
1066051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                LOGTAG = "SERVER: ";
1067051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            }
1068051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1069051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            log("CipherSuites: " + Arrays.toString(engine.getEnabledCipherSuites()));
1070051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            log(status);
1071051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1072051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            readBuffer = ByteBuffer.allocate(200000);
1073051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            writeBuffer = ByteBuffer.allocate(20000);
1074051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        }
1075051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1076051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        public SSLEngineResult.HandshakeStatus getStatus() {
1077051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            return status;
1078051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        }
1079051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1080051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private void log(Object o) {
1081051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            //System.out.print(LOGTAG);
1082051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            //System.out.println(o);
1083051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        }
1084051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1085051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        private ByteBuffer read() throws IOException {
1086051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            if (readBuffer == null || readBuffer.remaining() == 0 || readBuffer.position() == 0) {
1087be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                readBuffer.clear();
1088051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                int read = in.read(readBuffer);
1089051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                log("read: " + read);
1090051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                readBuffer.rewind();
1091051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                readBuffer.limit(read);
1092051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            }
1093051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            return readBuffer;
1094051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        }
1095051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1096051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        public void run() {
1097be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob            try {
1098be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                while (true) {
1099051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                    switch (status) {
1100051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        case FINISHED: {
1101051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            log(status);
1102051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            return;
1103051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        }
1104051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        case NEED_TASK: {
1105051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            log(status);
1106be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                            Runnable task;
1107051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            while ((task = engine.getDelegatedTask()) != null) {
1108051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                                task.run();
1109051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            }
1110051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            status = engine.getHandshakeStatus();
1111051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            break;
1112051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        }
1113051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        case NEED_UNWRAP: {
1114051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            log(status);
1115051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            ByteBuffer source = read();
1116be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                            writeBuffer.clear();
1117051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1118051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            while (status == HandshakeStatus.NEED_UNWRAP) {
1119051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                                SSLEngineResult result = engine.unwrap(source, writeBuffer);
1120051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                                status = result.getHandshakeStatus();
1121051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                                log(result);
1122051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            }
1123051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            break;
1124051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        }
1125051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        case NEED_WRAP: {
1126051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            log(status);
1127be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                            writeBuffer.clear();
1128051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann
1129051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            int produced = 0;
1130051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            SSLEngineResult result = null;
1131051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            while (status == HandshakeStatus.NEED_WRAP) {
1132051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                                result = engine.wrap(EMPTY, writeBuffer);
1133051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                                status = result.getHandshakeStatus();
1134051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                                produced += result.bytesProduced();
1135051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                                log(result);
1136051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            }
1137051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            writeBuffer.rewind();
1138051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            writeBuffer.limit(produced);
1139051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            log("write: " + produced);
1140051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            out.write(writeBuffer);
1141051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            break;
1142051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        }
1143051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        case NOT_HANDSHAKING: {
1144051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            log("Not Handshaking");
1145051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                            return;
1146051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                        }
1147051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                    }
1148051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann                }
1149be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob            } catch (IOException e) {
1150be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                log(e);
1151be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob            } catch (RuntimeException e) {
1152be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                // ignore;
1153051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            }
1154051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        }
1155051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann    }
1156f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1157b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    public void testHandshake() throws Exception {
1158be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob
1159051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        prepareEngines();
1160be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob
1161051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        assertTrue("handshake failed", doHandshake());
1162f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1163051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        System.out.println(clientEngine.engine.getSession().getCipherSuite());
1164be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob
1165be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob        assertEquals("Handshake not finished",
1166be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                SSLEngineResult.HandshakeStatus.FINISHED,
1167be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                clientEngine.getStatus());
1168be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob        assertEquals("Handshake not finished",
1169be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                SSLEngineResult.HandshakeStatus.FINISHED,
1170be25811712488827cf836ee6170eca8fb4e14fe4Urs Grob                serverEngine.getStatus());
1171051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann    }
1172f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1173b330a5e324ef8d399f12db82b4bf472859815fafKenny Root    void prepareEngines() throws Exception {
1174051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        Pipe clientSendPipe = Pipe.open();
1175051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        Pipe serverSendPipe = Pipe.open();
1176f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1177051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        SinkChannel clientSink = clientSendPipe.sink();
1178051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        SourceChannel serverSource = clientSendPipe.source();
1179051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        SinkChannel serverSink = serverSendPipe.sink();
1180051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        SourceChannel clientSource = serverSendPipe.source();
1181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
11825be4c97a83895b7e1385445db6a1717eb8df3e9bKenny Root        TestSSLContext context = TestSSLContext.create();
11835be4c97a83895b7e1385445db6a1717eb8df3e9bKenny Root        clientEngine = new HandshakeHandler(context.clientContext, true, clientSource, clientSink);
11845be4c97a83895b7e1385445db6a1717eb8df3e9bKenny Root        serverEngine = new HandshakeHandler(context.serverContext, false, serverSource, serverSink);
1185051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann    }
1186f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1187051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann    boolean doHandshake() throws InterruptedException {
1188051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        Thread clientThread = new Thread(clientEngine);
1189051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        clientThread.start();
1190f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1191051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        Thread serverThread = new Thread(serverEngine);
1192051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        serverThread.start();
1193f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1194051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        int i = 0;
1195051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        while (clientThread.isAlive() && serverThread.isAlive() && i < 20) {
1196051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            Thread.sleep(500);
1197051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            i++;
1198051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        }
1199f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1200051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        if (clientThread.isAlive()) {
1201051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            clientThread.interrupt();
1202051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        }
1203f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1204051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        if (serverThread.isAlive()) {
1205051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann            serverThread.interrupt();
1206051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        }
1207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1208051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann        return clientEngine.getStatus() == HandshakeStatus.FINISHED && serverEngine.getStatus() == HandshakeStatus.FINISHED;
1209051f400949489d012498f575c0a40999ad7a4f54Jorg Pleumann    }
1210f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1212