Home | History | Annotate | Download | only in jsse
      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.provider.jsse;
     19 
     20 import java.io.IOException;
     21 import java.math.BigInteger;
     22 import java.util.Arrays;
     23 
     24 import junit.framework.TestCase;
     25 
     26 /**
     27  * Tests for <code>ServerKeyExchange</code> constructor and methods
     28  *
     29  */
     30 public class ServerKeyExchangeTest extends TestCase {
     31 
     32     public void testServerKeyExchange_RSA_EXPORT() throws Exception {
     33         BigInteger rsa_mod = new BigInteger(
     34                 "0620872145533812525365347773040950432706816921321053881493952289532007782427182339053847578435298266865073748931755945944874247298083566202475988854994079");
     35         BigInteger rsa_exp = new BigInteger("65537");
     36 
     37         byte[] hash = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
     38                 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
     39         ServerKeyExchange message = new ServerKeyExchange(rsa_mod, rsa_exp,
     40                 null, hash);
     41         assertEquals("incorrect type", Handshake.SERVER_KEY_EXCHANGE, message
     42                 .getType());
     43 
     44         assertTrue("incorrect ServerKeyExchange", Arrays.equals(message.hash,
     45                 hash));
     46         assertEquals("incorrect ServerKeyExchange", rsa_mod, message.par1);
     47         assertEquals("incorrect ServerKeyExchange", rsa_exp, message.par2);
     48         assertNull("incorrect ServerKeyExchange", message.par3);
     49 
     50         HandshakeIODataStream out = new HandshakeIODataStream();
     51         message.send(out);
     52         byte[] encoded = out.getData(1000);
     53         assertEquals("incorrect out data length", message.length(),
     54                 encoded.length);
     55 
     56         HandshakeIODataStream in = new HandshakeIODataStream();
     57         in.append(encoded);
     58         ServerKeyExchange message_2 = new ServerKeyExchange(in, message
     59                 .length(), CipherSuite.KeyExchange_RSA_EXPORT);
     60 
     61         assertTrue("incorrect message decoding", Arrays.equals(message.hash,
     62                 message_2.hash));
     63         assertEquals("incorrect message decoding", message.par1, message_2.par1);
     64         assertEquals("incorrect message decoding", message.par2, message_2.par2);
     65         assertNull("incorrect message decoding", message_2.par3);
     66         assertEquals("incorrect message decoding", message.getRSAPublicKey(),
     67                 message_2.getRSAPublicKey());
     68 
     69         in.append(encoded);
     70         try {
     71             new ServerKeyExchange(in, message.length() - 1,
     72                     CipherSuite.KeyExchange_RSA_EXPORT);
     73             fail("Small length: No expected AlertException");
     74         } catch (AlertException e) {
     75         }
     76 
     77         in.append(encoded);
     78         in.append(new byte[] { 1, 2, 3 });
     79         try {
     80             new ServerKeyExchange(in, message.length() + 3,
     81                     CipherSuite.KeyExchange_RSA_EXPORT);
     82             fail("Extra bytes: No expected AlertException ");
     83         } catch (AlertException e) {
     84         }
     85     }
     86 
     87     public void testServerKeyExchange_DHE_DSS() throws Exception {
     88         BigInteger dh_p = new BigInteger("1234567890");
     89         BigInteger dh_g = new BigInteger("987654321");
     90         BigInteger dh_Ys = new BigInteger("123123123");
     91         byte[] hash = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
     92                 6, 7, 8, 9, 0 };
     93         ServerKeyExchange message = new ServerKeyExchange(dh_p, dh_g, dh_Ys,
     94                 hash);
     95         assertEquals("incorrect type", Handshake.SERVER_KEY_EXCHANGE, message
     96                 .getType());
     97 
     98         assertTrue("incorrect ServerKeyExchange", Arrays.equals(message.hash,
     99                 hash));
    100         assertEquals("incorrect ServerKeyExchange", dh_p, message.par1);
    101         assertEquals("incorrect ServerKeyExchange", dh_g, message.par2);
    102         assertEquals("incorrect ServerKeyExchange", dh_Ys, message.par3);
    103 
    104         HandshakeIODataStream out = new HandshakeIODataStream();
    105         message.send(out);
    106         byte[] encoded = out.getData(1000);
    107         assertEquals("incorrect out data length", message.length(),
    108                 encoded.length);
    109 
    110         HandshakeIODataStream in = new HandshakeIODataStream();
    111         in.append(encoded);
    112         ServerKeyExchange message_2 = new ServerKeyExchange(in, message
    113                 .length(), CipherSuite.KeyExchange_DHE_DSS);
    114 
    115         assertTrue("incorrect message decoding", Arrays.equals(message.hash,
    116                 message_2.hash));
    117         assertEquals("incorrect message decoding", message.par1, message_2.par1);
    118         assertEquals("incorrect message decoding", message.par2, message_2.par2);
    119         assertEquals("incorrect message decoding", message.par3, message_2.par3);
    120 
    121         in.append(encoded);
    122         try {
    123             new ServerKeyExchange(in, message.length() - 1,
    124                     CipherSuite.KeyExchange_DHE_DSS);
    125             fail("Small length: No expected AlertException");
    126         } catch (AlertException e) {
    127         }
    128 
    129         in.append(encoded);
    130         in.append(new byte[] { 1, 2, 3 });
    131         try {
    132             new ServerKeyExchange(in, message.length() + 3,
    133                     CipherSuite.KeyExchange_DHE_DSS);
    134             fail("Extra bytes: No expected AlertException ");
    135         } catch (AlertException e) {
    136         }
    137     }
    138 
    139     public void testServerKeyExchange_DH_anon() throws Exception {
    140         BigInteger dh_p = new BigInteger("1234567890");
    141         BigInteger dh_g = new BigInteger("987654321");
    142         BigInteger dh_Ys = new BigInteger("123123123");
    143         ServerKeyExchange message = new ServerKeyExchange(dh_p, dh_g, dh_Ys,
    144                 null);
    145         assertEquals("incorrect type", Handshake.SERVER_KEY_EXCHANGE, message
    146                 .getType());
    147 
    148         assertNull("incorrect ServerKeyExchange", message.hash);
    149         assertEquals("incorrect ServerKeyExchange", dh_p, message.par1);
    150         assertEquals("incorrect ServerKeyExchange", dh_g, message.par2);
    151         assertEquals("incorrect ServerKeyExchange", dh_Ys, message.par3);
    152 
    153         HandshakeIODataStream out = new HandshakeIODataStream();
    154         message.send(out);
    155         byte[] encoded = out.getData(1000);
    156         assertEquals("incorrect out data length", message.length(),
    157                 encoded.length);
    158 
    159         HandshakeIODataStream in = new HandshakeIODataStream();
    160         in.append(encoded);
    161         ServerKeyExchange message_2 = new ServerKeyExchange(in, message
    162                 .length(), CipherSuite.KeyExchange_DH_anon);
    163 
    164         assertNull("incorrect message decoding", message_2.hash);
    165         assertEquals("incorrect message decoding", message.par1, message_2.par1);
    166         assertEquals("incorrect message decoding", message.par2, message_2.par2);
    167         assertEquals("incorrect message decoding", message.par3, message_2.par3);
    168 
    169         in.append(encoded);
    170         try {
    171             new ServerKeyExchange(in, message.length() - 1,
    172                     CipherSuite.KeyExchange_DH_anon);
    173             fail("Small length: No expected AlertException");
    174         } catch (AlertException e) {
    175         }
    176 
    177         in.append(encoded);
    178         in.append(new byte[] { 1, 2, 3 });
    179         try {
    180             new ServerKeyExchange(in, message.length() + 3,
    181                     CipherSuite.KeyExchange_DH_anon);
    182             fail("Extra bytes: No expected AlertException ");
    183         } catch (AlertException e) {
    184         }
    185     }
    186 
    187 }
    188