• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 package org.apache.harmony.xnet.tests.javax.net.ssl;
19 
20 import java.nio.ByteBuffer;
21 import java.nio.ReadOnlyBufferException;
22 
23 import javax.net.ssl.SSLEngine;
24 import javax.net.ssl.SSLException;
25 import javax.net.ssl.SSLParameters;
26 import javax.net.ssl.SSLEngineResult.HandshakeStatus;
27 import javax.net.ssl.SSLSession;
28 import javax.net.ssl.SSLEngineResult;
29 
30 import junit.framework.TestCase;
31 
32 /**
33  * Tests for SSLEngine class
34  */
35 
36 public class SSLEngineTest extends TestCase {
37 
38     /**
39      * Test for <code>SSLEngine()</code> constructor Assertion: creates
40      * SSLEngine object with null host and -1 port
41      */
test01()42     public void test01() {
43         SSLEngine e = new mySSLEngine();
44         assertNull(e.getPeerHost());
45         assertEquals(-1, e.getPeerPort());
46         String[] suites = { "a", "b", "c" };
47         e.setEnabledCipherSuites(suites);
48         assertEquals(e.getEnabledCipherSuites().length, suites.length);
49     }
50 
51     /**
52      * Test for <code>SSLEngine(String host, int port)</code> constructor
53      */
test02()54     public void test02() throws SSLException {
55         int port = 1010;
56         SSLEngine e = new mySSLEngine(null, port);
57         assertNull(e.getPeerHost());
58         assertEquals(e.getPeerPort(), port);
59         try {
60             e.beginHandshake();
61         } catch (SSLException ex) {
62         }
63     }
64 
65     /**
66      * Test for <code>SSLEngine(String host, int port)</code> constructor
67      */
test03()68     public void test03() {
69         String host = "new host";
70         int port = 8080;
71         SSLEngine e = new mySSLEngine(host, port);
72         assertEquals(e.getPeerHost(), host);
73         assertEquals(e.getPeerPort(), port);
74         String[] suites = { "a", "b", "c" };
75         e.setEnabledCipherSuites(suites);
76         assertEquals(e.getEnabledCipherSuites().length, suites.length);
77         e.setUseClientMode(true);
78         assertTrue(e.getUseClientMode());
79     }
80 
81     /**
82      * Test for <code>wrap(ByteBuffer src, ByteBuffer dst)</code> method
83      * Assertions:
84      * throws IllegalArgumentException when src or dst is null
85      * throws ReadOnlyBufferException when dst is ReadOnly byte buffer
86      * <p/>
87      * Check that implementation behavior follows RI:
88      * jdk 1.5 does not throw IllegalArgumentException when parameters are null
89      * and does not throw ReadOnlyBufferException if dst is read only byte buffer
90      */
testWrap01()91     public void testWrap01() throws SSLException {
92         String host = "new host";
93         int port = 8080;
94         ByteBuffer bbN = null;
95         ByteBuffer bb = ByteBuffer.allocate(10);
96         SSLEngine e = new mySSLEngine(host, port);
97 
98         e.wrap(bbN, bb);
99         e.wrap(bb, bbN);
100 
101         ByteBuffer roBb = bb.asReadOnlyBuffer();
102         assertTrue("Not read only byte buffer", roBb.isReadOnly());
103         e.wrap(bb, roBb);
104 
105     }
106 
107     /**
108      * Test for <code>wrap(ByteBuffer[] srcs, ByteBuffer dst)</code> method
109      * <p/>
110      * Assertions: throws IllegalArgumentException when srcs or dst is null or
111      * srcs contains null byte buffer; throws ReadOnlyBufferException when dst
112      * is read only byte buffer
113      * <p/>
114      * Check that implementation behavior follows RI:
115      * jdk 1.5 does not throw IllegalArgumentException when dst is null or
116      * if srcs contains null elements It does not throw ReadOnlyBufferException
117      * for read only dst
118      */
testWrap02()119     public void testWrap02() throws SSLException {
120         String host = "new host";
121         int port = 8080;
122         ByteBuffer[] bbNA = null;
123         ByteBuffer[] bbA = { null, ByteBuffer.allocate(10), null };
124 
125         ByteBuffer bb = ByteBuffer.allocate(10);
126         ByteBuffer bbN = null;
127         SSLEngine e = new mySSLEngine(host, port);
128         try {
129             e.wrap(bbNA, bb);
130             fail("IllegalArgumentException must be thrown for null srcs byte buffer array");
131         } catch (IllegalArgumentException ex) {
132         }
133 
134         e.wrap(bbA, bb);
135         e.wrap(bbA, bbN);
136 
137         ByteBuffer roBb = bb.asReadOnlyBuffer();
138         bbA[0] = ByteBuffer.allocate(100);
139         bbA[2] = ByteBuffer.allocate(20);
140         assertTrue("Not read only byte buffer", roBb.isReadOnly());
141 
142         e.wrap(bbA, roBb);
143 
144     }
145 
146     /**
147      * Test for <code>wrap(ByteBuffer src, ByteBuffer dst)</code> and
148      * <code>wrap(ByteBuffer[] srcs, ByteBuffer dst)</code> methods
149      * <p/>
150      * Assertion: these methods throw SSLException
151      */
testWrap03()152     public void testWrap03() throws SSLException {
153         String host = "new host";
154         int port = 8080;
155         ByteBuffer bbs = ByteBuffer.allocate(100);
156         ByteBuffer bbd = ByteBuffer.allocate(10);
157         SSLEngine e = new mySSLEngine1(host, port);
158         try {
159             e.wrap(bbs, bbd);
160             fail("SSLException must be thrown");
161         } catch (SSLException ex) {
162         }
163         SSLEngineResult res = e.wrap(bbd, bbs);
164         assertEquals(10, res.bytesConsumed());
165         assertEquals(20, res.bytesProduced());
166 
167         try {
168             e.wrap(new ByteBuffer[] { bbs }, bbd);
169             fail("SSLException must be thrown");
170         } catch (SSLException ex) {
171         }
172         res = e.wrap(new ByteBuffer[] { bbd }, bbs);
173         assertEquals(10, res.bytesConsumed());
174         assertEquals(20, res.bytesProduced());
175     }
176 
177     /**
178      * Test for <code>wrap(ByteBuffer src, ByteBuffer dst)</code> method
179      * <p/>
180      * Assertion: encodes a buffer data into network data.
181      */
testWrap04()182     public void testWrap04() throws SSLException {
183         String host = "new host";
184         int port = 8080;
185         ByteBuffer bb = ByteBuffer.allocate(10);
186         SSLEngine e = new mySSLEngine(host, port);
187 
188         SSLEngineResult res = e.wrap(bb, ByteBuffer.allocate(10));
189         assertEquals(10, res.bytesConsumed());
190         assertEquals(20, res.bytesProduced());
191     }
192 
193     /**
194      * Test for <code>wrap(ByteBuffer[] srcs, ByteBuffer dst)</code> method
195      * <p/>
196      * Assertion: encodes datas from buffers into network data.
197      */
testWrap05()198     public void testWrap05() throws SSLException {
199         String host = "new host";
200         int port = 8080;
201 
202         ByteBuffer bb = ByteBuffer.allocate(10);
203         ByteBuffer[] bbA = { ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5) };
204 
205         SSLEngine e = new mySSLEngine(host, port);
206 
207         SSLEngineResult res = e.wrap(bbA, bb);
208         assertEquals(10, res.bytesConsumed());
209         assertEquals(20, res.bytesProduced());
210     }
211 
212     /**
213      * Test for <code>unwrap(ByteBuffer src, ByteBuffer dst)</code> method
214      * <p/>
215      * Assertions:
216      * throws IllegalArgumentException when src or dst is null
217      * throws ReadOnlyBufferException when dst is read only byte buffer
218      * <p/>
219      * Check that implementation behavior follows RI:
220      * jdk 1.5 does not throw IllegalArgumentException when parameters are null
221      * and does not throw ReadOnlyBufferException if dst is read only byte buffer
222      */
testUnwrap01()223     public void testUnwrap01() throws SSLException {
224         String host = "new host";
225         int port = 8080;
226         ByteBuffer bbN = null;
227         ByteBuffer bb = ByteBuffer.allocate(10);
228         SSLEngine e = new mySSLEngine(host, port);
229 
230         e.unwrap(bbN, bb);
231         e.unwrap(bb, bbN);
232 
233         ByteBuffer roBb = bb.asReadOnlyBuffer();
234         assertTrue("Not read only byte buffer", roBb.isReadOnly());
235 
236         e.unwrap(bb, roBb);
237     }
238 
239     /**
240      * Test for <code>unwrap(ByteBuffer src, ByteBuffer[] dsts)</code> method
241      * <p/>
242      * Assertions: throws IllegalArgumentException if parameters are null or
243      * when dsts contains null elements throws ReadOnlyBufferException when dsts
244      * contains read only elements
245      * <p/>
246      * Check that implementation behavior follows RI:
247      * jdk 1.5 does not throw IllegalArgumentException when src is null or
248      * if dsts contains null elements It does not throw ReadOnlyBufferException
249      * when dsts contains read only elements
250      */
testUnwrap02()251     public void testUnwrap02() throws SSLException {
252         String host = "new host";
253         int port = 8080;
254         ByteBuffer[] bbNA = null;
255         ByteBuffer[] bbA = { null, ByteBuffer.allocate(10), null };
256 
257         ByteBuffer bb = ByteBuffer.allocate(10);
258         ByteBuffer bbN = null;
259         SSLEngine e = new mySSLEngine(host, port);
260         try {
261             e.unwrap(bb, bbNA);
262             fail("IllegalArgumentException must be thrown for null dsts byte buffer array");
263         } catch (IllegalArgumentException ex) {
264         }
265 
266         e.unwrap(bb, bbA);
267         e.unwrap(bbN, bbA);
268 
269         ByteBuffer bb1 = ByteBuffer.allocate(100);
270         ByteBuffer roBb = bb1.asReadOnlyBuffer();
271         bbA[0] = bb1;
272         bbA[2] = roBb;
273         assertTrue("Not read only byte buffer", bbA[2].isReadOnly());
274 
275         e.unwrap(bb, bbA);
276 
277     }
278 
279     /**
280      * Test for <code>unwrap(ByteBuffersrc, ByteBuffer dst)</code> and
281      * <code>unwrap(ByteBuffer src, ByteBuffer[] dsts)</code> methods
282      * <p/>
283      * Assertion: these methods throw SSLException
284      */
testUnwrap03()285     public void testUnwrap03() throws SSLException {
286         ByteBuffer bbs = ByteBuffer.allocate(100);
287         ByteBuffer bbd = ByteBuffer.allocate(10);
288         SSLEngine e = new mySSLEngine1();
289         try {
290             e.unwrap(bbs, bbd);
291             fail("SSLException must be thrown");
292         } catch (SSLException ex) {
293         }
294         SSLEngineResult res = e.unwrap(bbd, bbs);
295         assertEquals(1, res.bytesConsumed());
296         assertEquals(2, res.bytesProduced());
297 
298         try {
299             e.unwrap(bbs, new ByteBuffer[] { bbd });
300             fail("SSLException must be thrown");
301         } catch (SSLException ex) {
302         }
303         res = e.unwrap(bbd, new ByteBuffer[] { bbs });
304         assertEquals(1, res.bytesConsumed());
305         assertEquals(2, res.bytesProduced());
306     }
307 
308     /**
309      * Test for <code>unwrap(ByteBuffer src, ByteBuffer dst)</code> method
310      * <p/>
311      * Assertion: decodes  network data into a data buffer.
312      */
testUnwrap04()313     public void testUnwrap04() throws SSLException {
314         String host = "new host";
315         int port = 8080;
316         ByteBuffer bb = ByteBuffer.allocate(10);
317         SSLEngine e = new mySSLEngine(host, port);
318         SSLEngineResult res = e.unwrap(bb, ByteBuffer.allocate(10));
319 
320         assertEquals(1, res.bytesConsumed());
321         assertEquals(2, res.bytesProduced());
322     }
323 
324     /**
325      * Test for <code>unwrap(ByteBuffer src, ByteBuffer[] dsts)</code> method
326      * <p/>
327      * Assertion:
328      * decode network data into data buffers.
329      */
testUnwrap05()330     public void testUnwrap05() throws SSLException {
331         String host = "new host";
332         int port = 8080;
333         ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
334 
335         ByteBuffer bb = ByteBuffer.allocate(10);
336         SSLEngine e = new mySSLEngine(host, port);
337 
338         SSLEngineResult res = e.unwrap(bb, bbA);
339         assertEquals(1, res.bytesConsumed());
340         assertEquals(2, res.bytesProduced());
341     }
342 }
343 
344 /*
345  * Additional class for verification SSLEngine constructors
346  */
347 
348 class mySSLEngine extends SSLEngine {
349 
350     private boolean useClientMode;
351 
352     private boolean needClientAuth;
353 
354     private boolean enableSessionCreation;
355 
356     private boolean wantClientAuth;
357 
358     private String[] enabledProtocols;
359 
360     private String[] enabledCipherSuites;
361 
mySSLEngine()362     public mySSLEngine() {
363         super();
364     }
365 
mySSLEngine(String host, int port)366     protected mySSLEngine(String host, int port) {
367         super(host, port);
368     }
369 
370     @Override
beginHandshake()371     public void beginHandshake() throws SSLException {
372         String host = super.getPeerHost();
373         if ((host == null) || (host.length() == 0)) {
374             throw new SSLException("");
375         }
376     }
377 
378     @Override
closeInbound()379     public void closeInbound() throws SSLException {
380     }
381 
382     @Override
closeOutbound()383     public void closeOutbound() {
384     }
385 
386     @Override
getDelegatedTask()387     public Runnable getDelegatedTask() {
388         return null;
389     }
390 
391     @Override
getEnabledCipherSuites()392     public String[] getEnabledCipherSuites() {
393         return enabledCipherSuites;
394     }
395 
396     @Override
getEnabledProtocols()397     public String[] getEnabledProtocols() {
398         return enabledProtocols;
399     }
400 
401     @Override
getEnableSessionCreation()402     public boolean getEnableSessionCreation() {
403         return enableSessionCreation;
404     }
405 
406     @Override
getHandshakeStatus()407     public SSLEngineResult.HandshakeStatus getHandshakeStatus() {
408         return SSLEngineResult.HandshakeStatus.FINISHED;
409     }
410 
411     @Override
getNeedClientAuth()412     public boolean getNeedClientAuth() {
413         return needClientAuth;
414     }
415 
416     @Override
getSession()417     public SSLSession getSession() {
418         return null;
419     }
420 
421     @Override
getSupportedCipherSuites()422     public String[] getSupportedCipherSuites() {
423         return new String[0];
424     }
425 
426     @Override
getSupportedProtocols()427     public String[] getSupportedProtocols() {
428         return new String[0];
429     }
430 
431     @Override
getUseClientMode()432     public boolean getUseClientMode() {
433         return useClientMode;
434     }
435 
436     @Override
getWantClientAuth()437     public boolean getWantClientAuth() {
438         return wantClientAuth;
439     }
440 
441     @Override
isInboundDone()442     public boolean isInboundDone() {
443         return false;
444     }
445 
446     @Override
isOutboundDone()447     public boolean isOutboundDone() {
448         return false;
449     }
450 
451     @Override
setEnabledCipherSuites(String[] suites)452     public void setEnabledCipherSuites(String[] suites) {
453         enabledCipherSuites = suites;
454     }
455 
456     @Override
setEnabledProtocols(String[] protocols)457     public void setEnabledProtocols(String[] protocols) {
458         enabledProtocols = protocols;
459     }
460 
461     @Override
setEnableSessionCreation(boolean flag)462     public void setEnableSessionCreation(boolean flag) {
463         enableSessionCreation = flag;
464     }
465 
466     @Override
setNeedClientAuth(boolean need)467     public void setNeedClientAuth(boolean need) {
468         needClientAuth = need;
469     }
470 
471     @Override
setUseClientMode(boolean mode)472     public void setUseClientMode(boolean mode) {
473         useClientMode = mode;
474     }
475 
476     @Override
setWantClientAuth(boolean want)477     public void setWantClientAuth(boolean want) {
478         wantClientAuth = want;
479     }
480 
481     @Override
unwrap(ByteBuffer src, ByteBuffer[] dsts, int offset, int length)482     public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts,
483             int offset, int length) throws SSLException {
484         return new SSLEngineResult(SSLEngineResult.Status.OK,
485                 SSLEngineResult.HandshakeStatus.FINISHED, 1, 2);
486     }
487 
488     @Override
wrap(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst)489     public SSLEngineResult wrap(ByteBuffer[] srcs, int offset, int length,
490             ByteBuffer dst) throws SSLException {
491         return new SSLEngineResult(SSLEngineResult.Status.OK,
492                 SSLEngineResult.HandshakeStatus.FINISHED, 10, 20);
493     }
494 
495     @Override
getSSLParameters()496     public SSLParameters getSSLParameters() {
497         // TODO Auto-generated method stub
498         return null;
499     }
500 
501     @Override
setSSLParameters(SSLParameters sslP)502     public void setSSLParameters(SSLParameters sslP) {
503         // TODO Auto-generated method stub
504 
505     }
506 }
507 
508 class mySSLEngine1 extends mySSLEngine {
509 
mySSLEngine1()510     public mySSLEngine1() {
511     }
512 
mySSLEngine1(String host, int port)513     public mySSLEngine1(String host, int port) {
514         super(host, port);
515     }
516 
517     @Override
unwrap(ByteBuffer src, ByteBuffer dst)518     public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer dst)
519             throws SSLException {
520         if (src.limit() > dst.limit()) {
521             throw new SSLException("incorrect limits");
522         }
523         return super.unwrap(src, dst);
524     }
525 
526     @Override
unwrap(ByteBuffer src, ByteBuffer[] dsts)527     public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts)
528             throws SSLException {
529         if (src.limit() > dsts[0].limit()) {
530             throw new SSLException("incorrect limits");
531         }
532         return super.unwrap(src, dsts);
533     }
534 
535     @Override
wrap(ByteBuffer[] srcs, ByteBuffer dst)536     public SSLEngineResult wrap(ByteBuffer[] srcs, ByteBuffer dst)
537             throws SSLException {
538         if (srcs[0].limit() > dst.limit()) {
539             throw new SSLException("incorrect limits");
540         }
541         return super.wrap(srcs, dst);
542     }
543 
544     @Override
wrap(ByteBuffer src, ByteBuffer dst)545     public SSLEngineResult wrap(ByteBuffer src, ByteBuffer dst)
546             throws SSLException {
547         if (src.limit() > dst.limit()) {
548             throw new SSLException("incorrect limits");
549         }
550         return super.wrap(src, dst);
551     }
552 
553 }
554