tor-browser

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

sframe-transform.html (6131B)


      1 <!doctype html>
      2 <html>
      3    <head>
      4        <meta charset="utf-8">
      5        <script src="/resources/testharness.js"></script>
      6        <script src="/resources/testharnessreport.js"></script>
      7    </head>
      8    <body>
      9        <script>
     10 
     11 promise_test(async (test) => {
     12    const pc = new RTCPeerConnection();
     13    const senderTransform = new SFrameTransform();
     14    const receiverTransform = new SFrameTransform();
     15    const sender1 = pc.addTransceiver('audio').sender;
     16    const sender2 = pc.addTransceiver('video').sender;
     17    const receiver1 = pc.getReceivers()[0];
     18    const receiver2 = pc.getReceivers()[1];
     19 
     20    sender1.transform = senderTransform;
     21    receiver1.transform = receiverTransform;
     22    assert_throws_dom("InvalidStateError", () => sender2.transform = senderTransform);
     23    assert_throws_dom("InvalidStateError", () => receiver2.transform = receiverTransform);
     24 
     25    sender1.transform = senderTransform;
     26    receiver1.transform = receiverTransform;
     27 
     28    sender1.transform = null;
     29    receiver1.transform = null;
     30 }, "Cannot reuse attached transforms");
     31 
     32 test(() => {
     33    const senderTransform = new SFrameTransform();
     34 
     35    assert_true(senderTransform.readable instanceof ReadableStream);
     36    assert_true(senderTransform.writable instanceof WritableStream);
     37 }, "SFrameTransform exposes readable and writable");
     38 
     39 promise_test(async (test) => {
     40    const pc = new RTCPeerConnection();
     41    const senderTransform = new SFrameTransform();
     42    const receiverTransform = new SFrameTransform();
     43    const sender1 = pc.addTransceiver('audio').sender;
     44    const sender2 = pc.addTransceiver('video').sender;
     45    const receiver1 = pc.getReceivers()[0];
     46    const receiver2 = pc.getReceivers()[1];
     47 
     48    assert_false(senderTransform.readable.locked, "sender readable before");
     49    assert_false(senderTransform.writable.locked, "sender writable before");
     50    assert_false(receiverTransform.readable.locked, "receiver readable before");
     51    assert_false(receiverTransform.writable.locked, "receiver writable before");
     52 
     53    sender1.transform = senderTransform;
     54    receiver1.transform = receiverTransform;
     55 
     56    assert_true(senderTransform.readable.locked, "sender readable during");
     57    assert_true(senderTransform.writable.locked, "sender writable during");
     58    assert_true(receiverTransform.readable.locked, "receiver readable during");
     59    assert_true(receiverTransform.writable.locked, "receiver writable during");
     60 
     61    sender1.transform = null;
     62    receiver1.transform = null;
     63 
     64    assert_true(senderTransform.readable.locked, "sender readable after");
     65    assert_true(senderTransform.writable.locked, "sender writable after");
     66    assert_true(receiverTransform.readable.locked, "receiver readable after");
     67    assert_true(receiverTransform.writable.locked, "receiver writable after");
     68 }, "readable/writable are locked when attached and after being attached");
     69 
     70 promise_test(async (test) => {
     71    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
     72 
     73    const senderTransform = new SFrameTransform({ role : 'encrypt', authenticationSize: 10 });
     74    senderTransform.setEncryptionKey(key);
     75 
     76    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
     77    receiverTransform.setEncryptionKey(key);
     78 
     79    const writer = senderTransform.writable.getWriter();
     80    const reader = receiverTransform.readable.getReader();
     81 
     82    senderTransform.readable.pipeTo(receiverTransform.writable);
     83 
     84    const sent = new ArrayBuffer(8);
     85    const view = new Int8Array(sent);
     86    for (let cptr = 0; cptr < sent.byteLength; ++cptr)
     87        view[cptr] = cptr;
     88 
     89    writer.write(sent);
     90    const received = await reader.read();
     91 
     92    assert_equals(received.value.byteLength, 8);
     93    const view2 = new Int8Array(received.value);
     94    for (let cptr = 0; cptr < sent.byteLength; ++cptr)
     95        assert_equals(view2[cptr], view[cptr]);
     96 }, "SFrame with array buffer - authentication size 10");
     97 
     98 promise_test(async (test) => {
     99    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
    100 
    101    const senderTransform = new SFrameTransform({ role : 'encrypt', authenticationSize: 10 });
    102    const senderWriter = senderTransform.writable.getWriter();
    103    const senderReader = senderTransform.readable.getReader();
    104 
    105    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
    106    const receiverWriter = receiverTransform.writable.getWriter();
    107    const receiverReader = receiverTransform.readable.getReader();
    108 
    109    senderTransform.setEncryptionKey(key);
    110    receiverTransform.setEncryptionKey(key);
    111 
    112    const chunk = new ArrayBuffer(8);
    113 
    114    // decryption should fail, leading to an empty array buffer.
    115    await receiverWriter.write(chunk);
    116    let received = await receiverReader.read();
    117    assert_equals(received.value.byteLength, 0);
    118 
    119    // We write again but this time with a chunk we can decrypt.
    120    await senderWriter.write(chunk);
    121    const encrypted = await senderReader.read();
    122    await receiverWriter.write(encrypted.value);
    123    received = await receiverReader.read();
    124    assert_equals(received.value.byteLength, 8);
    125 }, "SFrame decryption with array buffer that is too small");
    126 
    127 promise_test(async (test) => {
    128    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
    129 
    130    const receiverTransform = new SFrameTransform({ role : 'decrypt', authenticationSize: 10 });
    131    const receiverWriter = receiverTransform.writable.getWriter();
    132    receiverTransform.setEncryptionKey(key);
    133 
    134    // decryption should fail, leading to erroring the transform.
    135    await promise_rejects_js(test, TypeError, receiverWriter.write({ }));
    136    await promise_rejects_js(test, TypeError, receiverWriter.closed);
    137 }, "SFrame transform gets errored if trying to process unexpected value types");
    138 
    139        </script>
    140    </body>
    141 </html>