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