ServerKeyExchangeTest.java revision 561ee011997c6c2f1befbfaa9d5f0a99771c1d63
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
18package org.apache.harmony.xnet.provider.jsse;
19
20import java.io.IOException;
21import java.math.BigInteger;
22import java.util.Arrays;
23
24import junit.framework.TestCase;
25
26/**
27 * Tests for <code>ServerKeyExchange</code> constructor and methods
28 *
29 */
30public 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