1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
6 // Need profile dir to store the key / cert
8 // Ensure PSM is initialized
9 Cc
["@mozilla.org/psm;1"].getService(Ci
.nsISupports
);
11 const certOverrideService
= Cc
[
12 "@mozilla.org/security/certoverride;1"
13 ].getService(Ci
.nsICertOverrideService
);
14 const socketTransportService
= Cc
[
15 "@mozilla.org/network/socket-transport-service;1"
16 ].getService(Ci
.nsISocketTransportService
);
18 function startServer(cert
) {
19 let tlsServer
= Cc
["@mozilla.org/network/tls-server-socket;1"].createInstance(
22 tlsServer
.init(-1, true, -1);
23 tlsServer
.serverCert
= cert
;
28 onSocketAccepted(socket
, transport
) {
29 info("Accept TLS client connection");
30 let connectionInfo
= transport
.securityCallbacks
.getInterface(
31 Ci
.nsITLSServerConnectionInfo
33 connectionInfo
.setSecurityObserver(listener
);
34 input
= transport
.openInputStream(0, 0, 0);
35 output
= transport
.openOutputStream(0, 0, 0);
38 info("TLS handshake done");
42 onInputStreamReady(input1
) {
43 NetUtil
.asyncCopy(input1
, output
);
48 Services
.tm
.currentThread
54 tlsServer
.setSessionTickets(false);
56 tlsServer
.asyncListen(listener
);
58 return tlsServer
.port
;
61 function storeCertOverride(port
, cert
) {
62 certOverrideService
.rememberValidityOverride(
71 function startClient(port
) {
72 let transport
= socketTransportService
.createTransport(
82 let inputDeferred
= Promise
.withResolvers();
83 let outputDeferred
= Promise
.withResolvers();
86 onTransportStatus(transport1
, status
) {
87 if (status
=== Ci
.nsISocketTransport
.STATUS_CONNECTED_TO
) {
88 output
.asyncWait(handler
, 0, 0, Services
.tm
.currentThread
);
92 onInputStreamReady(input1
) {
94 let data
= NetUtil
.readInputStreamToString(input1
, input1
.available());
95 equal(data
, "HELLO", "Echoed data received");
98 inputDeferred
.resolve();
100 inputDeferred
.reject(e
);
104 onOutputStreamReady(output1
) {
106 output1
.write("HELLO", 5);
107 info("Output to server written");
108 outputDeferred
.resolve();
109 input
= transport
.openInputStream(0, 0, 0);
110 input
.asyncWait(handler
, 0, 0, Services
.tm
.currentThread
);
112 outputDeferred
.reject(e
);
117 transport
.setEventSink(handler
, Services
.tm
.currentThread
);
118 output
= transport
.openOutputStream(0, 0, 0);
120 return Promise
.all([inputDeferred
.promise
, outputDeferred
.promise
]);
123 add_task(async
function () {
124 let cert
= getTestServerCertificate();
125 ok(!!cert
, "Got self-signed cert");
126 let port
= startServer(cert
);
127 storeCertOverride(port
, cert
);
128 await
startClient(port
);
129 await
startClient(port
);