Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

Context.spec.js 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { Context } from './Context';
  2. import { ratchet, importKey } from './crypto-utils';
  3. /*
  4. function hexdump(buffer) {
  5. const a = new Uint8Array(buffer);
  6. let s = '';
  7. for (let i = 0; i < a.byteLength; i++) {
  8. s += '0x';
  9. s += a[i].toString(16);
  10. s += ' ';
  11. }
  12. return s.trim();
  13. }
  14. */
  15. /* TODO: more tests
  16. * - delta frames
  17. * - frame header is not encrypted
  18. * - different sendCounts
  19. * - different key length
  20. * - ratcheting in decodeFunction
  21. * etc
  22. */
  23. const audioBytes = [ 0xde, 0xad, 0xbe, 0xef ];
  24. const videoBytes = [ 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef ];
  25. describe('E2EE Context', () => {
  26. let sender;
  27. let receiver;
  28. const key = new Uint8Array([
  29. 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  30. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  31. ]);
  32. beforeEach(() => {
  33. sender = new Context('sender');
  34. receiver = new Context('receiver');
  35. });
  36. describe('encode function', () => {
  37. it('with an audio frame', async done => {
  38. const sendController = {
  39. enqueue: encodedFrame => {
  40. const data = new Uint8Array(encodedFrame.data);
  41. // An audio frame will have an overhead of 6 bytes with this counter and key size:
  42. // 4 bytes truncated signature, counter (1 byte) and 1 byte trailer.
  43. expect(data.byteLength).toEqual(audioBytes.length + 6);
  44. // TODO: provide test vector and matcher.
  45. done();
  46. }
  47. };
  48. const frame = {
  49. data: new Uint8Array(audioBytes).buffer,
  50. type: undefined // type is undefined for audio frames.
  51. };
  52. await sender.setKey(key, 0);
  53. await receiver.setKey(key, 0);
  54. await sender.encodeFunction(frame, sendController);
  55. });
  56. it('with a video frame', async done => {
  57. const sendController = {
  58. enqueue: encodedFrame => {
  59. const data = new Uint8Array(encodedFrame.data);
  60. // A video frame will have an overhead of 12 bytes with this counter and key size:
  61. // 10 bytes signature, counter (1 byte) and 1 byte trailer.
  62. expect(data.byteLength).toEqual(videoBytes.length + 12);
  63. // TODO: provide test vector and matcher.
  64. done();
  65. }
  66. };
  67. const frame = {
  68. data: new Uint8Array(videoBytes).buffer,
  69. type: 'key'
  70. };
  71. await sender.setKey(key, 0);
  72. await receiver.setKey(key, 0);
  73. await sender.encodeFunction(frame, sendController);
  74. });
  75. });
  76. describe('end-to-end test', () => {
  77. it('with an audio frame', async done => {
  78. await sender.setKey(key, 0);
  79. await receiver.setKey(key, 0);
  80. const receiveController = {
  81. enqueue: encodedFrame => {
  82. const data = new Uint8Array(encodedFrame.data);
  83. expect(data.byteLength).toEqual(audioBytes.length);
  84. expect(Array.from(data)).toEqual(audioBytes);
  85. done();
  86. }
  87. };
  88. const sendController = {
  89. enqueue: encodedFrame => {
  90. receiver.decodeFunction(encodedFrame, receiveController);
  91. }
  92. };
  93. const frame = {
  94. data: new Uint8Array(audioBytes).buffer,
  95. type: undefined // type is undefined for audio frames.
  96. };
  97. await sender.encodeFunction(frame, sendController);
  98. });
  99. it('with a video frame', async done => {
  100. await sender.setKey(key, 0);
  101. await receiver.setKey(key, 0);
  102. const receiveController = {
  103. enqueue: encodedFrame => {
  104. const data = new Uint8Array(encodedFrame.data);
  105. expect(data.byteLength).toEqual(videoBytes.length);
  106. expect(Array.from(data)).toEqual(videoBytes);
  107. done();
  108. }
  109. };
  110. const sendController = {
  111. enqueue: encodedFrame => {
  112. receiver.decodeFunction(encodedFrame, receiveController);
  113. }
  114. };
  115. const frame = {
  116. data: new Uint8Array(videoBytes).buffer,
  117. type: 'key'
  118. };
  119. await sender.encodeFunction(frame, sendController);
  120. });
  121. it('the receiver ratchets forward', async done => {
  122. await sender.setKey(key, 0);
  123. await receiver.setKey(key, 0);
  124. // Ratchet the key. We reimport from the raw bytes.
  125. const material = await importKey(key);
  126. await sender.setKey(await ratchet(material), 0);
  127. const receiveController = {
  128. enqueue: encodedFrame => {
  129. const data = new Uint8Array(encodedFrame.data);
  130. expect(data.byteLength).toEqual(audioBytes.length);
  131. expect(Array.from(data)).toEqual(audioBytes);
  132. done();
  133. }
  134. };
  135. const sendController = {
  136. enqueue: encodedFrame => {
  137. receiver.decodeFunction(encodedFrame, receiveController);
  138. }
  139. };
  140. const frame = {
  141. data: new Uint8Array(audioBytes).buffer,
  142. type: undefined
  143. };
  144. await sender.encodeFunction(frame, sendController);
  145. });
  146. });
  147. });