package org.spongycastle.crypto.tls.test; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketTimeoutException; import java.security.SecureRandom; import org.spongycastle.crypto.tls.DTLSServerProtocol; import org.spongycastle.crypto.tls.DTLSTransport; import org.spongycastle.crypto.tls.DatagramTransport; import org.spongycastle.crypto.tls.UDPTransport; /** * A simple test designed to conduct a DTLS handshake with an external DTLS client. *

* Please refer to GnuTLSSetup.txt or OpenSSLSetup.txt, and x509-*.pem files in this package for * help configuring an external DTLS client. */ public class DTLSServerTest { public static void main(String[] args) throws Exception { InetAddress address = InetAddress.getLocalHost(); int port = 5556; int mtu = 1500; SecureRandom secureRandom = new SecureRandom(); DTLSServerProtocol serverProtocol = new DTLSServerProtocol(secureRandom); byte[] data = new byte[mtu]; DatagramPacket packet = new DatagramPacket(data, mtu); DatagramSocket socket = new DatagramSocket(port, address); socket.receive(packet); System.out.println("Accepting connection from " + packet.getAddress().getHostAddress() + ":" + port); socket.connect(packet.getAddress(), packet.getPort()); /* * NOTE: For simplicity, and since we don't yet have HelloVerifyRequest support, we just * discard the initial packet, which the client should re-send anyway. */ DatagramTransport transport = new UDPTransport(socket, mtu); // Uncomment to see packets // transport = new LoggingDatagramTransport(transport, System.out); MockDTLSServer server = new MockDTLSServer(); DTLSTransport dtlsServer = serverProtocol.accept(server, transport); byte[] buf = new byte[dtlsServer.getReceiveLimit()]; while (!socket.isClosed()) { try { int length = dtlsServer.receive(buf, 0, buf.length, 60000); if (length >= 0) { System.out.write(buf, 0, length); dtlsServer.send(buf, 0, length); } } catch (SocketTimeoutException ste) { } } dtlsServer.close(); } }