tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_tls_server_multiple_clients.js (3268B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 // Need profile dir to store the key / cert
      7 do_get_profile();
      8 // Ensure PSM is initialized
      9 Cc["@mozilla.org/psm;1"].getService(Ci.nsISupports);
     10 
     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);
     17 
     18 function startServer(cert) {
     19  let tlsServer = Cc["@mozilla.org/network/tls-server-socket;1"].createInstance(
     20    Ci.nsITLSServerSocket
     21  );
     22  tlsServer.init(-1, true, -1);
     23  tlsServer.serverCert = cert;
     24 
     25  let input, output;
     26 
     27  let listener = {
     28    onSocketAccepted(socket, transport) {
     29      info("Accept TLS client connection");
     30      let connectionInfo = transport.securityCallbacks.getInterface(
     31        Ci.nsITLSServerConnectionInfo
     32      );
     33      connectionInfo.setSecurityObserver(listener);
     34      input = transport.openInputStream(0, 0, 0);
     35      output = transport.openOutputStream(0, 0, 0);
     36    },
     37    onHandshakeDone() {
     38      info("TLS handshake done");
     39 
     40      input.asyncWait(
     41        {
     42          onInputStreamReady(input1) {
     43            NetUtil.asyncCopy(input1, output);
     44          },
     45        },
     46        0,
     47        0,
     48        Services.tm.currentThread
     49      );
     50    },
     51    onStopListening() {},
     52  };
     53 
     54  tlsServer.setSessionTickets(false);
     55 
     56  tlsServer.asyncListen(listener);
     57 
     58  return tlsServer.port;
     59 }
     60 
     61 function storeCertOverride(port, cert) {
     62  certOverrideService.rememberValidityOverride(
     63    "127.0.0.1",
     64    port,
     65    {},
     66    cert,
     67    true
     68  );
     69 }
     70 
     71 function startClient(port) {
     72  let transport = socketTransportService.createTransport(
     73    ["ssl"],
     74    "127.0.0.1",
     75    port,
     76    null,
     77    null
     78  );
     79  let input;
     80  let output;
     81 
     82  let inputDeferred = Promise.withResolvers();
     83  let outputDeferred = Promise.withResolvers();
     84 
     85  let handler = {
     86    onTransportStatus(transport1, status) {
     87      if (status === Ci.nsISocketTransport.STATUS_CONNECTED_TO) {
     88        output.asyncWait(handler, 0, 0, Services.tm.currentThread);
     89      }
     90    },
     91 
     92    onInputStreamReady(input1) {
     93      try {
     94        let data = NetUtil.readInputStreamToString(input1, input1.available());
     95        equal(data, "HELLO", "Echoed data received");
     96        input1.close();
     97        output.close();
     98        inputDeferred.resolve();
     99      } catch (e) {
    100        inputDeferred.reject(e);
    101      }
    102    },
    103 
    104    onOutputStreamReady(output1) {
    105      try {
    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);
    111      } catch (e) {
    112        outputDeferred.reject(e);
    113      }
    114    },
    115  };
    116 
    117  transport.setEventSink(handler, Services.tm.currentThread);
    118  output = transport.openOutputStream(0, 0, 0);
    119 
    120  return Promise.all([inputDeferred.promise, outputDeferred.promise]);
    121 }
    122 
    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);
    130 });