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>