1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
package org.bouncycastle.crypto.tls.test;
import java.security.SecureRandom;
import junit.framework.TestCase;
import org.bouncycastle.crypto.tls.DTLSClientProtocol;
import org.bouncycastle.crypto.tls.DTLSServerProtocol;
import org.bouncycastle.crypto.tls.DTLSTransport;
import org.bouncycastle.crypto.tls.DatagramTransport;
import org.bouncycastle.util.Arrays;
public class DTLSProtocolTest
extends TestCase
{
public void testClientServer()
throws Exception
{
SecureRandom secureRandom = new SecureRandom();
DTLSClientProtocol clientProtocol = new DTLSClientProtocol(secureRandom);
DTLSServerProtocol serverProtocol = new DTLSServerProtocol(secureRandom);
MockDatagramAssociation network = new MockDatagramAssociation(1500);
ServerThread serverThread = new ServerThread(serverProtocol, network.getServer());
serverThread.start();
DatagramTransport clientTransport = network.getClient();
clientTransport = new UnreliableDatagramTransport(clientTransport, secureRandom, 0, 0);
clientTransport = new LoggingDatagramTransport(clientTransport, System.out);
MockDTLSClient client = new MockDTLSClient(null);
DTLSTransport dtlsClient = clientProtocol.connect(client, clientTransport);
for (int i = 1; i <= 10; ++i)
{
byte[] data = new byte[i];
Arrays.fill(data, (byte)i);
dtlsClient.send(data, 0, data.length);
}
byte[] buf = new byte[dtlsClient.getReceiveLimit()];
while (dtlsClient.receive(buf, 0, buf.length, 100) >= 0)
{
}
dtlsClient.close();
serverThread.shutdown();
}
static class ServerThread
extends Thread
{
private final DTLSServerProtocol serverProtocol;
private final DatagramTransport serverTransport;
private volatile boolean isShutdown = false;
ServerThread(DTLSServerProtocol serverProtocol, DatagramTransport serverTransport)
{
this.serverProtocol = serverProtocol;
this.serverTransport = serverTransport;
}
public void run()
{
try
{
MockDTLSServer server = new MockDTLSServer();
DTLSTransport dtlsServer = serverProtocol.accept(server, serverTransport);
byte[] buf = new byte[dtlsServer.getReceiveLimit()];
while (!isShutdown)
{
int length = dtlsServer.receive(buf, 0, buf.length, 1000);
if (length >= 0)
{
dtlsServer.send(buf, 0, length);
}
}
dtlsServer.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
void shutdown()
throws InterruptedException
{
if (!isShutdown)
{
isShutdown = true;
this.join();
}
}
}
}
|