DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (7f9f804e9dbe)

VCS Links

Line Code
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 103 104 105 106 107
<!doctype html>
<meta charset="utf-8">
<title>RTCDtlsTransport.prototype.getRemoteCertificates</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
  'use strict';

  // The following helper functions are called from RTCPeerConnection-helper.js:
  //   exchangeIceCandidates
  //   doSignalingHandshake

  /*
    5.5.  RTCDtlsTransport Interface
      interface RTCDtlsTransport : EventTarget {
        readonly attribute RTCDtlsTransportState state;
        sequence<ArrayBuffer> getRemoteCertificates();
                 attribute EventHandler          onstatechange;
                 attribute EventHandler          onerror;
        ...
      };

      enum RTCDtlsTransportState {
        "new",
        "connecting",
        "connected",
        "closed",
        "failed"
      };

      getRemoteCertificates
        Returns the certificate chain in use by the remote side, with each certificate
        encoded in binary Distinguished Encoding Rules (DER) [X690].
        getRemoteCertificates() will return an empty list prior to selection of the
        remote certificate, which will be completed by the time RTCDtlsTransportState
        transitions to "connected".
   */
  async_test(t => {
    const pc1 = new RTCPeerConnection();
    t.add_cleanup(() => pc1.close());
    const pc2 = new RTCPeerConnection();
    t.add_cleanup(() => pc2.close());

    pc1.createDataChannel('test');
    exchangeIceCandidates(pc1, pc2);

    doSignalingHandshake(pc1, pc2)
    .then(t.step_func(() => {
      // pc.sctp is set when set*Description(answer) is called
      const sctpTransport1 = pc1.sctp;
      const sctpTransport2 = pc2.sctp;

      assert_true(sctpTransport1 instanceof RTCSctpTransport,
        'Expect pc.sctp to be set to valid RTCSctpTransport');

      assert_true(sctpTransport2 instanceof RTCSctpTransport,
        'Expect pc.sctp to be set to valid RTCSctpTransport');

      const dtlsTransport1 = sctpTransport1.transport;
      const dtlsTransport2 = sctpTransport2.transport;

      const testedTransports = new Set();

      // Callback function that test the respective DTLS transports
      // when they become connected.
      const onConnected = t.step_func(dtlsTransport => {
        const certs = dtlsTransport.getRemoteCertificates();

        assert_greater_than(certs.length, 0,
          'Expect DTLS transport to have at least one remote certificate when connected');

        for(const cert of certs) {
          assert_true(cert instanceof ArrayBuffer,
            'Expect certificate elements be instance of ArrayBuffer');
        }

        testedTransports.add(dtlsTransport);

        // End the test if both dtlsTransports are tested.
        if(testedTransports.has(dtlsTransport1) && testedTransports.has(dtlsTransport2)) {
          t.done();
        }
      })

      for(const dtlsTransport of [dtlsTransport1, dtlsTransport2]) {
        if(dtlsTransport.state === 'connected') {
          onConnected(dtlsTransport);
        } else {
          assert_array_equals(dtlsTransport.getRemoteCertificates(), [],
            'Expect DTLS certificates be initially empty until become connected');

          dtlsTransport.addEventListener('statechange', t.step_func(() => {
            if(dtlsTransport.state === 'connected') {
              onConnected(dtlsTransport);
            }
          }));

          dtlsTransport.addEventListener('error', t.step_func(err => {
            assert_unreached(`Unexpected error during DTLS handshake: ${err}`);
          }));
        }
      }
    }));
  });

</script>