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